生效位置
rewrite 可以写在 server 、 location、 if 配置段内
格式
rewrite regex replacement [flag]
regex是匹配的正则表达式。
只会处理$request_uri部分,不会匹配$host
replacement 是跳转的URI。
可以以http:// 或者https:// 开头, 也可以省掉$host 直接写$request_uri部分。
这部分支持变量。
flag 是控制uri行为的,可写可不写。
有break(中止)、last、redict(302临时重定向)、permanent(301永久重定向)。
用户浏览器访问俩个重定向效果一致。对于搜索引擎和爬虫,301更有利于SEO(搜索引擎优化)
http://和https:// 开头的flag部分建议使用permanent
uri不变,转换域名的用法:
location / {
rewrite /(.*) http://www.baidu.com/$1 permanent ;
}
( )括起来的部分 在后面用 $n 调用,$1 表示第一个括号内容,$2 表示第二个括号内容。
location / {
rewrite /.* http://www.baidu.com$request_uri permanent;
}
这里replacement部分使用了变量
server {
listen 80;
server_name www.baidu.coml;
root /tmp/abc.com;
index index.html;
rewrite /(.*) /abc/$1 redirect;
}
这样写,每次把uri改写后又会被server识别一次,导致陷入循环,
比如一开始www.baidu.com/a66 会变成 www.baidu.com/abc/abc/abc/.../abc/abc/a66
nginx 最大的 rewrite 次数是 50 次,最终是会停下来,但是离我们要的结果差太远了。
对于免得陷入循环
解决方法一:
rewrite /(.*) /abc/$1 break;
加上break,改写一次自动停止。
解决办法二:
if ($request_uri !~ '^/abc/')
{
rewrite /(.*) /abc/$1 redirect;
}
当不匹配 /abc/ 开头的uri的时候才进入rewrite ,这种写法比较明确。
直接curl只能看到301的状态
curl -I 看标头,有跳转后的地址记录
curl -L —— 会进行跳转后继续访问。
因为每次都能进入到 location / 中,可能导致不断循环发生。
这里只是重复访问了50次。
如果有多层目录结构,还会发生循环嵌套。
这里直接flag部分加break的方法可以只控制跳一次,但也不完美。
因为location / 作为入口,如果用户就是要访问 $host/www/test666 时候,会被迫访问到 $host/www/www/test666 ,因为无可奈何都要加一次。如果要控制,这需要用 if 来加以判断,不以www开头的时候,再进行跳转。
如此则只会跳转一次