9

我注意到,使用 .NET MVC 站点,您可以使用多个正斜杠点击 URL,例如:

http://www.example.com//category
http://www.example.com//category//product

URL 加载正常,一切正常,但是,我被要求阻止这种情况发生。

我一直在尝试使用 IIS URL Rewrites 来让它工作:

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

有谁知道我是否可以禁用任何现有的缓存,或者是否有另一种方法来解决这个多斜杠问题?

任何帮助深表感谢。

4

3 回答 3

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>
于 2012-08-22T13:59:00.907 回答
3

URL重写模块

由于 IIS 使用双斜杠自动规范化 url,您可以尝试重定向到规范化的 url,如下所示:

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

您还可以尝试禁用 URL 重写模块的缓存

禁用重写规则的内部缓存

要在 URL 重写模块中禁用入站重写规则的缓存,请从提升的命令提示符运行以下命令:

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Rewrite /v RewriteCacheEnabled /t REG_DWORD /d 0

我有一种小小的感觉,在此更改之后您必须重新启动网络服务器 :)

其他选项 #1:不可缓存的服务器变量

脑子里突然冒出这个想法:

在规则中使用不可缓存的服务器变量,fe 尝试使用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>

您可以在此处探索其他服务器变量

其他选项#2:清除浏览器缓存

在 Web 开发期间,请确保使用 Ctrl+F5 刷新页面,或在进行更新重写规则等更改后清除浏览器缓存。否则,您可能会花费数小时观察相同的问题,而只是您的浏览器需要刷新其缓存。

其他选项#3:IIRF

如果你真的不能让它与 IIS URL 重写模块一起工作,你可以试试开源的 ISAPI 模块IIRF 。它接受类似于mod_rewriteApache 的规则。

于 2012-08-17T11:29:15.057 回答
0

尝试关注

    <rule name="RemoveMultipleSlashes" patternSyntax="ECMAScript" stopProcessing="true">
        <match url=".*" />
        <action type="Redirect" url="{REQUEST_URI}" />
        <conditions>
            <add input="{UNENCODED_URL}" pattern="([^/]*)/{2,}([^/]*)" />
        </conditions>
    </rule>
于 2012-08-17T11:43:49.810 回答