地址重写可以达到目的:
缩短URL,隐藏实际路径提高安全性
易于用户记忆和键入
易于被搜索引擎收录
常见网站应用场景:
1. 网站文件移动或文件目录名称改变,出于SEO需要,你需要保持旧的URL
规则:
rewrite regex replacement flag
- flag : break, last, redirect, permanent
last : 停止当前这个请求,并根据rewrite匹配的规则重新发起一个请求。新请求又从第一个阶段执行。。。
break: 相对last, break并不会重新发起一个请求,只是跳过当前的rewrite阶段,并执行本请求后续的执行阶段
redirect :302临时重定向,地址栏改变,爬虫不更新URI
permanent: 301永久重定向,地址栏改变,爬虫更新URI
下面重点说下 last 和 break 的区别,并做个小实验
编辑/usr/local/nginx/conf/nginx.conf
location /break/ {
rewrite ^/break/(.*) /test/$1 break;
return 402;
}
location /last/ {
rewrite ^/last/(.*) /test/$1 last;
return 403;
}
location /test/ {
return 508;
}
请求 tpl01.liang.com/break/break.html
返回 404; //如果存在 /test/break.html页面则 返回200
请求 tpl01.liang.com/last/last.html
返回 508 //不管存不存在 /test/last.html 都是返回508
原因分析: break 与last都停止后续rewrite指令集,不同之处在于last会重新发起新的请求并重新匹配location, 而break不会
rewrite regex replacement flag
正则表达式匹配模式如下:
区分大小写匹配: ~
不分区大小写匹配: ~*
区分大小写不匹配: !~
不区分大小写不匹配: !~*
匹配模式如下:
-判断文件是否存在: -f
-判断目录是否存在:-d
-判断文件是否可执行: -x
-判断文件,目录,连接是否存在: -e
应用案例
例子一: *.jpg或*.gif --> logo.png
location /{
root html;
index index.html index.htm;
rewrite \.(gif|jpg)$ /logo.png;
}
例子二:域名跳转
tpl01.liang.com --> tpl02.liang.com
server {
listen 80;
server_name tpl01.liang.com;
location /{
root html;
index index.html index.htm;
rewrite ^/ http://tpl02.liang.com/;
}
}
例子三: 根据浏览器返回不同的页面
server {
listen 80;
server_name tpl01.liang.com
location /{
root html;
index.html index.htm;
if($http_user_agent ~MSIE){
rewrite ^(.*)$ /nginx-ie/$1 break;
}
}
}
例子四: 访问资源不存在时,重定向到指定页面
if(!-e $request_filename){
rewrite ^/ http://tpl01.liang.com/none.html;
}