Nginx 重定向和重写

Posted by Sunday on 2017-10-13

nginx 重定向、单个页面重定向、整个目录重定向以及全站重定向

非www跳转到www

1
2
3
4
5
6
7
server {
listen 80;
server_name domain.com www.domain.com;
if ($server_name != "www.domain.com") {
rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}
}

单个页面301 重定向

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

目录 301 重定向

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

检查文件不存在跳转

1
2
3
4
5
server {
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
}

旧域名重定向到新域名

1
2
3
4
5
6
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,将所有旧域名的请求重定向到新域名主页会更好一些,代码如下:
    1
    2
    3
    4
    5
    6
    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 状态码。
1
2
3
4
5
6
server {
...
server_name www.old-name.com old-name.com;
rewrite ^ $scheme://www.new-name.com$request_uri permanent;
...
}

11
https://www.nginx.com/resources/wiki/start/topics/tutorials/config_pitfalls/#
https://muzi.me/story/22/