nginx rewrite遇到的简单问题
2016-11-23 本文已影响204人
zhou
引子:
将 http://www.test.com/?top
重定向到 http://www.testtop.com/
遇到的问题:
立即想到的解决办法就是nginx配置文件中增加下面的配置:
rewrite ^/\?top$ http://www.testtop.com/ redirect;
但重启nginx后,访问http://www.test.com/?top
没有重定向到新页面。
那么nginx配置肯定出问题了,google后得到下面几个知识点。
知识点
rewrite的语法先列下:
rewrite regex replacement [flag]
-
1.rewrite的正则是不匹配query string的,即rewrite只针对请求url中问号(?)之前的部分进行重写。
问号之后的是请求参数,在nginx用全局变量$query_string表示。 -
2.nginx会默认在重定向地址后面加上query_string,如果不想加上query_string,可以在rewrite地址的末尾添加一个问号(?)
解决方法
在nginx配置文件中添加下面的配置:
if ( $request_uri ~ "/\?top$" ) {
rewrite ^(.*)$ http://www.testtop.com/? redirect;
}
rewrite的flag参数
- last 表示完成rewrite,终止执行后面的rewrite指令,并且重写后的url会重新从server走一遍
- break 终止执行后面的rewrite指令
- redirect 返回302临时重定向,浏览器地址栏会显示跳转后的地址
- permanent 返回301永久重定向,浏览器地址栏会显示跳转后的地址
全局参数
- $request_uri 包含请求参数的原始uri
- $args 保存了query_string的值,同$query_string
- $arg_PARARAMTER 保存了query_string具体参数的值,比如
?name=zhou
,$arg_name变量的值就是'zhou'
另一个重定向
将http://www.test.com/article?tid=12345
重定向到http://www.test.com/article/123456
可以使用如下配置:
rewrite ^/article$ /article/$arg_tid? ;