gpt4 book ai didi

Nginx map 不使用我的正则表达式的参数

转载 作者:行者123 更新时间:2023-12-01 09:05:18 27 4
gpt4 key购买 nike

我正在尝试使用 nginx 的映射,但结果不是我期望的。

这就是我所拥有的:

map $uri $new {
default "";
~*/cc/(?P<suffix>.*)$ test.php?suffix=$suffix;
}

location ~ [a-zA-Z0-9/_]+$ {
proxy_pass http://www.domain.com:81/$new;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

当我访问 www.domain.com/cc/abc 时,我在日志中看到了这一点

2012/03/29 17:27:53 [warn] 3382#0: *33 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/5/00/0000000005 while reading upstream, client: 1.2.3.4, server: www.domain.com, request: "GET /cc/abc HTTP/1.1", upstream: "http://1270.0.0.1:81/test.php?suffix=$suffix", host: "www.domain.com"

$suffix 没有被替换。

但是当我这样做时:

map $uri $new {
default "";
~*/cc/(?P<suffix>.*)$ $suffix;
}

location ~ [a-zA-Z0-9/_]+$ {
proxy_pass http://www.domain.com:81/$new;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

现在,当我访问 www.domain.com/cc/abc 时,日志显示如下:

2012/03/29 17:29:39 [warn] 5916#0: *26 an upstream response is buffered to a temporary file /var/cache/nginx/proxy_temp/2/00/0000000002 while reading upstream, client: 1.2.3.4, server: www.domain.com, request: "GET /cc/abc HTTP/1.1", upstream: "http://1270.0.01:81/abc", host: "www.domain.com"

因此,当重写包含包含变量的字符串时,它不会被替换。但如果它只包含变量,它会起作用。

我做错了什么?

最佳答案

正如您所发现的, map 替换只能是静态字符串或单个变量。由于 test.php?suffix=$suffix 不以 $ 开头,nginx 假设它只是一个静态字符串。您需要使用两次重写来完成您想要的,而不是使用 map :

location ~ [a-zA-Z0-9/_]+$ {
rewrite ^/cc/(.*) /test.php?suffix=$1 break;
rewrite ^ / break;

proxy_pass http://www.domain.com:81;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

第一次重写将从 url 中删除任何初始/cc/并将其余部分附加为 url arg,就像您的 map 试图那样。 break 标志告诉 nginx 停止处理重写指令。如果第一次重写不匹配,那么第二次将始终匹配,并将 url 设置为/。

编辑:从 1.11.0 开始, map 值可以是复杂值,因此原始配置可以工作

关于Nginx map 不使用我的正则表达式的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9928626/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com