我正在使用 nginx 创建一个反向代理,用于在现有遗留系统和基于 Rails 的新应用程序之间进行代理。默认情况下,我们会将所有流量发送到 Rails 站点,除非它们匹配某些 URL 或请求正文不包含某些参数。但是,在某些情况下 URL 与旧条件匹配,但如果存在某些参数,我们需要重定向到新系统。因此,例如,我们有一个 URL /index.cfm?fuseaction=search
,通常会发送到旧系统,但由于它包含fuseaction=search
,我需要将它重定向到位于 的新系统/search/events
。我已经编写了以下配置。
upstream legacy {
server 10.0.0.1:80;
}
upstream rails {
server 10.0.0.2:80;
}
server {
listen 0.0.0.0:80;
server_name mydomain.com
root /usr/share/nginx/html;
index index.html index.htm;
location / {
proxy_pass http://rails;
if ($request_body ~* fuseaction(?!=public\.search(_all(_by_type)?)?))
{
proxy_pass http://legacy;
}
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
location ~* /(index.cfm|images|uploads|admin|htmlArea|innovastudio|js|scripts|w3c)*$ {
proxy_pass http://legacy;
if ($request_body ~* fuseaction=public\.search(_all(_by_type)?)?)
{
proxy_pass http://rails/search/events;
}
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
但是,当我尝试启动 nginx 时,出现以下错误:
"proxy_pass" may not have URI part in location given by regular expression, or inside named location, or inside the "if" statement, or inside the "limit_except" block in /etc/nginx/sites-enabled/default:56
我明白错误在说什么,但我不知道如何解决它。也许proxy_pass
不是我需要的?也许我需要使用proxy_redirect
?感谢您对如何解决此问题的任何帮助。