Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove multiple forward slashes

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.example.com//category//product

The URL loads fine and everything works, however, I've been asked to stop this from happening.

I've been trying to use IIS URL Rewrites to get it working:

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

However, the results seem very temperamental. Sometimes the product URL will redirect, sometimes it won't and the same thing happens with the category. It's almost like the URL is being cached by the application.

Does anyone know if I can disable any caching that's in place, or if there is another way to get around this multiple slash issue?

Any help is much appreciated.

like image 427
Dan Ellis Avatar asked Aug 17 '12 10:08

Dan Ellis


People also ask

How do you get rid of the double slash in URL?

Removing other slashes Remember to replace the http://example.com/ with your own domain! That will remove double slashes that may appear after the first part of the request string. Here are some examples: http://example.com/blog-post// redirects to http://example.com/blog-post/

How do you get rid of a double slash in Java?

replaceAll("//", "/");

What does double back slash mean?

Double Backslashes (\\) Two backslashes are used as a prefix to a server name (hostname). For example, \\a5\c\expenses is the path to the EXPENSES folder on the C: drive on server A5. See UNC, \\, path and forward slash.


2 Answers

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>
like image 51
Dan Ellis Avatar answered Sep 21 '22 16:09

Dan Ellis


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.

like image 24
huysentruitw Avatar answered Sep 23 '22 16:09

huysentruitw