IIS URL 重写模块:获取应用程序路径
本文关键字:获取 应用程序 路径 模块 URL 重写 IIS | 更新日期: 2023-09-27 18:32:28
我正在寻找一种重写 url 的方法,以防 url 中的应用程序路径具有不同的大小写。由于应用程序路径可能因不同的部署而异,因此我需要动态访问它。有什么办法吗?
背景:
我正在将 cookie 的路径设置为应用程序路径。由于 cookie 路径区分大小写,我需要重写 url 以防它们大小写错误。我还想有不需要使用 url 重写模块的替代方法。
例
假设对于一个部署,应用程序的别名是"应用程序A"(对于另一个部署,别名可能是"应用程序 B")。
http://<host>:<port>/<applicationA or Applicationa or APPLicationA etc.>/<rest of the url>
Redirect to
http://<host>:<port>/ApplicationA/<rest of the url>
不确定在您的情况下重写是否正确操作,也许您应该使用重定向(永久),但以下是允许我在特定情况下获取应用程序名称的规则:
<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>
已更新
我可以建议你使用HTTPModule订阅BeginRequest
事件。
使用RewritePath
方法,您将获得对抗Redirect
的速度,如果大小写错误,您只需匹配并重写 url,...或者实际上只是调整外壳可能比先检查然后调整(在选择解决方案之前进行测试并查看)更快。
一个积极的副作用是你可以很容易地进行其他测试并进行例外等。
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()
{
}
}
旁注:
我仍然建议首先使用小写路径。
创建和添加自定义 Http 模块可以解决您的问题。在每个请求上调用一个 HTTP 模块以响应BeginRequest
和EndRequest
事件。
您可以动态访问 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);
}
}
只是一个想法,如果考虑放弃驼峰大小写符号(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 中的原始驼峰大小写法,那么我会遵循上述 Uriil 的方法。