如何在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;
            }
    }

Answers:


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
同上@RCCola return代替使用rewrite。查看文档
JCotton 2013年

问题,如何订购服务器块?的redirect,则main server块或main server块,则redirect?因为我有同样的问题,所以stackoverflow.com/questions/35451929/…–
jhnferraris

提到的问题中的Nginx config是正确的,顺序无关紧要。
德米特里·韦霍图洛夫'16

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重写模块安装了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重定向”在Google上的热门话题。如果您来到这里只是想重定向一个位置:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.