我在一些 IIS 托管应用程序前面运行 NGINX 作为反向代理。我的目标是为特定位置设置重写规则。问题是应用程序本身在某些情况下会以 301 或 302 响应。这会传递一个新的位置标头,然后我也需要处理它。
所以基本上我尝试做的是这样的:-https://mydemo.app.de/abc应该出现在浏览器中,但应该提供 /xyz 而不是 /abc。即使存在重定向 (301/302),这种方法也能很好地发挥作用。
这是我的“半工作”配置:
location ~* /abc {
rewrite (?i)/abc/(.*) /xyz/$1 break;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-Host $host;
proxy_pass http://mydemo.app.local;
proxy_redirect ~*(.*)\/xyz\/(.*) $1/abc/$2;
proxy_pass_header Server;
# Handle Web Socket connections
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
}
现在,上游服务器有时会返回以下内容:login.aspx?ReturnUrl=/xyz/,这在浏览器中是可读的。但事实并非如此。还应该有 /abc/。据我了解,proxy_redirect 部分应该可以处理这个问题,但不知何故,在我的情况下却无法处理。
有什么方法可以让它正常工作而无需更改应用程序本身(这会导致更大的更改......)?
任何帮助深表感谢。
答案1
如果你有两个文本序列实例/xyz/
需要替换为/abc/
,则需要编写一个正则表达式来匹配两者并捕获三中间的空隙。
但是,您需要保留现有proxy_redirect
语句来处理只有一个语句的情况。
与许多评估正则表达式的 Nginx 指令一样,顺序可能很重要,因此我会将更具体的表达式放在第一位。
例如:
proxy_redirect ~*(.*)/xyz/(.*)/xyz/(.*)$ $1/abc/$2/abc/$3;
proxy_redirect ~*(.*)/xyz/(.*)$ $1/abc/$2;