Nginx rewrite 重写
Linux 使用文档
收录了这篇文章

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Node.js 实现 RBAC 权限模型
ReferenceError: __dirname is not defined in ES module scope
Node.js 模块概念
JavaScript class 的 this 指向
Node.js MySQL 连接池和事务
JavaScript 的 this 指向
CSS 图片缩小出现锯齿
Node.js MySQL2 如何编写事务