rewrite规则
格式:rewrite regex replaceent [flag]
1)rewrite配置可以在server 、location以及if配置段内生效
2)regex是用于匹配URI的正则表达式,其不会匹配到$host(域名)
3)replaceemt是目标跳转的URI,可以以http://或者https://开头,也可以省略$host,直接写$request_uri部分(即请求的链接)
4)flag是用来设置rewrite对URI的处理能力,其中有break、 last 、rediect 、permanent,其中break和last在前面已经介绍过。rediect和permanent的区别在于,前者为临时重定向(302),后者是永久重定向(301),对于用户通过浏览器访问,这2者的效果是一致的。但是对于搜索引擎蜘蛛爬虫来说就有区别了,使用301更有利于SEO。所以建议replacement是以http://或者https://开头的flag使用permanent。
示例1
location / {
rewrite /(.*) http://www.test.com/$1 permanent;
}
说明:.*为正则表达式,用()括起来,在后面的URI中可以调用它,第一次出现的()用$1调用,第二次出现的()用$2调用,以此类推
示例2
location / {
rewrite /.* http://www.test.com$request_uri permanent;
}
说明:在replacement中,支持变量,这里的$request_uri就是客户端请求的链接
示例3
server{
listen 80;
server_name www.123.com;
root /tmp/123.com;
index index.html;
rewrite /(.*) /abc/$1 redirct;
}
说明:本例中的rewrite规则有问题,会造成连续循环,nginx有个最大50次限制,最终会失败,解决该问题有以下2个方案
方案1
serve{
listen 80;
server_name www.123.com;
root /tmp/123.com
index index.html;
rewrite /(.*) /abc/$1 break;
}
说明:在rewrite中使用break,会避免循环
方案2
server{
listen 80;
server_name www.123.com;
root /tmp/123.com;
index index.html;
if ($request_uri !~ '^/abc/')
{
rewrite /(.*) /abc/$1 redirect;
}
}
说明:加一个条件限制,也可以避免产生循环