我将NGINX作为反向代理运行在一些IIS托管的应用程序前面。我的目标是为特定的位置重写规则。问题是,在某些情况下,应用程序本身的响应是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部分应该处理这个问题,但在我的情况下却不这样做。
有什么办法可以让我的工作不改变应用程序本身(这将导致更大的变化.)?
任何帮助都是非常感谢的。
发布于 2020-03-02 10:37:14
如果文本序列/xyz/
的两个实例都需要用/abc/
替换,则需要组合一个正则表达式来匹配这两个实例,并捕获三个之间的空白。
但是,您需要保留现有的proxy_redirect
语句来处理只有一个的情况。
与许多计算正则表达式的Nginx指令一样,顺序可能很重要,所以我会将更具体的表达式放在首位。
例如:
proxy_redirect ~*(.*)/xyz/(.*)/xyz/(.*)$ $1/abc/$2/abc/$3;
proxy_redirect ~*(.*)/xyz/(.*)$ $1/abc/$2;
https://serverfault.com/questions/1004343
复制相似问题