Мне нужно скопировать следующие правила переписывания Apache в конфигурации Nginx на Ubuntu 12.04. Что такое nginx эквивалентно:
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
Я хотел бы предложить этот подход:
# 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;
}
Он использует поведение по умолчанию nginx - объединение слешей, поэтому нам не нужно заменять слеш, мы просто перенаправляем
Я нашел ответ KWO не работает. Глядя на мой журнал отладки, вот что происходит:
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"
Я обнаружил, что это работает для меня:
if ($request_uri ~* "\/\/") {
rewrite ^/(.*) $scheme://$host/$1 permanent;
}
Ссылка: http://rosslawley.co.uk/archive/old/2010/01/10/nginx-how-to-url-cleaning-removing/
Попробуй это:
merge_slashes off;
rewrite (.*)//+(.*) $1/$2 permanent;
Для слешей> 3 может быть несколько перенаправлений или несколько групп слешей.
URL example.com//dir1////dir2///dir3 и др. Попробуйте, это работает для меня
merge_slashes off; местоположение ~ ^(.*?)//+(.*?)$ {return 301 $ 1/$ 2; }