IIS Url 重写模块:获取 ApplicationPath

IIS Url Rewrite Module: Get ApplicationPath

提问人:Victor Mukherjee 提问时间:1/29/2016 最后编辑:Victor Mukherjee 更新时间:12/19/2017 访问量:1657

问:

我正在寻找一种方法来重写 url,以防 url 中的应用程序路径具有不同的大小写。由于应用程序路径可能因不同的部署而异,因此我需要动态访问它。有什么办法吗?

背景:

我正在将cookie的路径设置为应用程序路径。由于 cookie 路径区分大小写,我需要重写 url,以防它们大小写错误。我还希望有不需要使用 url 重写模块的替代方法。

假设对于一个部署,应用程序的别名为“ApplicationA”(对于另一个部署,别名可能是“ApplicationB”)。

http://<host>:<port>/<applicationA or Applicationa or APPLicationA etc.>/<rest of the url>

Redirect to 

http://<host>:<port>/ApplicationA/<rest of the url>
C# asp.net IIS url-rewrite-module

评论

0赞 Victor Mukherjee 1/29/2016
@NikolaiDante请参阅编辑。
0赞 NikolaiDante 1/29/2016
规则是它总是以大写字母开头和结尾,但中间应该是小写的吗?
0赞 Victor Mukherjee 1/29/2016
不可以,别名可以是 [A-Za-z0-9]+,并且仅当 url 的此别名部分大小写不同时才应进行重写。
0赞 Asons 2/3/2016
我建议停止打扰/在 url 上使用大小写,并且只是小写保存/读取所有传入请求的 cookie,您的问题应该消失了吗?
0赞 Victor Mukherjee 2/3/2016
@LGSon是的,这是一种解决方法。但它会有性能损失,因为会有很多重定向。它是一个旧版应用程序,因此更改应用程序中的单个 URL 是不可行的。

答:

0赞 Uriil 2/2/2016 #1

不确定REWRITE在您的情况下是否是正确的操作,也许您应该使用REDIRECT(permanent),但以下是允许我在特定情况下获取应用程序名称的规则:

<system.webServer>
    <rewrite>
        <rules>
            <rule name="My Rule" stopProcessing="true">
                <match url="^(.+)" ignoreCase="false" />
                <conditions>
                    <add input="{REQUEST_URI}" pattern="TmP/.+" ignoreCase="false" negate="true" />
                    <add input="{REQUEST_URI}" pattern="tmp/(.+)" ignoreCase="true" />
                </conditions>
                <action type="Redirect" url="TmP/{C:1}" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

评论

0赞 Victor Mukherjee 2/2/2016
因此,如果 Web 应用程序的虚拟路径是“TmP”,那么它才会起作用,对吧?
0赞 Uriil 2/2/2016
是的,其他方面,它将重定向到 TmP
0赞 Vignesh Pandi 2/8/2016 #2

我认为创建和添加自定义 Http 模块可以解决您的问题。每个请求都会调用一个 HTTP 模块来响应 和 事件。BeginRequestEndRequest

您可以动态访问 URL 并通过更改其大小写来重定向它。

private void PreRequestHandlerExecute(object sender, EventArgs e)
    {
        HttpApplication app = sender as HttpApplication;
        var f = req.Url;
        f="Change case of URL";
        if (condition)
        {

            app.Response.Redirect(f);
        }

    }
0赞 Asons 2/9/2016 #3

更新

我建议您使用 HTTPModule 订阅该活动。BeginRequest

使用该方法,您将获得速度,如果大小写错误,您只需匹配并重写 url,...或者实际上只是调整外壳可能比先检查它然后调整(在选择解决方案之前测试并查看)更快。RewritePathRedirect

一个积极的副作用是,你可以很容易地进行其他测试并进行例外等。

public class AdjustCasingModule : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += OnBeginRequest;
    }

    protected void BeginRequest(object sender, EventArgs e)
    {
        var httpContext = ((HttpApplication)sender).Context;

        string[] path = httpContext.Request.Path.Split('/');

        if (path[1].Length > 0)
        {
            Regex rgx = new Regex(@"^[A-Z][a-z]*[A-Z]");

            if (!rgx.IsMatch(path[1]))
            {
                char[] a = path[1].ToLower().ToCharArray();
                a[0] = char.ToUpper(a[0]);
                a[char.Length - 1] = char.ToUpper(a[char.Length - 1]);
                path[1] = new string(a);
                httpContext.RewritePath(String.Join('/', path));
            }
        }
    }

    public void Dispose()
    {

    }
}

旁注:

我仍然建议首先使用小写路径。

0赞 Jeff Mergler 12/19/2017 #4

只是一个想法,如果有人考虑放弃驼峰大小写符号 (ApplicationA) 而转而使用强制表示法,例如小写字母* (applicationa),您可以使用 ToLower 关键字,如下所示。

<system.webServer>
    <rewrite>
        <rules>
            <rule name="force lowercase" stopProcessing="true">
                <match url="(.*)" />
                <conditions>
                    <add input="{URL}" pattern="[A-Z]" ignoreCase="false" />
                </conditions>
                <action type="Redirect" url="{ToLower:{URL}}" redirectType="Temporary" />
            </rule>
        </rules>
    </rewrite>
</system.webServer>

*如果您致力于在 url 中使用原始的 camelCase 表示法,那么我会遵循上面 Uriil 的方法。