nginx가 제공하는 URL에서 이중 슬래시를 제거하는 방법은 무엇입니까?


9

Ubuntu 12.04의 Nginx 구성에서 다음 Apache 다시 쓰기 규칙을 복제해야합니다. nginx는 다음과 같습니다.

RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]


온라인에서이를 발견하고 제안 된 답변을 복사하여 붙여 넣으 려는 사람은 사용자 지정 포트와 함께 Virtualbox 설정을 사용하는 경우 주의하십시오 . 예를 들어 4321 이 브라우저가 연결하는 Virtualbox의 nginx의 외부 포트 인 rewrite (.*)//+(.*) $scheme://$host:4321$1/$2 permanent;위치 로 변경해야했습니다 .
aexl

답변:


6

이 접근법을 제안하고 싶습니다.

# 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의 기본 동작 인 슬래시 병합을 사용하므로 슬래시를 교체 할 필요가 없으며 단순히 리디렉션 만합니다.

여기에서 발견



nginx를 통해 리버스 프록시로 사용하는 경우 certbot을 통한 SSL에서는 작동하지 않습니다. proxy_pass
Jonathan

3

작동하지 않는 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/


참조 링크는 확인해야합니다. 올바른 해결책이 있습니다. 답을 편집하려고합니다.
Anup Nair

1

이 시도:

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

슬래시> 3 또는 여러 그룹의 슬래시에 대한 리디렉션이 여러 개있을 수 있습니다.


'merge_slashes off'는 차이가 없었으며 변경되지 않았습니다.
Anup Nair

1
왜 작동하지 merge_slashes on;않습니까? nginx는 버그가 있습니까?
Jonathan

1
@Jonathan-방금 이것도 발견했습니다. 내 이해는 merge_slashes on당신이 생각하는 것을 하지 않는 것입니다. 기본적으로 nginx에 // 및 / 및 ///를 단일 슬래시로 사용하도록 지시합니다 (자체로 병합 및 리디렉션하지 않음)
Andrew Newby

1

팀을 위해 여러 개의 프로덕션 서버와 개발 서버를 실행 한 경험에 대해 이야기합니다. nginx에서는이 작업을 수행하지 마십시오. 대신 응용 프로그램 서버 (JS / PHP 등) 내에서 라우터를 사용하십시오.

Nginx는 실질적인 작업에 신뢰할 수 없습니다. 예를 들어 ifSSL, 리버스 프록시, 숨겨진 포트 등을 사용하도록 설정을 변경하면 리디렉션, 다시 쓰기 및 절이 결정적이지 않습니다. 따라서 한 환경에서는 올바르게 작동하지만 다른 환경에서는 작동하지 못할 수 있습니다.

이중 슬래시를 병합하는 것만 큼 간단하지만 문제를 해결하기 위해 적절한 프로그래밍 언어를 고수하십시오. 나중에 고마워


귀하의 의견에 동의하지만, 사람들에게 문제에 대한 의견을 제시 할 수있는 옵션을 제공해야한다고 생각합니다. 나는 당신과 같은 이유로 Apache를 Nginx보다 선호합니다. Apache mod_rewrite도 간단한 프로그래밍 언어로 간주 될 수 있습니다. :-)
peterh


-1

URL example.com//dir1////dir2///dir3 및 더 시도해보십시오.

merge_slash off; 위치 ~ ^ (. *?) // + (. *?) $ {return 301 $ 1 / $ 2; }

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.