rewrite重写指令

junlan
3
2025-02-21

代码示例

server {
    listen 443 ssl;
    server_name land.snimay.net;

    ssl_certificate /path/to/your/fullchain.pem;
    ssl_certificate_key /path/to/your/privkey.pem;

    # 代理图片请求
    location /blogimg {
        rewrite ^/images/(.*)$ /$1 break;
        # 将请求代理到目标图片服务器
        proxy_pass http://blogimg;
        }
}

1. rewrite 指令的基本语法

2. rewrite 具体指令解析

rewrite ^/images/(.*) /1 break;

  1. ^/images/(.*)这是正则表达式部分,用于匹配请求的 URI。 ^:表示匹配 URI 的开头。 /images/:匹配路径 /images/。这表示只有以 /images/ 开头的请求路径才会被匹配。 (.*):捕获 /images/ 后面的所有内容(任意字符,任意长度)。.* 是一个贪婪匹配,表示匹配 /images/ 后面的任何内容。:表示匹配 URI 的结尾。
    作用:这个正则表达式会匹配形如 /images/... 的路径,并捕获 /images/ 后面的部分。
  2. /1 这是替换后的 URI。 /:表示替换后的路径以 / 开头。 1:表示正则表达式中第一个捕获组的内容(即 (.*) 捕获的部分)。在这个例子中,$1 就是 /images/ 后面的所有内容。
    作用:将 /images/... 替换为 /...,即移除 /images/ 前缀。
  3. break
    这是 rewrite 指令的标志,用于控制重写行为。
    break:表示在当前 location 块中停止进一步处理,不再匹配其他 location 块。重写后的 URI 会在当前 location 块中继续处理。
    作用:在当前 location /images/ 块中完成路径重写,并继续处理后续的代理逻辑(如 proxy_pass)。

2.1 案例说明

nginx 日志

# 没用 rewrite 访问的的是 /images/i/2025/02/19/iu8ogz-0.webp 路径
172.19.0.9 - - [21/Feb/2025:10:46:53 +0800] "GET /images/i/2025/02/19/iu8ogz-0.webp HTTP/1.0" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"

# 使用 rewrite 后访问的是 /i/2025/02/19/iu8ogz-0.webp 路径,去掉了 /images/
172.19.0.9 - - [21/Feb/2025:10:51:18 +0800] "GET /i/2025/02/19/iu8ogz-0.webp HTTP/1.0" 200 62848 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0"