我正在尝试配置nginx代理将请求传递给另一台服务器, 仅当$ request_body变量与特定正则表达式匹配时。
我现在的问题是,我不知道如何准确配置此行为。
我目前正在讨论这个问题:
server {
listen 80 default;
server_name test.local;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
if ($request_body ~* ^(.*)\.test) {
proxy_pass http://www.google.de;
}
root /srv/http;
}
}
但问题在于,root始终是高手。 代理不会以任何方式传递。
关于如何实现这一目标的任何想法?
提前致谢
答案 0 :(得分:14)
试试这个:
server {
listen 80 default;
server_name test.local;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
if ($request_body ~* ^(.*)\.test) {
proxy_pass http://www.google.de;
break;
}
root /srv/http;
}
}
答案 1 :(得分:0)
Nginx路由基于与请求URI匹配的location指令。解决方案是临时修改此设置,以便将请求转发到不同的端点。
server {
listen 80 default;
server_name test.local;
if ($request_body ~* ^(.*)\.test) {
rewrite ^(.*)$ /istest/$1;
}
location / {
root /srv/http;
}
location /istest/ {
rewrite ^/istest/(.*)$ $1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://www.google.de;
}
}
if
条件只能在Nginx中与它的一部分rewrite module一起安全使用。在这个例子中。 rewrite
在请求URI的前面加上istest
。
location
块优先于最接近的匹配。匹配/istest/
的所有内容都将转到第二个块,该块使用另一个rewrite
从请求URI中删除/istest/
,然后转发到上游代理。