我在IIS中有一个网站,其中传统的经典asp应用程序配置为子应用程序。
我基本上尝试创建网址重写规则,以便我不必更改代码中的所有相对网址。
e.g。 URL'" / themes / somedirectory "应该映射到" / legacy / themes / 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()
实际上应该考虑到这一点吗?如果没有,我应该如何在不修改代码的情况下重新路由应用程序?
答案 0 :(得分:2)
我一直在寻找相同的东西,所以我在测试应用程序中尝试了一下。 Server.MapPath()
似乎不承认网址重写模块规则。
以下是我使用空Web项目(Razor语法)进行测试的方法:
重写规则:
<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 :(得分: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);
}
}
我不是特别喜欢这个,因为它违反了#34;不要重复自己&#34;。