我正在使用nginx创建一个反向代理,该代理用于在现有遗留系统和基于Rails的新应用程序之间进行代理。我们默认将所有流量发送到Rails站点,除非它们匹配某些URL或请求正文不包含某些参数。但是,有些情况下URL与旧条件匹配,但如果存在某些参数,我们需要重定向到新系统。因此,举例来说,我们的网址为/index.cfm?fuseaction=search
,通常会发送到旧系统,但由于它包含fuseaction=search
,我需要将其重定向到{{1}的新系统}。我写了以下配置。
/search/events
然而,当我尝试启动nginx时,我收到以下错误:
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;
}
}
我理解错误说的是什么,但我不确定如何修复它。也许"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
?如何解决这个问题的任何帮助表示赞赏。
答案 0 :(得分:1)
proxy_pass应该没问题,但我不知道它为什么抱怨该行,“// rails”肯定是一个可访问的URI?
我原本认为这个问题与使用$ request_body有关,如果你知道它们是你需要匹配的GET参数,我会转而使用$ args。
类似的东西:
if ($args ~ "fuseaction(?!=public\.search(_all(_by_type)?)?)" )
答案 1 :(得分:1)
在尝试理解这个问题的过程中,我意识到我真正需要的是重定向而不是尝试代理。除了我最终更改的许多内容之外,我还检查了$args
变量而不是$request_body
。这是我完成时重写块的样子
if ($args ~ fuseaction\=public\.race_search(_all(_by_type)?)?)
{
rewrite ^(.*)$ /search/events? permanent;
}
if ($args ~ fuseaction\=public\.tools)
{
rewrite ^(.*)$ /directors? permanent;
}
if ($args ~ fuseaction\=public\.contact)
{
rewrite ^(.*)$ /contact? permanent;
}
if ($args ~ fuseaction\=public\.spotlight)
{
rewrite ^(.*)$ /search/events? permanent;
}
if ($args ~ fuseaction\=public\.results)
{
rewrite ^(.*)$ /search/results? permanent;
}
第一个参数匹配整个路径,第二个参数告诉它要重写的内容,尾随?
从重写中删除任何查询参数,第三个参数执行301(永久)重定向。 / p>