我正在使用 Apache 容器作为反向代理,并尝试访问我的一个 VM 服务。当我进行如下配置时,它就可以正常工作:
ProxyPassMatch "^/(.*)$" "https://host1:443/$1"
ProxyPassReverse "^/(.*)$" "https://host1:443/$1"
使用上述配置,我可以访问 https://host1:443/* 的所有 URL。但是当我想通过显式 Worker 访问时,
ProxyPassMatch "^/sample/(.*)$" "https://host1:443/$1"
ProxyPassReverse "^/sample/(.*)$" "https://host1:443/$1
它说“在此服务器上找不到请求的 URL /p/login/。”我尝试了很多解决方案,但无法工作。
答案1
ProxyPassMatch "^/sample/(.*)$" "https://host1:443/$1"
/sample/
当您仅反向代理到 host1 时,以 的请求开头的 URI 路径/p/login/
不应被转发。 的请求/p/login/
将由您的 apache 本地处理,不会到达 host1。
当该路径/URI 不存在于你的 Apache 容器中时,会触发 404 - 文件未找到错误“该服务器上未找到所请求的 URL /p/login/。”
您通常会收到这样的错误,因为 host1 上的 HTML 代码链接到绝对路径 /p/login/
,而一个常见的误解是反向代理会/sample/p/login/
通过使用ProxyPassReverse
指令。ProxyPassReverse
不会这样做。它只会调整 中的 URL Location
,Content-Location
并且URI
标题;并且不在正文/HTML 代码中。
有几种方法可以解决这个问题;详情见这个答案(请注意,您的问题和答案都标有 apache 版本2.2
;该问题中的另外两个答案为当前版本提供了解决方案2.4
)