2

我在 IIS 中有一个网站,将旧版经典 asp 应用程序配置为子应用程序。

我基本上是在尝试创建 URL 重写规则,这样我就不必更改代码中的所有相对 URL。

例如,诸如“ /themes/somedirectory ”之类的 URL 应该映射到“ /legacy/themes/somedirectory

使用URL 重写模块 2.0我有一个 URL 重写规则配置如下:

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

这在导航到 URL 时工作正常。但是,在使用时Server.MapPath(),它不应用重写规则。

Server.MapPath()实际上应该考虑到这一点吗?如果没有,我应该如何在不修改代码的情况下重新路由应用程序?

4

2 回答 2

2

我一直在寻找同样的东西,所以我在一个测试应用程序中试了一下。似乎Server.MapPath() 不承认URL 重写模块规则。

以下是我使用空 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 的位置)。

于 2014-03-13T21:13:33.330 回答
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);
    }
}

我不是特别喜欢这个,因为它违反了“不要重复自己”。

于 2014-03-26T16:51:57.520 回答