IIS URL重写模块:获取ApplicationPath

时间:2016-01-29 09:35:26

标签: c# asp.net iis url-rewrite-module

我正在寻找一种方法来重写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>

4 个答案:

答案 0 :(得分:0)

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

<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>

答案 1 :(得分:0)

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

您可以动态访问该网址,并通过更改其大小写重定向该网址。

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);
        }

    }

答案 2 :(得分:0)

<强>更新

我建议您使用HTTPModule订阅BeginRequest事件。

使用RewritePath方法,您可以快速对抗Redirect,如果外壳错误,您只需匹配并重写网址,或者实际上只是调整外壳可能比首先检查然后调整(在选择解决方案之前测试并查看)。

一个积极的副作用是你可以轻松地进行其他测试并做出例外等。

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()
    {

    }
}

旁注:

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

答案 3 :(得分:0)

只是想一想,如果考虑放弃使用驼峰案例表示法(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>

*如果您在网址中承诺使用原始的camelCase表示法,那么我将遵循Uriil的方法。