背景
项目中需要使用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|.. 的格式
参考内容