Rewrite 规则
ex:http://hostname/abc/abc.html
–>http://hostname/abc.php?abc
Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他URL的过程。
URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.asp?id=123 使用URLRewrite 转换后可以显示为 http://www.123.com/news/123.html
1、隐藏内部细节,提高安全性
2、美观
3、防盗链
Rewrite相关指令
Nginx Rewrite相关指令有if、rewrite、set、return等。
if 的语法 应用于 server和location环境内
if (condition) { … }
if可以支持如下条件判断匹配符号
~ 为区分大小写匹配
~* 为不区分大小写匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配
-f 和!-f 用来判断是否存在文件
-d 和!-d 用来判断是否存在目录
-e 和!-e 用来判断是否存在文件或目录
-x 和!-x 用来判断文件是否可执行
在匹配过程中可以引用一些Nginx的全局变量:
client(sip)–>server(dip/servername)
http://www.123.com/news/123.html
$args, 请求中的参数;
$document_root, 针对当前请求的根路径设置值;
$host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate, 对连接速率的限制;
$request_method, 请求的方法,比如"GET"、"POST"等;
$remote_addr, 客户端地址;
$remote_port, 客户端端口号;
$remote_user, 客户端用户名,认证用;
$request_filename, 当前请求的文件路径名
$query_string, 与$args相同;
$scheme, 所用的协议,比如http或者是https
$server_protocol, 请求的协议版本,“HTTP/1.0"或"HTTP/1.1”;
$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name, 请求到达的服务器名;
$document_uri 与$uri一样,URI地址;
$server_port, 请求到达的服务器端口号;
源:192.168.0.254(1024+)–>192.168.0.1(80)
请求url:http://192.168.0.1/123.html?123
log_format main ‘$remote_addr $remote_port $host $server_name $server_port $request $status $document_root $request_filename $query_string $scheme $server_protocol $document_uri’;
192.168.0.254 43466 192.168.0.1 80 GET /123.html HTTP/1.1 200 /webroot/vm01 vm01.baidu.com /webroot/vm01/123.html - http HTTP/1.1 /123.html
rewrite 指令根据表达式来重定向URI,或者修改字符串。可以应用于server,location, if环境下 每行rewrite指令最后应该根一个flag标记,支持的flag标记有:
last 表示完成rewrite
break 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器地址不会显示跳转后URL地址
last和break标记的区别在于,last标记在本条rewrite规则执行完后,会对其所在的server { … } 标签重新发起请求,而break标记则在本条规则匹配完成后,停止匹配,不再做后续的匹配。另有些时候必须使用last,比如在使用alias指令时,而使用proxy_pass指令时则必须使用break。
rewrite xxx qqq last
rewrite xxx qqq break
rewrite xxx qqq redirect
rewrite xxx qqq permanent