环境
服务器版本: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 .
因此,Location
ProxyPassReverse 指令不会更正该标头。
这似乎是后端应用程序没有创建正确的自引用 URL,您需要在后端应用程序中解决这个问题,或者您做出了错误的假设,您的 apache 配置应该是:
ProxyPass "/fruit/" "http://localhost:20100/serviceEndpoint/fruit/"
ProxyPassReverse "/fruit/" "http://localhost:20100/serviceEndpoint/fruit/"
答案2
这是 Tomcat 的不同之处。Tomcat 8.0 重定向到 localhost,而 8.5 则正常重定向。