我已经看到如何使用反向代理正确处理相对 url - 但是我很难理解这一点(并将其应用于我的问题),希望有人能提供帮助。
假设我的服务器上有 Ubuntu 20.04 作为服务器操作系统,example.com
.
然后,我在服务器上安装https://github.com/hartwork/jawanndenn并运行它——这个应用程序默认运行在 8080 端口上;我可以通过运行以下命令来确认它是否在服务器本身上运行:
wget -O- http://127.0.0.1:8080
到目前为止,一切都很好。现在,我想要的是:而不是访问https://example.com:8080
来访问这个应用程序,我想访问https://example.com/jaw
- 我通常称之为/jaw
“子目录”,但它可能更准确地说是一个相对 URL。换句话说,如果我正确理解术语,https://example.com/jaw
将反向代理到https://example.com:8080
.
因此,我尝试在文件中的<VirtualHost *:443>
定义中执行此.conf
操作:
<Location /jaw>
Options -Multiviews -Indexes
RewriteEngine On
ProxyPass http://127.0.0.1:8080
ProxyPassReverse http://127.0.0.1:8080
SetOutputFilter proxy-html
ProxyHTMLURLMap http://127.0.0.1:8080
</Location>
RewriteRule ^/jaw$ /jaw/ [R]
这有效 - 从某种意义上说,应用程序的起始页面已加载;但是无法加载大量资源(.css、.js);在浏览器中打开控制台,我可以看到一堆 404 请求:
https://example.com/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/static/3rdparty/roboto-20/css/roboto.css
...
所以,我的猜测是,有一些 .js 文件或类似文件,它们只是想加载/static/...
->,如果从“端口”地址调用,它们会映射到http://127.0.0.1:8080/static/...
,一切都会好起来的;但是现在,因为我们被代理了:
- 浏览器请求
https://example.com/jaw
- Apache 得到它,将它转发到
https://example.com:8080
应用程序监听的地方 - 应用程序发回具有表单链接的文件 (.js)
/static/...
- 一旦这些返回到浏览器中,它们被解释为
https://example.com/static/...
- 在被用作服务器的请求之前,服务器无法找到它们
我也试过去掉<Location>
上面的整个片段,只在<VirtualHost *:443>
节点中使用它:
ProxyPass /jaw/ http://127.0.0.1:6789/
ProxyPassReverse /jaw/ http://127.0.0.1:6789/
与以前完全相同 - 加载了第一页,所有其他资源显然都引用到/static/...
并且它们都是 404。
最后,我也摆脱了上述陈述,并使用了这个:
ProxyPass /jaw/ http://127.0.0.1:8080
ProxyHTMLURLMap http://127.0.0.1:8080 /jaw
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
这具有完全相同的行为 - 第一页加载,资源失败 - 除了资源现在在浏览器控制台中列出为:
https://example.com/jaw/static/3rdparty/jquery-3.5.1/jquery-3.5.1.min.js
https://example.com/jaw/static/3rdparty/roboto-20/css/roboto.css
...
...并且他们因 502 代理错误而失败。所以发生了一些重写,但有些事情仍然不对劲。
所以我的问题是 - 我怎么能对 Apache 说,代理从127.0.0.1:8080 上的应用程序到显示为“子目录”(相对 URL?here /jaw
)的东西?
编辑:原来,502 代理错误是由于:
AH00898: DNS lookup failure for: 127.0.0.1:6789static returned by /poll/static/js/html.js
...很明显,缺少一个斜线;所以结果是这样的:
ProxyPass /jaw/ http://127.0.0.1:8080/
ProxyHTMLURLMap http://127.0.0.1:8080/ /jaw/
<Location /jaw/>
ProxyPassReverse /
ProxyPassReverse http://127.0.0.1:8080/
ProxyHTMLEnable On
ProxyHTMLURLMap / /jaw/
</Location>
...实际上确实有效-大部分(/static
资源);但是,有一个电话/data
不能被这个处理......所以它仍然是一个悬而未决的问题(对我来说)如何代理“一切”
使用正确的基本 URL 配置您的后端服务器。这比在代理上强制重写要容易得多。
设置应该是
JAWANNDENN_URL_PREFIX
。只需将其设置为/jaw
,所有 URL 都应正确生成。然后,您的第一个示例应该可以工作,即使没有 ProxyHTMLURLMap 和 OutputFilter。