我注意到使用.NET MVC站点,您可以使用多个正斜杠命中URL,例如:
http://www.example.com//category
http://www.example.com//category//product
网址加载正常,一切正常,但是,我被要求阻止这种情况发生。
我一直在尝试使用IIS URL重写来使其正常工作:
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{UNENCODED_URL}" matchType="Pattern" pattern="^(.*)//(.*)$" />
</conditions>
<action type="Redirect" redirectType="Permanent" url="{C:1}/{C:2}" />
</rule>
</rules>
</rewrite>
然而,结果似乎非常有气质。有时产品URL会重定向,有时它不会和类别一样。这几乎就像应用程序正在缓存URL一样。
有没有人知道我是否可以禁用任何已实施的缓存,或者是否有其他方法可以解决此多重斜杠问题?
非常感谢任何帮助。
答案 0 :(得分:6)
最后,我使用重定向后面的代码来使其正常工作。
我使用IIS URL重写的问题是由于IIS缓存重定向的方式。当我完全禁用缓存时,正如WouterH建议的那样,它起作用了。但是,我不习惯以这种方式禁用缓存,因为它可能会引入性能问题。
我的解决方法是在Global.asax.cs文件中使用重定向后面的代码:
protected void Application_BeginRequest(object sender, EventArgs e)
{
string requestUrl = Request.ServerVariables["REQUEST_URI"];
string rewriteUrl = Request.ServerVariables["UNENCODED_URL"];
if (rewriteUrl.Contains("//") && !requestUrl.Contains("//"))
Response.RedirectPermanent(requestUrl);
}
我本来希望使用IIS URL Rewrite来实现这一点,不幸的是我还没有时间继续沿着这条线运行。
有趣的是,下面的方法确实有效,但是HTTP_X_REWRITE_URL
是由Helicon ISAPI Rewrite添加的,我在本地运行,但在我们的生产服务器上不可用。
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="{REQUEST_URI}" />
<conditions>
<add input="{HTTP_X_REWRITE_URL}" pattern="([^/]*)/{2,}([^/]*)" />
</conditions>
</rule>
</rules>
</rewrite>
答案 1 :(得分:3)
网址重写模块
由于IIS使用双斜线自动规范化网址,您可以尝试重定向到规范化的网址,如下所示:
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="{REQUEST_URI}" />
<conditions>
<add input="{UNENCODED_URL}" pattern="(.*?)[/]{2,}$" />
</conditions>
</rule>
</rules>
</rewrite>
您也可以尝试disable caching of the URL rewrite module:
禁用重写规则的内部缓存
在URL重写模块运行中禁用入站重写规则的缓存 来自提升的命令提示符的以下命令:
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Rewrite /v RewriteCacheEnabled /t REG_DWORD /d 0
我有一种小感觉,你必须在这次改变后重新启动网络服务器:)
其他选项#1:不可缓存的服务器变量
这个想法刚刚浮现在我脑海中:
在规则中使用不可缓存的服务器变量,f.e。试试HTTP_USER_AGENT
<rewrite>
<rules>
<rule name="Remove multiple slashes" stopProcessing="true">
<match url=".*" />
<action type="Redirect" url="{REQUEST_URI}" />
<conditions>
<add input="{UNENCODED_URL}" pattern="(.*?)[/]{2,}$" />
<add input="{HTTP_USER_AGENT}" pattern=".*" />
</conditions>
</rule>
</rules>
</rewrite>
您可以浏览其他服务器变量here
其他选项#2:清除浏览器缓存
在网站开发过程中,请确保使用Ctrl + F5刷新页面,或在更新重写规则等更改后清除浏览器缓存。否则,只需浏览器,您就可以花费数小时观看同一问题需要刷新缓存。
其他选项#3:IIRF
如果您真的无法使用IIS URL重写模块,您可以尝试使用开源ISAPI模块IIRF。它接受类似于Apache的mod_rewrite
的规则。