2013-08-12 2 views
2

У меня есть веб-сайт в IIS с устаревшим классическим приложением asp, настроенным как вспомогательное приложение.Server.MapPath() с модулем перезаписи URL-адреса IIS 2.0

Я в основном пытаюсь создать правила перезаписи URL, чтобы мне не пришлось изменять все относительные URL-адреса в коде.

например. URLS, такие как "/темы/somedirectory" должны быть сопоставлены с "/унаследованных/темы/somedirectory"

Использование URL Rewrite Module 2.0 У меня есть правило URL переписывания настроен следующим образом:

<rule name="Reroute themes"> 
    <match url="^themes.*" /> 
    <action type="Rewrite" url="/legacy/{R:0}" /> 
</rule> 

Этот отлично работает при навигации по URL-адресу. Однако при использовании Server.MapPath() он не применяет правило перезаписи.

Действительно ли Server.MapPath() действительно должен учитывать это? Если нет, то как мне перейти на повторную маршрутизацию приложения без изменения кода?

ответ

1

У меня была эта проблема, и теперь я собираюсь создать специальный вариант MapPath, который соответствует моему правилу перезаписи.

Так что либо что-то вроде этого:

string MapTheme(string themeName) 
{ 
    return Path.Combine(Server.MapPath("/legacy"), themeName) 
} 

Или, если вы предпочитаете:

string MapThemePath(string themeUrl) 
{ 
    Match m = Regex.Match("^themes/(.*)"); 
    if (!m.Success) 
     throw new ArgumentException(); 
    string themeName = m.Groups[1].Value; 
    return Path.Combine(Server.MapPath("/legacy"), themeName) 
} 

Или обобщают:

string MyMapPath(string url) 
{ 
    Match m = Regex.Match("^themes/(.*)"); 
    if (m.Success) 
    { 
     string themeName = m.Groups[1].Value; 
     return Path.Combine(Server.MapPath("/legacy"), themeName) 
    } 
    else if (itsAnotherSpecialRewriteCase) 
    { 
     return doSomeSimilarTransformation(); 
    } 
    // ... 
    else 
    { 
     // Handle non-rewritten URLs 
     return Server.MapPath(url); 
    } 
} 

Я не особенно нравится это, потому что это нарушает «не повторяйте себя».

+0

Мы закончили делать что-то подобное, проложив все MapPaths в оболочку, которая выполнила необходимые перенаправления. –

2

Я искал одно и то же, поэтому я попробовал тестовое приложение. Похоже, что Server.MapPath()не признает Правила перезаписи URL-адреса URL.

Вот как я тестировал с помощью пустого веб-проекта (Razor синтаксис):

Rewrite правило:

<system.webServer> 
    <rewrite> 
     <rules> 
      <rule name="Rewrite rule1 for test1"> 
       <match url="^test1(.*)" /> 
       <action type="Rewrite" url="{R:1}" appendQueryString="true" /> 
      </rule> 
     </rules> 
    </rewrite> 
</system.webServer> 

cshtml:

<p> 
    The URL for this page is @Request.Url.AbsoluteUri . 
    <br /> 
    MapPath of /test1 is @Server.MapPath("~/test1") 
    <br /> 
    MapPath of/is @Server.MapPath("~/") 
</p> 

Я ударил http://localhost/, затем http://localhost/test1. Результаты были:

The URL for this page is http://localhost/ . 
MapPath of /test1 is c:\src\temp\test1 
MapPath of/is c:\src\temp\ 

Так выглядит MapPath в основном принимает System.AppDomain.CurrentDomain.BaseDirectory (или что-то подобное) и его сочетания с относительной URL. На стороне примечание, я отдельно подтвердил, что MapPath() учитывает 1 уровень виртуального каталога, но не 2-й (т. Е. Virt, указывающий на другое местоположение, которое также имеет определенный virt).

+1

Спасибо за подтверждение. Вы пришли к решению, которое ответит на вторую часть моего вопроса? –

Смежные вопросы