如何设置 Nginx 301 重定向

一般来说,有下面几种常用的 Nginx 重定向。有 www 或 非www 重定向、单个页面重定向、整个目录重定向以及全站重定向。接下来,我们分别来看看这几种重定向该如何设置。

非www 跳转到 www


server {
listen 80;
server_name domain.com;
rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}

www 跳转到 非www


server {
listen 80;
server_name www.domain.com;
rewrite ^/(.*)$ http://domain.com/$1 permanent;
}

单个页面 301 重定向


server {
...
if ( $request_filename ~ 旧页面名称/ ) {
rewrite ^ http://www.domain.com/新页面名称/? permanent;
...
}

目录 301 重定向


server {
...
if ( $request_filename ~ 旧目录名称/.+ ) {
rewrite ^(.*) http://www.domain.com/新目录名称/$1 permanent;
...
}

旧域名重定向到新域名


server {
...
server_name www.old-name.com old-name.com;
return 301 $scheme://www.new-name.com$request_uri;
...
}

注意:

  • 因为 $request_uri 表示包含域名后面的 URL 部分,所以这种重写方式只用于新旧域名的页面可以一一对应的情况;
  • 比如 www.new-name.com/about.htmlwww.old-name.com/about.html 域名后面的 URL 部分相同,都是 about.html
  • 如果已经重构了网站,那么去掉 $request_uri,将所有旧域名的请求重定向到新域名主页会更好一些,代码如下:

server {
...
server_name www.old-name.com old-name.com;
return 301 $scheme://www.new-name.com;
...
}

return 和 rewrite 区别

  • 有些教程中会将上述的 "旧域名 301 重定向到新域名" 设置中的 return 写成 rewrite ^,但一般不推荐这种方法。
  • 因为相比 return 来说,rewrite 比较低效,它需要 Nginx 先处理正则匹配(符号 ^ 会匹配完整的初始 URL);
  • 另外,return 命令也更便于理解。return 301 相比 rewrite ^ ... permanent 会更加清楚的显示 Nginx 返回 301 状态码。

server {
...
server_name www.old-name.com old-name.com;
rewrite ^ $scheme://www.new-name.com$request_uri permanent;
...
}

Drop solitude!