随机
Enter 搜索 ↑↓ 切换 Esc 清空

nginx_rewrite

命令

nginx URL 重写模块指令

nginx_rewrite

nginx URL 重写模块指令

补充说明

rewrite 指令是 ngx_http_rewrite_module 的核心功能,用于根据正则表达式重写请求的 URL。可以实现 URL 规范化、伪静态、重定向等效果。

语法

rewrite regex replacement [flag];

flag 标志位

last     # 重写后停止处理后续 rewrite 指令,重新匹配 location
break    # 重写后停止处理后续 rewrite 指令,但不重新匹配 location
redirect # 返回 302 临时重定向
permanent # 返回 301 永久重定向

常用实例

# 301 永久重定向
rewrite ^/old-page\.html$ /new-page.html permanent;

# 302 临时重定向
rewrite ^/temporary$ http://example.com permanent redirect;

# 伪静态(隐藏 .html 扩展名)
rewrite ^/article/(\d+)$ /article/$1.html last;

# 强制使用 HTTPS
if ($scheme = http) {
    return 301 https://$host$request_uri;
}

# 去除末尾斜杠
rewrite ^/(.*)/$ /$1 permanent;

# 添加末尾斜杠
if (-d $request_filename) {
    rewrite ^/(.*[^/])$ /$1/ permanent;
}

last vs break

# last - 重新匹配 location
server {
    rewrite ^/feed/xml$ /feed/atom.xml last;
    # ↓ 重新从这里开始匹配
    
    location /feed/ {
        proxy_pass http://backend;
    }
}

# break - 停止 rewrite,继续处理
server {
    rewrite ^/static/(.*)$ /files/$1 break;
    # ↓ 直接在当前 server 块继续处理
    root /var/www;
}

常用场景

# 1. 域名重定向
server {
    listen 80;
    server_name old-site.com;
    return 301 $scheme://new-site.com$request_uri;
}

# 2. www 重定向
server {
    listen 80;
    server_name example.com;
    return 301 http://www.example.com$request_uri;
}

# 3. 移动端适配(简单版)
if ($http_user_agent ~* "Mobile|Android|iPhone") {
    rewrite ^(.*)$ /mobile$1 last;
}

# 4. 防盗链
location /images/ {
    valid_referers none blocked example.com;
    if ($invalid_referer) {
        return 403;
    }
}

# 5. 禁止访问隐藏文件
location ~ /\. {
    return 404;
}

变量参考

# 常用变量
$uri          # 当前请求的 URI(不带参数)
$request_uri  # 完整请求 URI(带参数)
$args         # 请求参数
$scheme       # 协议(http/https)
$host         # 主机名
$request_filename  # 当前请求的文件路径

条件判断

# if 指令
if ($condition) { ... }

# 常用条件
if ($request_method = POST) { ... }      # 请求方法
if ($http_cookie ~* "id=([^;]+)(?:;|$)") { ... }  # Cookie
if ($request_uri ~ "pattern") { ... }    # URI 匹配
if ($args ~ "pattern") { ... }           # 参数匹配