nginx的Rewrite指令详解
介绍
# 指令语法:
rewrite regex replacement [flag];
关键字 正则 替代内容 flag标记
# 默认值:none
# 应用位置:server、location、if
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记。下面是一个简单的URL Rewrite跳转的例子:
rewrite ^/(.*) http://www.etiantian.org/$1 permanent;
# 在上述指令中,rewrite为固定关键字,表示开启一条rewrite匹配规则,
# regex部分是^/(.*),这是一个正则表达式,匹配所有,
# 匹配成功后跳转到http://www.etiantian.org/$1,这里的$1是取前面regex部分()里的内容,
# 结尾permanent;表示永久301重定向标记,
# 即跳转到后面的http://www.etiantian.org/$1地址上。
flag标记说明
- last:
- 执行本条 rewrite 后,终止当前 location 内的后续 rewrite/return
- 内部 URI 重写:基于重写后的 URI,在当前 server 块内重新匹配所有 location,最终由匹配到的 location 处理请求。
- 外部 URL(完整 URL,如 http://example.com/xxx):Nginx 返回 302 临时重定向 给客户端,浏览器向新地址发起请求。
- break:
- 执行本条 rewrite 后,终止当前 location 内所有 rewrite/return,
- 不会重新匹配任何 location,直接在当前 location 块继续执行后续非 rewrite 指令(如 proxy_pass、root 等)。
- 外部 URL:同样返回 302 临时重定向 给客户端,浏览器向新地址发起请求。
- redirect: 返回 302 临时重定向,客户端会向新地址重新发起请求,浏览器地址栏显示跳转后的 URL。可用于外部跳转或内部 URI 跳转。
- permanent: 返回 301 永久重定向,客户端会缓存跳转关系,后续请求直接访问新地址,浏览器地址栏显示跳转后的 URL。可用于外部跳转或内部 URI 跳转。
测试实践
# 实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/zqf.html。
# 外部跳转时使用这种方法,浏览器地址会变为跳转后的地址,另外,要事先设置http://www.etiantian.org/blog/zqf.html 有结果输出,不然会出现401等权限错误。
# 跳转前http://blog.etiantian.org对应站点的配置如下:
cat /etc/nginx/conf.d/blog.etiantian.org.conf
server {
listen 80;
server_name blog.etiantian.org;
if ( $http_host ~* "^(.*).etiantian.org$") {
set $domain $1;
rewrite ^(.*) http://www.etiantian.org/$domain/zqf.html break;
}
}
# 跳转后http://www.etiantian.org/blog/zqf.html地址对应的站点配置如下:
cat /etc/nginx/conf.d/www.etiantian.org.conf
server {
listen 80;
server_name www.etiantian.org;
root /data/www;
location / {
index index.html;
}
}
mkdir /data/www/blog
echo "I am zqf" >/data/www/blog/zqf.html
nginx -t
nginx -s reload
curl http://blog.etiantian.org -L
I am zqf