【问题标题】:How to redirect a URL in Nginx如何在 Nginx 中重定向 URL
【发布时间】:2012-05-04 21:17:41
【问题描述】:

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

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

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

【问题讨论】:

标签: redirect nginx url-rewriting


【解决方案1】:

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

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 is evil。如果可能,您必须使用位置和服务器而不是 ifRewrite 有时是 evil too,所以将其替换为 return

【讨论】:

  • 你也可以用return 301 http://wwww.test.com$request_uri;结束那个服务器块而不是重写。
  • 同上@RCCola 使用return 而不是rewrite。见docs
  • 问题,服务器块应该如何排序? redirect 然后是 main server 块或 main server 块然后是 redirect?因为我也有同样的问题,stackoverflow.com/questions/35451929/…
  • 上述问题中的 Nginx 配置是正确的,顺序无关紧要。
  • 只是一个快速警告:注意301 重定向与302。您可能会被缓存的永久重定向卡住,这使得更改已访问 URL 的客户端的设置非常麻烦。 (我知道 OP 要求提供 301,但请确保这确实是您想要的。)
【解决方案2】:

与此处的另一个答案类似,但将重写中的 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。

【讨论】:

    【解决方案3】:

    首先确保您已经安装了带有 HTTP 重写模块的 Nginx。要安装它,我们需要 pcre-library

    How to install pcre library

    如果上面提到的已经完成或者如果你已经拥有它们,那么只需在你的 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;
                }
        }
    

    【讨论】:

      【解决方案4】:

      这是“nginx 重定向”在 Google 上的热门搜索。如果您只是想重定向一个位置:

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

      【讨论】:

        猜你喜欢
        • 2013-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-25
        • 1970-01-01
        • 2016-06-01
        • 2016-04-29
        • 1970-01-01
        相关资源
        最近更新 更多