删除多个正斜杠

时间:2012-08-17 10:39:04

标签: iis url-rewriting rewrite

我注意到使用.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一样。

有没有人知道我是否可以禁用任何已实施的缓存,或者是否有其他方法可以解决此多重斜杠问题?

非常感谢任何帮助。

2 个答案:

答案 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的规则。