Apache Proxypass 将“localhost:port”重定向为 url 字符串,而不是端口的本地服务

Apache Proxypass 将“localhost:port”重定向为 url 字符串,而不是端口的本地服务

环境

服务器版本:Apache/2.4.6(CentOS)


我有两台几乎重复的服务器。

aaa.com.bbb.com.

它们有几乎相同的 Apache 规则集。

aaa.com.配置

<Location "/serviceEndpoint/">
  ProxyPass http://localhost:8100/serviceEndpoint/
  ProxyPassReverse http://localhost:8100/serviceEndpoint/
</Location>
<Location "/fruit/apple">
  ProxyPass "/fruit/apple" "http://localhost:8100/serviceEndpoint/fruit/apple"
  ProxyPassReverse "/fruit/apple" "http://localhost:8100/serviceEndpoint/fruit/apple"
</Location>

所以/serviceEndpoint是一个使用 8100 端口的服务,并且/fruit/apple是它的一个 servlet。

bbb.com.配置

<VirtualHost _default_:80>
  ProxyPass "/serviceEndpoint/" "http://localhost:20100/serviceEndpoint/"
  ProxyPassReverse "/serviceEndpoint/" "http://localhost:20100/serviceEndpoint/"

  ProxyPass "/fruit/apple" "http://localhost:20100/serviceEndpoint/fruit/apple"
  ProxyPassReverse "/fruit/apple" "http://localhost:20100/serviceEndpoint/fruit/apple"
</VirtualHost>

看起来一样,但它在 VirtualHost:80 内,如果这有什么不同的话。
(*编辑我使用相同的配置进行了测试,但结果是一样的)

问题

两者aaa.com/fruit/apple或都bbb.com/fruit/apple运作良好。

但是,当服务使用response.sendRedirect()(java)并将浏览器重定向到时/fruit/apple
aaa.com.有效并尝试从客户端浏览器bbb.com.连接文字。http://localhost:20100/fruit/apple

aaa.com重定向响应标头

HTTP/1.1 302
Date: Mon, 09 May 2022 08:01:29 GMT
Server: Apache
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=63072000; includeSubDomains
Location: /fruit/#!/some_controller
Content-Length: 0
Set-Cookie: JSESSIONID=4EA61F0E6031621E540DBDC9F6C54D64; Path=/serviceEndpoint; HttpOnly
Set-Cookie: JSESSIONID=4EA61F0E6031621E540DBDC9F6C54D64; Secure; HttpOnly; SameSite=Strict
X-XSS-Protection: 1; mode=block
Keep-Alive: timeout=15, max=95
Connection: Keep-Alive

bbb.com重定向响应标头

HTTP/1.1 302
Date: Mon, 09 May 2022 08:01:29 GMT
Server: Apache-Coyote/1.1
X-Frame-Options: SAMEORIGIN
Strict-Transport-Security: max-age=63072000; includeSubDomains
Location: http://localhost:20100/fruit/#!/some_controller
Content-Length: 0
Set-Cookie: JSESSIONID=4EA61F0E6031621E540DBDC9F6C54D64; Path=/serviceEndpoint; HttpOnly
Set-Cookie: JSESSIONID=4EA61F0E6031621E540DBDC9F6C54D64; Secure; HttpOnly; SameSite=Strict
Keep-Alive: timeout=15, max=95
Connection: Keep-Alive

问题

从 Apache 设置来看,什么可能导致这种行为以及我应该如何修复它?

答案1

ProxyPassReverse 指令定义 Apache 在后端响应中最正确的 URL 路径的范围,以确保向网站访问者提供与其对 Apache 的请求相匹配的正确 URL

ProxyPassReverse "/fruit/apple" "http://localhost:20100/serviceEndpoint/fruit/apple"

响应bbb.example.com重定向至

 Location: http://localhost:20100/fruit/#!/some_controller
                                       \
                                        `- "apple" is missing . 

因此,LocationProxyPassReverse 指令不会更正该标头。

这似乎是后端应用程序没有创建正确的自引用 URL,您需要在后端应用程序中解决这个问题,或者您做出了错误的假设,您的 apache 配置应该是:

ProxyPass "/fruit/" "http://localhost:20100/serviceEndpoint/fruit/"
ProxyPassReverse "/fruit/" "http://localhost:20100/serviceEndpoint/fruit/"

答案2

这是 Tomcat 的不同之处。Tomcat 8.0 重定向到 localhost,而 8.5 则正常重定向。

相关内容