9

I need to replicate the following Apache rewrite rules in Nginx config on Ubuntu 12.04. What is the nginx equivalent to :

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
  • Whoever found this online and tries to copy-paste the suggested answers, beware if you're using a Virtualbox setup with custom ports. I had to change it to be e.g. rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent; where 4321 is the external port of the Virtualbox'd nginx my browser connects to. – aexl Nov 20 '17 at 21:53
5

I'd like to suggest this approach:

# remove multiple sequences of forward slashes
# rewrite URI has duplicate slashes already removed by Nginx (merge_slashes on), just need to rewrite back to current location
# note: the use of "^[^?]*?" avoids matches in querystring portion which would cause an infinite redirect loop
if ($request_uri ~ "^[^?]*?//") {
rewrite "^" $scheme://$host$uri permanent;
}

It uses the default behaviour of nginx — merging of slashes, so we do not need to replace slashes, we simply redirecting

found here

2

I found kwo's response to not work. Looking at my debug log, this is what happens:

2014/08/18 15:51:04 [debug] 16361#0: *1 http script regex: "(.*)//+(.*)"
2014/08/18 15:51:04 [notice] 16361#0: *1 "(.*)//+(.*)" does not match "/contact-us/", client: 59.167.230.186, server: *.domain.edu, request: "GET //////contact-us//// HTTP/1.1", host: 
"test.domain.edu"

I found this worked for me:

if ($request_uri ~* "\/\/") {
  rewrite ^/(.*)      $scheme://$host/$1    permanent;
}

Ref: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/

  • Reference link is what you need to check. Correct solution is in there. I will try to edit the answer. – Anup Nair Apr 30 '18 at 7:36
0

Try this:

merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;

There might be multiple redirects for slashes > 3 or multiple groups of slashes.

  • 'merge_slashes off' made no difference and resulted in no change. – Anup Nair Apr 30 '18 at 7:34
-1

URL example.com//dir1////dir2///dir3 and more Try this it's working for me

merge_slashes off; location ~ ^(.*?)//+(.*?)$ { return 301 $1/$2; }

protected by JakeGould Jan 25 at 11:40

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.