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]
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]
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
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/
Try this:
merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;
There might be multiple redirects for slashes > 3 or multiple groups of slashes.
I speak from experience of running multiple production servers and dev servers for a team. Do not do this in nginx. Instead, use your router within your application server (JS/PHP etc).
Nginx is not reliable for substantive work. For example, redirects, rewrites, and if clauses are non-deterministic if you change your setup to use SSL, a reverse proxy, hidden ports, and so on. So you may get it working correctly in one environment, but it could be impossible to get working in another.
Stick to a proper programming language for solving problems, even as simple as merging double slashes. You'll thank me later.
URL example.com//dir1////dir2///dir3 and more Try this it's working for me
merge_slashes off; location ~ ^(.*?)//+(.*?)$ { return 301 $1/$2; }