






















手头没有现成的测试环境,AI 的回答感觉也不太靠谱,咨询下 V 友 关于 nginx rewrite 指令的问题:
一、rewrite 指令的正则表达式是部分匹配还是完全匹配才生效?
比如下面的配置中,请求 /name/jane-lotus 肯定会触发 rewrite 指令,最终请求地址为 http://user-center/users?name=jane-lotus 。
那么请求 /name/regions/bbb 会不会触发 rewrite 的 URI 替换?最终请求地址是多少?
这篇文章说不会触发 rewrite ,AI 的回答是会触发 rewrite 。
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_passs http://user-center/main/basicinfo/;
}
二、还是上面的配置,假如原始请求里带了查询参数,那么触发 rewrite 后会不会把原始请求参数也追加给新的请求地址? rewrite 新目标里有没有新的查询参数是否会影响老的查询参数追加到最终请求里?
三、是否有比较系统的 nginx 配置教程推荐或者模拟测试环境验证 nginx 详细执行过程的方法?
第 1 条附言 · 2025 年 8 月 3 日
实测 rewrite 不需要完全匹配,只要部分匹配了就会进行替换,且没匹配的部分直接被丢弃。另外,原始请求的查询参数会被直接追加到新请求上,除非 rewrite 的新字符串末尾增加?符号。
测试代码如下:
docker exec -it nginx nginx -s reload && curl http://127.0.0.1/name/ggg/ccc?bb=cc
```
worker_processes 1;
worker_rlimit_nofile 8192;
events {
worker_connections 4096;
}
http {
include /etc/nginx/mime.types;
index index.html index.htm index.php;
server {
listen 80;
server_name basic;
access_log /dev/stdout;
location / {
proxy_pass http://httpbin.org;
}
location /deny {
deny all;
}
location /name/ {
rewrite /name/([^/]+) /users?name=$1 break;
proxy_pass http://127.0.0.1:5448;
}
}
server {
listen 5448;
server_name basic;
access_log /dev/stdout;
location / {
add_header Content-Type text/plain;
return 200 "$request_uri";
}
location /deny {
deny all;
}
}
}
```
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。