收录了这篇文章
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