如何让 nginx 重写 HTTP 正文内容中的 URI?

Ste*_*HHH 15 nginx reverse-proxy

这是我之前关于如何使 nginx 反向代理 302 重定向到 URI 子文件夹而不是 root 的问题的后续。

我有一个使用Nginx上的代理服务器rewriteproxy_pass指令来代理外部请求的URL就像https://domain.com/my/web/app/在一个局域网内部的服务器https://10.0.0.22/。这是我用 ASCII UML 表示翻译的尝试:

                                    .-------------.       .------------------.
                                    | Nginx proxy  |      | Local web server |
                                    | (domain.com) |      | (10.0.0.22)      |
                                    '-------------'       '------------------'
                                               |                 |
                                               |                 |
GET https://domain.com/my/web/app/ ----------->|                 |
                                               |---------------->| GET /
                                               |                 |
                                               |<----------------| 302 redirect /login.php
302 redirect /my/web/app/login.php <-----------|                 |
                                               |                 |
GET https://domain.com/my/web/app/login.php -->|                 |
                                               |---------------->| GET /login.php
                                               |                 |
                                               |<----------------| 200
HTML body content (images, CSS, links) <-------|
Run Code Online (Sandbox Code Playgroud)

这是我的 nginx 配置文件中的实际位置块:

location ^~ /my/web/app/
{
    proxy_buffering   off;
    rewrite           /my/web/app/(.*) /$1 break;
    proxy_pass        https://10.0.0.22/;
    proxy_redirect    default;
}
Run Code Online (Sandbox Code Playgroud)

它非常适用于 HTTP 请求和响应的内部和外部 URI 路径之间的 URI 转换,但不会转换 HTML 内容(正文图像、CSS、脚本)中的任何 URI。

例如,具有嵌入在 HTML 响应中的相对路径的图像(带有 /images/logo.png 之类的 URI)被传递回 Web 客户端并被解释为https://domain.com/images/logo.png而不是https://domain.com/my/web/app/images/logo.png

我可以理解为什么会发生这种情况,但是如果有一种方法可以动态代理内容和请求,那就太好了。有没有办法让 nginx 也转换嵌入在 HTML 内容中的 URI?是否可以在通过代理服务器时动态解析和更新 HTML 内容?

小智 5

到目前为止,我找到的唯一解决方案是HttpSubsModule(另请参阅github 页面)。

该模块不是官方 Nginx 源代码的一部分,因此您可能需要自己构建 Nginx 才能使用该模块。