代码示例
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 指令的基本语法
-
官网说明:https://nginx.org/en/docs/http/ngx_http_rewrite_module.html
-
rewrite [flag];
- :正则表达式,用于匹配请求的 URI。
- :替换后的 URI。
- [flag]:可选的标志,用于控制重写的行为(如是否停止处理、是否重定向等)。
2. rewrite 具体指令解析
rewrite ^/images/(.*) /1 break;
- ^/images/(.*)这是正则表达式部分,用于匹配请求的 URI。
^:表示匹配 URI 的开头。
/images/:匹配路径 /images/。这表示只有以 /images/ 开头的请求路径才会被匹配。
(.*):捕获 /images/ 后面的所有内容(任意字符,任意长度)。.* 是一个贪婪匹配,表示匹配 /images/ 后面的任何内容。:表示匹配 URI 的结尾。
作用:这个正则表达式会匹配形如 /images/... 的路径,并捕获 /images/ 后面的部分。 - /1
这是替换后的 URI。
/:表示替换后的路径以 / 开头。
1:表示正则表达式中第一个捕获组的内容(即 (.*) 捕获的部分)。在这个例子中,$1 就是 /images/ 后面的所有内容。
作用:将 /images/... 替换为 /...,即移除 /images/ 前缀。 - 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"