Reputation: 6154
I am using the following htaccess rul to remove double or more slashes from web urls:
#remove double/more slashes in url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
This is working fine for slashes occured in the middle of uris, such as, If use url:
http://demo.codesamplez.com/html5//audio
Its being redirected to proper single slahs url:
http://demo.codesamplez.com/html5/audio
But if the url contains double slashes in the beginning, JUST AFTER the domain name, then there its not working, example:
http://demo.codesamplez.com//html5/audio
its not being redirected.
How I can fix the above rule to work for this type of urls as well? Thanks.
Upvotes: 22
Views: 42660
Reputation: 1
Im having issues with // in requests so have used -
RewriteCond %{REQUEST_URI} ^(.)/{2,}(.)$ RewriteRule (.*) %1/%2
It tests correctly and does give a result changing the // to / but the destination page whilst served does not render correctly depending on the // position.
EG - https://www.brickfieldspark.org//data/greaterwaterboatman.htm renders correctly but - https://www.brickfieldspark.org/data//greaterwaterboatman.htm does not render -
I believe the served page image links - <a href="../images - are being mangled in some way ??, IE "jump back one level and go to images" is corrupted by the position of the //
Upvotes: 0
Reputation: 1
Remove several slashes at once
RewriteCond %{REQUEST_METHOD} GET
RewriteCond %{THE_REQUEST} (\s/{2,}.*)|(\s/.+//.*)
RewriteRule (.*) $1 [QSA,R=301,L]
Upvotes: 0
Reputation: 363
Here is a slight variation that I have found works better when you have one .htaccess file and many subdirectories:
# Remove multiple slashes anywhere in url
# rule 1: Remove multiple leading slashes directly after the domain name
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# rule 2: Remove multiple slashes anywhere in the rest of the path
RewriteCond %{THE_REQUEST} \s/+(.*?)/{2,}([^\s]*)
RewriteRule ^ %1/%2 [R=301,L,NE]
Upvotes: 0
Reputation: 900
The situation is simple to resolve using a tasty slice of .htaccess. All you need to do is copy the following code and your site’s root .htaccess
file:
<IfModule mod_rewrite.c>
RewriteBase /
# Rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# Rule 2: remove multiple slashes in the requested path
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
Rule 1: {THE_REQUEST}
contains something like GET /index.html HTTP/1.1
Hence, if we match the first whitespace (\s)
followed by multiple slashes (/{2,})
, we can access the correct URL without the leading double slash via $1
.
Rule 2: The regular expression ^(.*)/{2,}(.*)$
splits the request URI on multiple slashes. %1/%2
then combines the two splitted strings again, but with only one slash at this time.
So for example, this directive will redirect as follows:
https://www.meysmahdavi.com// redirects to https://www.meysmahdavi.com/ https://www.meysmahdavi.com//blog-post/ redirects to https://www.meysmahdavi.com/blog-post/ https://www.meysmahdavi.com//path/directory/ redirects to https://www.meysmahdavi.com/path/directory/
So basically it removes the double slashes from any URL.
Source From: https://www.meysmahdavi.com/
Upvotes: 2
Reputation: 11
Just put the below code to your .htaccess file. it will remove multiple slash from anywhere . at the end of url and in from middle of url.
<IfModule mod_rewrite.c>
RewriteBase /`enter code here`
RewriteCond %{THE_REQUEST} \s[^?]*//
RewriteRule ^.*$ /$0 [R=302,L,NE]
#Remove slash anywhere from url
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
# Rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# Rule 2: remove multiple slashes in the requested path`enter code here`
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
Upvotes: 0
Reputation: 207
As per this link, following code should take care of extra slashes(anywhere) in URL.
RewriteCond %{THE_REQUEST} //
RewriteRule ^.*$ $0 [R=302,L,NE]
Upvotes: 8
Reputation: 4192
For me, the following rules work perfectly:
<IfModule mod_rewrite.c>
RewriteBase /
# rule 1: remove multiple leading slashes (directly after the TLD)
RewriteCond %{THE_REQUEST} \s/{2,}
RewriteRule (.*) $1 [R=301,L]
# rule 2: remove multiple slashes in the requested path
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule (.*) %1/%2 [R=301,L]
</IfModule>
The idea is heavily based on Marcels answer (thanks!), but this one is a bit more lightweight and includes the RewriteBase
, which may be helpful if you work with specific subdirectory structures. Additionally, Marcels answer lacks explanation, which I wanted to fix:
Rule 1: {THE_REQUEST}
contains something like GET /index.html HTTP/1.1
(see docs). Hence, if we match the first whitespace (\s
) followed by multiple slashes (/{2,}
), we can access the correct URL without the leading double slash via $1
.
Rule 2: The regular expression ^(.*)/{2,}(.*)$
splits the request URI on multiple slashes. %1/%2
then combines the two splitted strings again, but with only one slash at this time.
Upvotes: 8
Reputation: 17205
To prevent long repetition of characters in your url such as:
http://demo.codesamplez.com/html5///////////////////////////////////////////audio
you can do:
RewriteCond %{REQUEST_METHOD} !=POST
RewriteCond %{REQUEST_URI} ^(.*?)(/{2,})(.*)$
RewriteRule . %1/%3 [R=301,L]
It should works with :
http://demo.codesamplez.com//html5/audio
see also: .htaccess - how to remove repeated characters from url?
Upvotes: 3
Reputation: 1288
Give it a try with:
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/{2,} [NC]
RewriteRule ^(.*) $1 [R=301,L]
It should redirect to a single slash at the end of the domain. And an improvement on yours:
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
RewriteRule . %1/%2 [R=301,L]
Upvotes: 21