标签:相对 通过 兼容 转换 一般来说 正则 ane 参数 ret
Nginx中Rewrite规则主要用于实现URL的重写。通过Rewrite规则,可以实现规范的URL、根据变量来做URL转向及选择配置。break的作用即完成当前规则集,后续不再处理rewrite命令。
if ($slow)
{
limit_rate 10k;
break;
}
if条件判断,判断一个条件是否符合,符合就执行代码段内的命令。Nginx内的if命令不支持嵌套,也不支持多一个条件处理(&&或||)
if命令是Rewrite规则内使用较多的一个命令,很多信息都可以作为if的条件进行判断。大致分为以下几种:
例如:
if ($http_user_agent ~ MSIE)
{
rewrite ^(.*)$ /msie/$1 break;
}
if ($http_cookie ~* "id=([^;] +)(?:;|$)")
{
set $id $1;
}
if ($request_method = POST)
{
return 405;
}
if (!-f $request_filename)
{
break;
proxy_pass http://127.0.0.1;
}
if ($slow)
{
limit_rate 10k;
}
if ($invalid_referer)
{
return 403;
}
if ($args ^~ post=140)
{
rewrite ^ http://example.com/ permanent;
}
return命令用于结束规则的执行并返回状态码信息给客户端。常用的可用状态码包括:
作为rewrite规则内的核心命令,rewrite命令根据表达式来重定向URI,或者修改字符串。执行命令按其在配置文件内的顺序。
重写表达式子对相对路径有效;如果想匹配主机名,需要配置if命令
rewrite语法:rewrite regex replacement flag
rewrite命令支持的flag:
last和break用来实现URI重写,浏览器显示的URI地址不变,但服务器端访问的路径发生了变化;redirect和permanent用来实现URI跳转,浏览器会显示跳转后的URI地址。
last会在本条rewrite规则执行后重新在所在块内发起请求,而break则在本条规则匹配后终止匹配,因此last在某些情况下误使用将导致死循环。一般在根location中或直接在server标签中编写rewrite规则,推荐使用last;在非根location中使用break。例如:
# 对于location / {...}块而言,可以直接写内部的代码,不写location
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$1.mp3 last;
return 403;
location 、download/ {
rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$1.mp3 break;
return 403;
}
如果被替换的URI中含有参数(例如/app/test.php?id=5),默认参数会被自动附加到替换串上,我们可以通过在替换串的末尾加上?来解决这一问题。
rewrite ^/user/(.*)$ /show?user=$1? last;
# 末尾不加?
# rewrite ^/test(.*)$ http://www.aaa.com/home permanent;
# 对于访问http://www.aaa.com/test?id=5,跳转后将访问http://www.aaa.com/home?id=5
# 末尾加?
# rewrite ^/test(.*)$ http://www.aaa.com/home? permanent;
# 对于访问http://www.aaa.com/test?id=5,跳转后将访问http://www.aaa.com/home
set命令用于定义一个变量,还可以给变量进行赋值。配合if可以实现多条件。例如
if ($host ~* ^(.*?)\.aaa\.com$)
{
set $var_test ‘1‘;
}
if ($host ~* ^localhost)
{
set $var_test ‘1‘;
}
if ($var_test !~ ‘1‘)
{
rewrite ^/(.*)$ http://www.aaa.com/ redirect;
}
一般来说,,简单的nginx和apache的rewrite规则相差不大,只有小小修复即可实现兼容。
Apache Rewrite规则:
RewriteRule ^/(.*)$ http://www.aaa.com/$1 [L]
Nginx Rewrite规则:
rewrite ^/(.*)$ http://www.aaa.com/$1 last;
# nginx
# nginx要求给转换后的URL添加域名:http://$host
rewrite ^/(.*)$ http://www.aaa.com/$1/ permanent;
# apache
RewriteRule ^/(.*)$ /$1/ [R=301,L]
# apache引用变量
${HTTP_HOST}
# nginx引用变量
$host
apache | nginx |
---|---|
RewriteCond | if |
RewriteRule | rewrite |
[R] | redirect |
[P] | last |
[R,L] | redirect |
[P,L] | last |
[PT,L] | last |
本文是一篇读书笔记,是对书内某个章节的知识整理,以防遗忘。
标签:相对 通过 兼容 转换 一般来说 正则 ane 参数 ret
原文地址:http://blog.51cto.com/castiel/2060421