引言
某业务需要添加 nginx rewrite rules,之前只是偶尔看过,现在有必要系统学习下。记录如下。
学习材料来自于 nginx.com 的技术博客文章。
Creating NGINX Rewrite Rules
创建 Nginx Rewrite Rules
(PS:有点懒,详细内容说明,直接去看原文吧。。。)
1 比较 return, rewrite, try_files 指令
1.1 return 指令
1.2 rewrite 指令
1.3 try_files 指令
2 示例:标准化域名
2.1 将旧域名重定向到新域名
2.2 增加或移除 www 前缀
2.3 重定向所有的流量到正确的域名
3 示例:强制所有请求使用 SSL/TLS
4 示例:为 WordPress 网站启用友好的固定链接
5 示例:丢弃不支持的文件类型请求
6 示例:配置自定义的重编路由
学习实践过程中遇到的问题
1 示例有不能正确工作
- 如下配置,我在实践中测试不出来,花了很长时间,本以为自己的问题,但在测试中始终不能成功。
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
将上面的 rewrite rules 改写成如下,就能正常工作了。
rewrite ^(/download/.*)/media/(.*)$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)$ $1/mp3/$2.ra last;
- 使用文章的配置增加 www 前缀,提示此网页包含重定向循环,解决方法是需要先判断 host 主机名 如下:
server_name jaminzhang.me;
if ($host != 'www.jaminzhang.me') {
return 301 $scheme://www.jaminzhang.me$request_uri;
#rewrite ^(.*)$ $scheme://www.jaminzhang.me$1 permanent; # 不推荐 rewrite,文章说 rewrite 的效率要比 return 低
}
2 nginx 配置文件不熟悉
下面示例配置中的 return 指令中的 www.new-name.com 新域名的配置必须要存在,一开始测试时我没有配置,提示“此网页包含重定向循环”,
(这个是 301 跳转,Ref 文章[Nginx控制域名301跳转出现”此网页包含重定向循环”]中使用 rewrite 指定解决的,
其实上面的文章中说了不推荐 rewrite 来解决,因为 rewrite 的效率要比 return 低。)
然后配置了一个配置文件,还是不生效,依旧提示“此网页包含重定向循环”,
经排查发现在 nginx.conf 主配置文件中并没有 include www.new-name.com 对应的配置文件,
我还以为默认会 include nginx/conf.d 目录下的所有 conf 文件呢。于是加上 include 指令,就可以测试成功了。
server { listen 80; listen 443 ssl; server_name www.old-name.com old-name.com; return 301 $scheme://www.new-name.com$request_uri; }
Ref
Creating NGINX Rewrite Rules
Nginx 配置 location 总结及 rewrite 规则写法
用 include 指令实现 Nginx 多虚拟主机配置
Nginx 301 重定向规则
Nginx 控制域名 301 跳转出现”此网页包含重定向循环”
Nginx 301重定向域名