NGINX에서 URL을 리디렉션하는 방법


135

모든 http://test.com 요청을 http://www.test.com 으로 리디렉션해야합니다 . 어떻게 할 수 있습니까?

서버 블록에서 추가를 시도했습니다.

 rewrite ^/(.*) http://www.test.com/$1 permanent;

하지만 브라우저에서는

  The page isn't redirecting properly

  Firefox has detected that the server is redirecting the request for 
  this address in a way that will never complete.

내 서버 블록은

 server {
            listen       80;
            server_name  test.com;
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            #rewrite ^/(.*) http://www.test.com/$1 permanent;
            #rewrite ^(.*)$ $scheme://www.test.com$1;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

공식 문서는 다음과 같습니다 : nginx.org/en/docs/http/converting_rewrite_rules.html
Marcello Nuccio

답변:


274

원하는 것을 수행하는 가장 좋은 방법은 다른 서버 블록을 추가하는 것입니다.

server {
        #implemented by default, change if you need different ip or port
        #listen *:80 | *:8000;
        server_name test.com;
        return 301 $scheme://www.test.com$request_uri;
}

기본 서버 블록 server_name 변수를 다음과 같이 편집하십시오.

server_name  www.test.com;

중요 : 새로운 server블록이 올바른 방법이며, if사악 합니다. if가능하면 위치와 서버를 사용해야 합니다. Rewrite때로는 너무 악 , 그래서 그것을 대체 return.


19
return 301 http://wwww.test.com$request_uri;다시 쓰기 대신 해당 서버 블록을 종료 할 수도 있습니다 .
RCCola

6
return대신 @RCCola를 사용하십시오 rewrite. 문서
JCotton

질문, 서버 블록은 어떻게 주문해야합니까? redirect다음 main server블록 또는 main server블록 다음 redirect? 저도 같은 문제를 가지고 있기 때문에, stackoverflow.com/questions/35451929/...는
jhnferraris

언급 된 질문의 Nginx 구성이 정확하며 순서는 중요하지 않습니다.
Dmitry Verhoturov

4
간단한 경고 : 301리디렉션과 를 조심 하십시오 302. 캐시 된 영구 리디렉션으로 인해 URL에 이미 액세스 한 클라이언트의 설정을 변경하는 것이 매우 번거로울 수 있습니다. (OP가 요청한 것을 알고 301있지만 실제로 원하는 것이 맞는지 확인하십시오.)
Nick Merrill

16

여기에 다른 답변과 비슷하지만 다시 쓰기에서 http를 $ scheme으로 변경하십시오.

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}

기본 서버 블록 server_name 변수를 다음과 같이 편집하십시오.

server_name  www.test.com;

www.test.com을 test.com으로 리디렉션하려면이 작업을 수행해야합니다.


9

먼저 HTTP rewrite 모듈과 함께 Nginx를 설치했는지 확인하십시오. 이것을 설치하려면 pcre-library가 필요합니다

pcre 라이브러리를 설치하는 방법

위에서 언급했거나 이미 가지고 있다면 nginx 서버 블록에 아래 코드를 추가하십시오.

  if ($host !~* ^www\.) {
    rewrite ^(.*)$ http://www.$host$1 permanent;
  }

당신이 사용할 수있는 모든 요청에서 www를 제거하려면

  if ($host = 'www.your_domain.com' ) {
   rewrite  ^/(.*)$  http://your_domain.com/$1  permanent;
  }

서버 블록은 다음과 같습니다

  server {
            listen       80;
            server_name  test.com;
            if ($host !~* ^www\.) {
                    rewrite ^(.*)$ http://www.$host$1 permanent;
            }
            client_max_body_size   10M;
            client_body_buffer_size   128k;

            root       /home/test/test/public;
            passenger_enabled on;
            rails_env production;

            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                    root   html;
            }
    }

3

이것은 "nginx redirect"에 대한 Google의 인기입니다. 여기에 단일 위치를 리디렉션하려는 경우 :

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.