nginx的rewrite语法
时间: 2025-01-04 21:28:13 浏览: 5
### Nginx Rewrite 模块语法说明
Nginx 的 `ngx_http_rewrite_module` 模块提供了在请求处理期间修改 URI 和重定向客户端的功能。此模块依赖于 PCRE 库支持正则表达式。
#### 基本指令
- **break**: 如果在一个location中使用了多个rewrite指令,则可以在某个条件满足后停止后续的rewrite操作[^1]。
- **last**: 中断当前的处理流程并重新搜索与新的URL匹配的位置。
- **redirect**: 返回临时重定向响应给客户端,状态码为302。
- **permanent**: 返回永久重定向响应给客户端,状态码为301。
- **if**: 对指定条件求值,在真时改变URI或返回错误代码。该指令可以用于检查变量的内容,并基于这些内容执行不同的动作[^2]。
#### 实际应用案例
对于特定 IP 地址范围内的访问控制可以通过设置条件语句来实现:
```nginx
server {
...
# 定义一个标记变量,默认情况下设为true表示需要重写
set $rewrite true;
# 当远程地址等于公司内网IP时,将标记置为false,即不需要重写了
if ($remote_addr = "14.0.0.88") {
set $rewrite false;
}
# 若标记仍为true,则意味着是非内部网络访问者,此时进行页面重定向至error.html
if ($rewrite = true) {
rewrite ^/(.*)$ /error.html break;
}
}
```
上述配置会使得来自非指定 IP (`14.0.0.88`) 的所有请求都被导向 `/error.html` 页面[^4]。
另外还可以创建自定义路径映射关系,比如根据年份构建不同层次结构下的HTML文件夹和文件:
```bash
mkdir -p /usr/share/nginx/html/2017/a/b/c/
echo "<html><body>Hello from 2017!</body></html>" > /usr/share/nginx/html/2017/a/b/c/index.html
```
对应的 nginx 配置可能看起来像这样:
```nginx
location ~* "^/archive/(?<year>\d{4})/(?<path>.*)$" {
alias /usr/share/nginx/html/$year/$path/;
}
```
这段配置将会把形如 `/archive/2017/a/b/c/` 这样的 URL 映射到实际存在的物理位置 `/usr/share/nginx/html/2017/a/b/c/` 下面去[^3]。
阅读全文