nginx_rewrite 规则介绍
rewrite
使用 nginx 提供的全局变量和自己设置的变量,结合正则表达式和标志位 实现 url 重写以及重定位。
rewrite
只能放在 server{},location{},if{}
中使用,并且只能对域名后边的除去传递的参数外的字符串起作用,例如 http://domain.com/shop/goods/index.php?id=1&u=str
只能对 /shop/goods/index.php
重写。
rewrite
语法规则: rewrite regex replacement [flag];
// rewrite 正则表达式 替换文本;
隐藏 index.php 路径
示例代码
location / {
index index.html index.htm index.php;
if (!-e $request_filename) { # 如果文件或文件夹不存在则重写
rewrite ^/(.*)$ /index.php?$1 last;
break;
}
}
二级目录隐藏 index.php 路径
比如: https://domain.net/api/index.php/notify/message
可以这样 https://domain.net/api/notify/message
访问。
示例代码:
location /api/ {
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite ^/(\w+)/(.*)$ /$1/index.php last;
# rewrite ^/api/(.*)$ /api/index.php?$1 last; 这样写也可以
break;
}
}
标志位 flag
`last` : 表示完成 rewrite,相当于 Apache 的 [L] 标记
`break` : 停止执行当前虚拟主机的后续 rewrite 指令集
`redirect` : 返回 302 临时重定向,地址栏会显示跳转后的地址
`permanent` : 返回 301 永久重定向,地址栏会显示跳转后的地址
last 和 break の 区别注释:
last一般写在server和if中,而break一般使用在location中
last不终止重写后的url匹配,即新的url会再从server走一遍匹配流程,而break终止重写后的匹配
break和last都能阻止继续执行后面的rewrite指令
\w+
匹配由数字、26个英文字母或者下划线组成的字符串.*
意味着能够匹配任意数量的任何字符$1-$9
存放着正则表达式中最近的 9 个正则表达式的匹配结果,这些结果按照子匹配的出现顺序依次排列。$1
代表的是匹配的第一个结果.括号表示的是表达式定义的 “组” (group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个)上面的表达式有 2 个匹配组(\w+)
和(.*)
所有后面可以用$1
和$2
来用