带有IIS URL的Server.MapPath()重写模块2.0

时间:2013-08-12 09:44:01

标签: iis asp-classic url-rewriting server.mappath

我在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()实际上应该考虑到这一点吗?如果没有,我应该如何在不修改代码的情况下重新路由应用程序?

2 个答案:

答案 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;。