Nginx Rewrite | 转发规则

2,570 阅读1分钟

背景


项目中需要使用Nginx去做一些 动态 静态的规则转发,使用情况做一个总结

Nginx重定向说明


首先我们要在 server 块中定义一个服务规则, 所有的转发规则都应在 server 块上下文中做转发处理

一个简单的server块例子

server {
     listen 80; # 服务监听的端口
     server_name www.test.com; # 服务名称,可以填写公网域名或者IP地址
     ...
}

静态转发


这里常用到的基本就是一些静态上下文规则的转发

例如 从 /hello 转发到 ***/hi*** , 我们可以做一个 location 转发的配置

server {
   
    location /hello {
        return 301 $scheme://test.com/hi
    }
}

URL规则重写


经常使用到的还有对 url 进行 rewrite , 将某一特定下的请求通过URL重写, 使其更加灵活的匹配相应的服务。

语法规则如下:

rewrite regex replacment-url [flag]

**regex**: 基于PCRE的正则表达式 , 主要用来匹配URL规则

**replacement-url:** regex表达式匹配后的URL地址

**flag:** 匹配规则后的操作, 是否继续往下匹配, 或者退出当前匹配块

静态页面规则重写


如下是一段 Nginx 中基本的静态页面规则匹配

location /hello {
    # 将当前server下所有 /hello 的请求重写成 /sayHello.html
    rewrite ^/hello?$  /sayHello.html break;
}

我们主要做了以下几件事

  • 首先通过 location /hello 定向所有/hello路径下的资源请求
  • Nginx 会根据规则 ^/hello?$ 匹配请求
  • $ 的意思是匹配某个规则的结尾内容
  • ? 的意思是匹配一个或多个字符属于贪婪匹配的一种

动态规则重写


说完了静态规则重写,接下来看看动态规则的重写方式, 同样是通过一段demo

再我们日常 php 开发中会遇到如下的 URL http://example/user.php?id=1

接下来我们通过 rewrite 来重写这个URL使其变成 [<http://example/user/1>](<http://example/user/1>) 这类规则模式

location /user.php {
    rewrite user.php?id=$1 ^user/([0-9]+)?$ break;
}

这段配置主要做了以下的事情

  • 通过 location /user.php 定向所有 /user.php 的请求
  • 通过 user.php?id=$1 匹配所有通过此类规则的所有请求
  • 通过 rewrite 将所有 user.php?id=$1 的请求统一写成 user/1|2|3|.. 的格式

参考内容