在url优化过程中,不可避免的涉及到nginx rewrite规则 。那么nginx rewrite是如何配置的呢?
rewrite可以出现的地方有4个:NGX_HTTP_SRV_CONF,NGX_HTTP_SIF_CONF,NGX_HTTP_LOC_CONF,NGX_HTTP_LIF_CONF 。分别对应着:
NGX_HTTP_SRV_CONF:配置文件中的server域中的任何地方;
NGX_HTTP_SIF_CONF:配置文件中server域中的if配置中;
NGX_HTTP_LOC_CONF:配置文件中的location域中的任何地方;
NGX_HTTP_LIF_CONF:配置文件中的location域中的if配置中;
举例如下:
//...
server {
//...
rewrite "^/+$" /index.phpbreak;
if ($uri ~* "^/+abc") {
rewrite "^/+abc" /abc/index.php break;
}
location /xy {
rewrite "^/+xy$" /xy/index.phpbreak;
}
}
?
1
其中location的详细描述和location的强大功能可以在本网站搜索框中输入“ngingx location”来搜索 。
补充
1.break指令
默认值:none ;使用环境:server,location,if ;
该指令的作用是完成当前的规则集,不再处理rewrite指令 。
2.if指令
默认值:none ;使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句 。If指令不支持嵌套,不支持多个条件&&和||处理 。
A.变量名,错误的值包括:空字符串""或者任何以0开始的字符串
B.变量比较可以使用"="(表示等于)和"!="(表示不等于)
C.正则表达式模式匹配可以使用"~*"和"~"符号
D."~"符号表示区分大小写字母的匹配
E."~*"符号表示不区分大小写字母的匹配
F."!~"和"!~*"符号的作用刚好和"~"、"~*"相反,表示不匹配
G."-f"和"!-f"用来判断文件是否存在
H."-d"和"!-d"用来判断目录是否存在
I."-e"和"!-e"用来判断文件或目录是否存在
J."-x"和"!-x"用来判断文件是否为可执行
K.部分正则表达式可以在()内,用$1~$9来访问
3.return指令
语法:return code ;使用环境:server,location,if ;
该指令用于结束规则的执行并返回状态码给客户端 。
示例:如果访问的URL以".sh"或".bash"结尾,则返回403状态码
location ~ .*.(sh|bash)?$
{
return 403;
}
4.rewrite 指令
语法:rewrite regex replacement flag
默认值:none ; 使用环境:server,location,if
该指令根据表达式来重定向URI,或者修改字符串 。指令根据配置文件中的顺序来执行 。注意重写表达式只对相对路径有效 。如果你想配对主机名,你应该使用if语句,示例如下:
if( $host ~* www.(.*) )
{
set $host_without_www $1;
rewrite^(.*)$http://$host_without_www$1 permanent;
}
rewrite指令的最后一项参数为flag标记,支持flag标记有:
1.last相当于apache里面的[L]标记,表示rewrite 。
2.break本条规则匹配完成后,终止匹配,不再匹配后面的规则 。
3.redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址 。
4.permanent返回301永久重定向, 浏览器地址会显示跳转后的URL地址 。
使用last和break实现URI重写,浏览器地址栏不变 。而且两者有细微差别,使用alias指令必须用last标记;使用proxy_pass指令时,需要使用break标记 。Last标记在本条rewrite规则执行完毕后,会对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配 。
一般在跟location中(location /{...})或直接在server标签中编写rewrite规则,推荐使用last标记;在非根location中(location /cms/{...}),则使用break 。
如果URI中含有参数(/app/test.php?id=5),默认情况下参数会被自动附加到替换串上,你可以通过在替换串的末尾加上?标记来解决这一问题 。
推荐阅读
- Nginx如何配置url_hash转发方式
- nginx提示No Nginx提示无法连接路由
- linux查看nginx安装路径 Nginx安装路径
- 配置Nginx子域名泛解析绑定至单独目录 nginx域名绑定二级目录
- Nginx安装配置PageSpeed模块实现网站加速
- Nginx的error_log和Access_log分析 nginx access log
- Nginx配置error_page nginx配置errorlog
- 解决nginx一直跳转登录页面 解决Nginx:
- 解决nginx+php-fpm无法上传文件问题
- nginx reload指定配置文件 nginx安装文件上传ngx_upload模块教程