NGINX 反向代理重写规则与 proxy_redirect

NGINX 反向代理重写规则与 proxy_redirect

我在一些 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;

相关内容