我有两种重定向选项(返回和重写),但我不确定对于性能、搜索引擎优化等推荐哪个选项:
## 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 的正确语法。
小智 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)