如何在NGINX中重定向URL

Ama*_*r S 134 redirect nginx url-rewriting

我需要将每个http://test.com请求重定向到http://www.test.com.如何才能做到这一点.

在服务器块中我尝试添加

 rewrite ^/(.*) http://www.test.com/$1 permanent;
Run Code Online (Sandbox Code Playgroud)

但它在浏览器中说

  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.
Run Code Online (Sandbox Code Playgroud)

我的服务器块看起来像

 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;
            }
    }
Run Code Online (Sandbox Code Playgroud)

Dmi*_*rov 270

做你想做的最好的方法是添加另一个服务器块:

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;
}
Run Code Online (Sandbox Code Playgroud)

并编辑主服务器块server_name变量,如下所示:

server_name  www.test.com;
Run Code Online (Sandbox Code Playgroud)

重要提示:新server区块是正确的方法,if是邪恶的.您必须使用位置和服务器,而不是在if可能的情况下使用.Rewrite有时也是邪恶的,所以换成它return.

  • 您也可以使用`return 301 http://wwww.test.com$request_uri;`而不是重写来结束该服务器块. (19认同)
  • 同上@RCCola使用`return`而不是`rewrite`.见[docs](http://wiki.nginx.org/Pitfalls#Taxing_Rewrites) (6认同)
  • 只是一个快速警告:注意`301`重定向与`302`.您可能会遇到缓存的永久重定向,这使得更改已经访问过URL的客户端的设置非常麻烦.(我知道OP要求"301",但要确保这真的是你想要的.) (4认同)

Dam*_*ski 16

与此处的另一个答案类似,但将重写中的http更改为$ scheme,如下所示:

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)

并编辑主服务器块server_name变量,如下所示:

server_name  www.test.com;
Run Code Online (Sandbox Code Playgroud)

我必须这样做才能将www.test.com重定向到test.com.


Ama*_*r S 9

首先确保已使用HTTP重写模块安装了Nginx.要安装它,我们需要有pcre-library

如何安装pcre库

如果上面提到的或者你已经有了它们,那么只需在你的nginx服务器块中添加以下代码即可

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

从您可以使用的每个请求中删除www

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

所以你的服务器块看起来像

  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;
            }
    }
Run Code Online (Sandbox Code Playgroud)


Sep*_*eed 6

这是 Google 上“nginx 重定向”的热门话题。如果您来到这里只是想重定向一个位置:

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}
Run Code Online (Sandbox Code Playgroud)