Remove multiple forward slashes

前端 未结 3 1920
遥遥无期
遥遥无期 2021-01-12 19:33

I\'ve noticed that with .NET MVC sites, you\'re able to hit URLs with multiple forward slashes, for example:

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


        
相关标签:
3条回答
  • 2021-01-12 19:50

    Try following

        <rule name="RemoveMultipleSlashes" patternSyntax="ECMAScript" stopProcessing="true">
            <match url=".*" />
            <action type="Redirect" url="{REQUEST_URI}" />
            <conditions>
                <add input="{UNENCODED_URL}" pattern="([^/]*)/{2,}([^/]*)" />
            </conditions>
        </rule>
    
    0 讨论(0)
  • 2021-01-12 19:51

    In the end, I have resorted to using a code behind redirect to get it working.

    The issues I was having using the IIS URL Rewrites was due to the way IIS caches the redirects. When I disabled caching completely, as WouterH suggested, it worked. However, I'm not comfortable disabling caching in this way as it could introduce performance issues.

    My fix was to use a code behind redirect in the Global.asax.cs file:

    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);
    }
    

    I would have liked to use IIS URL Rewrite to get this working, unfortunately I didn't have the time to continue down that line.

    Interestingly, the below method did work, however, the HTTP_X_REWRITE_URL is added by the Helicon ISAPI Rewrite which I'm running locally, but is not available on our production server.

    <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>
    
    0 讨论(0)
  • 2021-01-12 20:05

    URL Rewrite Module

    As IIS automatically normalizes url's with double slashes, you can try to redirect to the normalized url like this:

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

    You can also try to disable caching of the URL rewrite module:

    Disabling internal caching of rewrite rules

    To disable caching of inbound rewrite rules in URL Rewrite Module run the following command from an elevated command prompt:

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

    I have a small feeling that you'll have to restart the webserver after this change :)

    Other option #1: non-cacheable server variable

    This idea just popped into my mind:

    use a non-cacheable server variable in the rule, f.e. try with 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>
    

    You can explore other server variables here

    Other option #2: clear browser cache

    During web development, make sure you use Ctrl+F5 to refresh your page, or clear your browser cache after making changes like updating rewrite rules etc. Otherwise you can spend hours of watching to the same problem while it was just your browser that needed to refresh its cache.

    Other option #3: IIRF

    If you really can't get it to work with the IIS URL Rewrite Module, you can give the open-source ISAPI module IIRF a try. It accepts rules similar to mod_rewrite for Apache.

    0 讨论(0)
提交回复
热议问题