Nginx - 重写或返回重定向?

HTF*_*HTF 22 linux nginx

我有两种重定向选项(返回和重写),但我不确定对于性能、搜索引擎优化等推荐哪个选项:

## Redirect from non-www to www
server {
        server_name example.com;
        # Option 1
        return 301 $scheme://$host$request_uri;

        # Option 2
        rewrite ^ http://$host$request_uri? permanent;
    }

## Default server config

server {
        ...
        listen      192.168.1.1:80 default_server;
        root        /www;
        server_name www.example.com;
Run Code Online (Sandbox Code Playgroud)

选项 2 似乎适用于 curl,但在浏览器调用时它不会重定向,并且返回代码是临时重定向的代码,尽管重写指令设置为permanent

 curl -I example.com
 HTTP/1.1 302 Moved Temporarily
 Server: nginx
 ...
 Location: http://www.example.com/
 ...
Run Code Online (Sandbox Code Playgroud)

Gna*_*foz 21

您的选择 1:

return 301 $scheme://$host$request_uri;
Run Code Online (Sandbox Code Playgroud)

正是你想要的。

不知道为什么该rewrite ^ http://$host$request_uri? permanent;行会导致 302 而不是 301。这是强制它返回 301 的正确语法。

  • 这可能会在一个单独的问题中得到更好的处理。听起来你的软件(wordpress)和 nginx 都在做一些重定向,导致循环。 (2认同)

小智 7

从技术上讲,您可以同时使用这两个选项。他们可以工作。

根据NGINX 文档如果可以,请使用return。它更简单、更快,因为 NGINX 停止处理请求(并且不必处理正则表达式)。不仅如此,您还可以指定3xx系列中的代码:

return (301 | 302 | 303 | 307) url;
Run Code Online (Sandbox Code Playgroud)

如果您需要使用正则表达式验证 URL 或需要捕获原始 URL 中的元素(显然不在相应的 NGINX 变量中),那么您应该使用rewrite. 您必须知道rewrite仅返回代码 301 或 302。

rewrite regex URL [flag];
Run Code Online (Sandbox Code Playgroud)

您可以在 NGINX 网站上阅读有关返回重写的更多信息。