rewrite 主要功能就是实现url的重写,nginx的rewrite规则采用PCRE(Perl Compatible Regular Expressions) Perl兼容正则表达式的语法进行规则匹配,如果需要nginx的rewrite功能,在编译nginx之前,需要编译安装PCRE库
例:
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msic/$1 break; #当用户代理为IE浏览器,则跳转至/msic/目录下
}
if (! -f $request_filename) {
rewrite ^/img/(.*)$ /site/$host/images/$1 last; #当用户请求的/img/下的某文件不存在,则跳转到/site/$host/images/目录下
}
rewrite语法规则:
变量名可以使用“=”或“!=”运算符
"~"符号表示区分大小写字母的匹配
"~*"表示不区分大小写字母的匹配
"!~"和"!~*"与"~" "~*"相反
"-f"和"!-f"用来判断文件是否存在
"-d"和“!-d”判断目录是否存在
"-e" 和"!-e"判断文件或目录是否存在
"-x" "!-x"判断文件是否可执行
也支持$1~$9位置化参数
return指令:
location ~ .*\.(sh|bash)?$ {
return 403;
}
#如果访问的url以"*.sh" "*.bash"结尾,则返回403
if ($host ~* ^(.*?)\.aaa\.com$) {
set $var_tz '1';
}
if ($host ~* ^192\.168\.1\.(.*?)$) {
set $var_tz '1';
}
if ($host ~* ^localhost) {
set $var_tz '1';
}
if ($var_tz !~ '1') {
rewrite ^/(.*)$ http://www.aaa.com/ redirect;
}
#如果访问的url非*.aaa.com和192.168.0.* 及localhost ,则重定向到 http://www.aaa.com
flag标记:
last: 相当 于apache里的[L]标记,表示完成rewrite
break: 本条规则匹配完成后,终止匹配,不再匹配后面的规则
redirect: 返回302临时重定向,浏览器地址栏会显示跳转后的url地址
permanent: 返回301永久重定向,浏览器地址栏会显示跳转后的url地址
last和break用来实现uri重写,浏览器地址栏url地址不变
redirect和permanent用来实现url重写,浏览吕地址栏会显示跳转后的url地址
一般在根location中(即location / {...})或直接在server标签中编写rewrite规则,推荐使用last标记,在非根location中(location /cms/ {....}),则使用break标记
e.g.
location /cms/ {
proxy_pass http://test.yourdomain.com;
rewrite "^/cms/(.*)\.html$" /cms/index.html break;
}
实例:
location / {
rewrite ^/data/?$ /bbs/ last; 将/data目录重定向到/bbs/
}
防止盗链:
location ~* \.(gif|jpg|png|swf|flv)$ {
valid_referers none blocked www.test.com *.test.com;
if ($invalid_referer) {
rewrite ^/(.*) http://www.test.com/error.html;
}
}
域名跳转:
#将所有对 www.bac.com的访问跳转到www.test.com
server {
listen 80;
server_name www.test.com;
index index.html index.php
root /export /home/www
if ($host = "www.abc.com") {
rewrite ^/(.*)$ http://www.test.com/$1 permanent;
}
}
linux交流群:22346652。欢迎Linux爱好者加入,一起学习,一起进步。