手头没有现成的测试环境,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
ryd994 30 天前 via Android
|
![]() |
2
ysc3839 30 天前 via Android
1.我认为是部分匹配。因为一种典型用法就是只写“^”匹配开头来实现任意匹配,如果要完全匹配的话,那显然只匹配一个开头是不满足的。
2.印象中 rewrite 不匹配不改变$args ,与 try_files 不同,后者会覆盖掉$args ,所以用 try_files 时需要手动写上$args 。 我不保证正确,建议还是实际测试。 |
3
Lax 30 天前
日常测试 nginx 配置用这个命令 docker run --rm -it -p 8080:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx
|
4
kyonn OP @ryd994 部署一个 nginx 实例是快的,但是没办法看到完整的匹配过程,尤其是涉及多条规则的时候 看不到中间过程。不知道是否有解决办法
|
6
Lax 30 天前
回到你的问题,正则加上结束符$才能完整匹配。
|
7
Lax 30 天前
@kyonn 用到 break 了,不会多次跳转。改一下 log_format 到 debug 看看有没有你需要的信息。我调试的时候会 proxy_pass 到本地的另一个调试的 server ,然后用 echo 模块直接 `echo $request_uri;`,也可以显示其它信息,在命令行或浏览器里都方便调试。
|
8
Lax 30 天前
说错了,是 access_log 的 log_format 和 error_log 的 level 到 debug
|
11
Hanada 29 天前 via Android
@ysc3839 rewrite 虽然不匹配参数,但是可以改参数的,比如他这里,会追加一个 name 参数到原参数列表里面( rewrite 甚至帮你处理好?和&的拼接问题了)
|
12
Hanada 29 天前 via Android
你这段配置确实很难第一时间理解处理逻辑……主要还是 nginx 太智能了,很多时候喜欢给你搞分场景自动处理。你这里的不仅仅在于 rewrite ,还有 location 和 proxy_pass 的 uri 拼接逻辑。
实测之前基本上没人敢给你准确答案。 比如 1.proxy_pass 带变量和不带变量是两种处理逻辑 2.proxy_pass 带 uri 和不带 uri 是两种处理逻辑 4.location 用正则和非正则是两种处理逻辑 |
13
Hanada 29 天前 via Android ![]() 如果想快速测试但是又不想起一个 nginx 实际的话,这里有一个网站可以让你调试,配两个 server 块,A server 发请求,B server 收请求并且输出$request_uri 就能看到结果了。https://tech-playground.com/playgrounds/nginx/
|