Redirect 如何在Nginx中重定向URL

Redirect 如何在Nginx中重定向URL,redirect,nginx,url-rewriting,Redirect,Nginx,Url Rewriting,我需要将每个请求重定向到。如何做到这一点 在服务器块中,我尝试添加 rewrite ^/(.*) http://www.test.com/$1 permanent; 但在浏览器中,它说 页面未正确重定向 Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求 我的服务器块看起来像 server { listen 80; server_name test.com; client_max_b

我需要将每个请求重定向到。如何做到这一点

在服务器块中,我尝试添加

rewrite ^/(.*) http://www.test.com/$1 permanent;
但在浏览器中,它说

页面未正确重定向

Firefox检测到服务器正在以一种永远无法完成的方式重定向对此地址的请求

我的服务器块看起来像

 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;
            }
    }

首先确保您已经安装了带有HTTP重写模块的Nginx。要安装它,我们需要有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;
            }
    }

执行所需操作的最佳方法是添加另一个服务器块:

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  www.test.com;
server_name  www.test.com;

重要提示:新建
服务器
块是执行此操作的正确方法。如果可能的话,您必须使用位置和服务器,而不是
Rewrite
有时是,因此将其替换为
return

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

server {
        listen 80;
        server_name test.com;
        rewrite     ^ $scheme://www.test.com$request_uri? permanent;
}
并编辑主服务器块服务器名称变量,如下所示:

server_name  www.test.com;
server_name  www.test.com;

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

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

location = /content/unique-page-name {
  return 301 /new-name/unique-page-name;
}

您还可以使用
return301结束该服务器块http://wwww.test.com$request_uri
而不是rewrite。同上@RCCola on,使用
return
而不是
rewrite
。请参阅问题,服务器块应如何排序?
重定向
然后是
主服务器
块或
主服务器
块,然后是
重定向
?因为我也有同样的问题,前面提到的Nginx配置是正确的,顺序并不重要。只是一个简单的警告:小心
301
重定向与
302
。您可能会被缓存的永久重定向卡住,这使得更改已访问URL的客户端的设置非常麻烦。(我知道OP要求的是
301
,但请确保这是您真正想要的。)官方文档位于:Quick and easy:)