nginx 대소 문자 구분 재 작성


15

내 nginx 리디렉션을 최대한 깨끗하게하려고합니다. ~ *는 대소 문자를 구분하지 않지만 예제 2에서만 작동하도록 이해할 수 있습니다.

실시 예 1

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

예 2-이 방법은 작동하지만 위의 줄만큼 효율적이지 않습니다.

if ( $request_filename ~* foobar ) {
         rewrite ^ http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
   }

너무 번거롭지 않고 예제 1로 대소 문자를 구분하지 않는 리디렉션을 수행하는 방법이 있습니까?

감사.

답변:


10

나는 방금이 같은 문제를 겪었고 (고정) 대답을 찾으려고 노력했다. nginx 문서 ( http://nginx.org/en/docs/http/ngx_http_rewrite_module.html )는 ~ *가 if 문 내에서만 작동한다고 분명히 밝히지 않았지만 분명히 그 경우입니다.

if 문 외부에서 ngnix URL 다시 쓰기에 대해 대소 문자를 구분하지 않는 정규 표현식 일치를 얻으려면 Apache / Perl 스타일을 사용해야했습니다.

rewrite "(?i)foobar" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

http://perldoc.perl.org/perlretut.html (무감각 검색)을 참조 하십시오 . 또한 특정 캡처 그룹 외부의 접두사 (? i)를 사용하면 전체 검색 문자열에 적용됩니다. 참고 : 이것은 "^"이 암시 된 것으로 보이므로 "^ (? i) foobar"에서는 작동하지 않는 것 같습니다.

그래도 확실하게하고 나중에 다시 쓰기를 유지하기가 쉽고 유지 관리가 쉽고 모호하지 않게하려면 다음과 같이하십시오.

location /foobar {
     rewrite "(?i)" http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;
}

도움이 되었기를 바랍니다...


30

내가이 일을하기 위해 찾은 것 :

rewrite ^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

이 작업 만하면됩니다 :

rewrite (?i)^/foobar http://www.youtube.com/watch?v=oHg5SJYRHA0 redirect;

이것은 단지 선행 (? i)을 의미하고 그렇지 않으면 모든 것이 일치하도록 동일합니다.


4
이것이 정답입니다.
thekingoftruth

2
감사합니다. Nginx 문서에서는 매우 간단하지만 찾기가 어렵습니다. 간결한 포인터에 감사드립니다!
PKHunter

1

지금 웹 사이트에서 작업하면 이것이 잘 작동하는 것으로 나타났습니다. 같은 상황에 처한 사람들에게는 지난 몇 시간 동안있었습니다.

location ~* ^/foobar {
  rewrite ^(.*)$ $scheme://$http_host/whatever/foobar redirect;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.