1, rewrite 介绍
rewrite是实现URL重写的关键指令,根据regex (正则表达式)部分内容,重定向到replacement,结尾是flag标记。rewrite 在 server 块中针对所有的请求,location 中则针对单个匹配路径的,还可以在 If 条件块中使用。
基本语法:
rewrite <regex> <replacement> [flag];
regex: 正则表达式语句进行规则匹配
replacement: 将正则匹配的内容替换成replacement
flag: last | break | redirect | permanent
- last : 本条规则匹配完成后,继续向下匹配新的 location URI规则
- break: 本条规则匹配完成即终止,不再匹配后面的任何规则
- redirect : 回302临时重定向,浏览器地址会显示跳转后的URL地址 (防爬虫)
- permanent : 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
2, rewrite 示例
2.1 location 跳转
location /foo {
set $a hello;
rewrite ^ /bar;
}
location /bar {
# 如果直接访问“/bar”,$a的值为空
add_header Content-Type text/plain;
return 200 "a = [$a]";
}
2.2 地址跳转
server {
listen 80;
server_name www.javascript.net.cn javascript.net.cn;
rewrite ^(.*)$ https://javascript.net.cn$1 permanent;
}
2.3 rewrite 伪静态
rewrite ^/article/([0-9]+).html$ /article.php?id=$1 last;
rewrite ^/category/([0-9]+).html$ /category.php?group_id=$1 last;
3, if 指令
if 指令也是 rewrite 模块中的一个指令。 其可作用于 server 和 location 块中。
一般可使用 字符串与变量做匹配 '=' 和 '!=' , 也可以正则匹配 '~' 或 '~!'。
检测文件是否存在'-f' 或 '!-f' ,目录则是 '-d',检查文件,目录,软链接是否存在' -e' 或者 '!-e'。
检查是否为可执行文件,使用'-x' 或者 '!-x'。
以下为示例。
# 如果UA包含"MSIE",rewrite请求到/msid/目录下
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
#如果cookie匹配正则,设置变量$id等于正则引用部分
if ($http_cookie ~* "id=([^;]+(?:;|$))") {
set $id $1;
}
# 如果提交方法为POST,则返回状态405(Method not allowed)
# return不能返回301,302
if ($request_method = POST) {
return 405;
}
4, try_files 指令
try_files是nginx中http_core核心模块所带的指令,主要是能替代一些rewrite的指令,提高解析效率。官网的文档为http://nginx.org/en/docs/http/ngx_http_core_module.html#try_files
语法:
try_files file ... uri;
try_files file ... =code;
Default:—Context:server, location
按顺序检查文件存在与否,并且使用第一个找到的文件处理请求,文件的路径是根据 root 和 alias 指令,由 file 参数构造的。
通过在名称结尾指定斜线来检查是否存在目录,例如“$uri/”。如果没有文件被找到,会内部重定向到最后一个参数中指定的 uri。
try_files $uri $uri/ /index.php?$args;
查询 $uri 文件,找不到的话查询 $uri/ 路径,再找不到的话,rewrite 到路径下的 /index.php?args
修改时间 2023-10-31