地址重写可以达到目的:
缩短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; }