Ubuntu 12.04의 Nginx 구성에서 다음 Apache 다시 쓰기 규칙을 복제해야합니다. nginx는 다음과 같습니다.
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;
위치 로 변경해야했습니다 .
Ubuntu 12.04의 Nginx 구성에서 다음 Apache 다시 쓰기 규칙을 복제해야합니다. nginx는 다음과 같습니다.
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;
위치 로 변경해야했습니다 .
답변:
이 접근법을 제안하고 싶습니다.
# 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의 기본 동작 인 슬래시 병합을 사용하므로 슬래시를 교체 할 필요가 없으며 단순히 리디렉션 만합니다.
proxy_pass
작동하지 않는 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 또는 여러 그룹의 슬래시에 대한 리디렉션이 여러 개있을 수 있습니다.
merge_slashes on;
않습니까? nginx는 버그가 있습니까?
merge_slashes on
당신이 생각하는 것을 하지 않는 것입니다. 기본적으로 nginx에 // 및 / 및 ///를 단일 슬래시로 사용하도록 지시합니다 (자체로 병합 및 리디렉션하지 않음)
팀을 위해 여러 개의 프로덕션 서버와 개발 서버를 실행 한 경험에 대해 이야기합니다. nginx에서는이 작업을 수행하지 마십시오. 대신 응용 프로그램 서버 (JS / PHP 등) 내에서 라우터를 사용하십시오.
Nginx는 실질적인 작업에 신뢰할 수 없습니다. 예를 들어 if
SSL, 리버스 프록시, 숨겨진 포트 등을 사용하도록 설정을 변경하면 리디렉션, 다시 쓰기 및 절이 결정적이지 않습니다. 따라서 한 환경에서는 올바르게 작동하지만 다른 환경에서는 작동하지 못할 수 있습니다.
이중 슬래시를 병합하는 것만 큼 간단하지만 문제를 해결하기 위해 적절한 프로그래밍 언어를 고수하십시오. 나중에 고마워
나는이 솔루션을 좋아한다 :
if ($request_uri ~ "//") {
return 301 $uri;
}