iis 删除多个正斜杠

x9ybnkn6  于 2023-04-21  发布在  其他
关注(0)|答案(4)|浏览(156)

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

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

URL加载正常,一切正常,但是,我被要求阻止这种情况发生。
我一直在尝试使用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被应用程序缓存一样。
有谁知道我是否可以禁用任何缓存,或者是否有其他方法来解决这个多斜杠问题?
任何帮助都非常感谢。

nkhmeac6

nkhmeac61#

最后,我不得不使用重定向背后的代码来让它工作。
我使用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重写来完成这个工作,不幸的是我没有时间继续下去。
有趣的是,下面的方法确实有效,但是,HTTP_X_REWRITE_URL是由我在本地运行的Helicon ISAPI重写添加的,但在我们的生产服务器上不可用。

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

yftpprvb2#

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>

您也可以尝试disable caching of the URL rewrite module

关闭重写规则内部缓存

要在URL重写模块中禁用入站重写规则的缓存,请从提升的命令提示符运行以下命令:
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\InetStp\Rewrite /v RewriteCacheEnabled /t REG_DWORD /d 0
我有一个小的感觉,你将不得不重新启动Web服务器后,这一变化:)

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

这个想法突然出现在我的脑海里:

  • 在规则中使用不可缓存的服务器变量,例如,尝试使用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:清除浏览器缓存

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

其他选项#3:IIRF

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

yc0p9oo0

yc0p9oo03#

试着跟随

<rule name="RemoveMultipleSlashes" patternSyntax="ECMAScript" stopProcessing="true">
        <match url=".*" />
        <action type="Redirect" url="{REQUEST_URI}" />
        <conditions>
            <add input="{UNENCODED_URL}" pattern="([^/]*)/{2,}([^/]*)" />
        </conditions>
    </rule>
mznpcxlj

mznpcxlj4#

我们可以在web.config文件中使用下面的IIS重写规则。我已经从Google搜索控制台中解决了这个问题,并使用下面的代码永久修复了它。
下面的代码将删除URL中的任何地方的双斜杠。

<rewrite>
  <rules>
    <rule name="RemoveDoubleSlash" patternSyntax="ECMAScript" stopProcessing="true">
        <match url="(.*)" />
        <action type="Redirect" url="{C:1}/{C:2}" />
        <conditions>
            <add input="{UNENCODED_URL}" pattern="(.*)//(.*)" />
        </conditions>
    </rule>
  </rules>
</rewrite>

相关问题