我一直在尝试使用 apache 2 mod_proxy 和 proxypass & proxypassreverse 指令来设置反向代理。
我正在安装 WSO2 Identity Server 并希望使用如下 URL 访问该应用程序。
hxxp://myserver.domain.com/wso2/
可myserver.domain.com
在互联网上访问
在我的网络内部,我已经在我的 apache2 配置中设置了一个虚拟主机,其参数如下:
由于各种原因,端口 80 不可用,虚拟主机必须保持为:8080。
最后,这是我的虚拟主机配置
<VirtualHost *:8080>
<Location /wso2/>
ProxyPass hxxps://internal.wso2.node:9443/
ProxyPassReverse hxxs://internal.wso2.node:9443/
</Location>
ProxyVia On
ProxyPreserveHost Off
ProxyAddHeaders Off
ProxyRequests Off
SSLProxyEngine On
SSLProxyCheckPeerCN Off
</VirtualHost>
问题:
我可以使用我的网络浏览器( Firefox / Chrome )请求http://myserver.domain.com/wso2/资源。在我的日志文件中,我看到请求确实击中了 apache 服务器,并且虚拟主机捕获了 /wso2/ 位置。
它通过代理并登陆 internal.wso2.node 服务器。但是,产品 WSO2 IS 执行了几次重定向,在日志文件中我看到它请求带有端口的资源。
以下是请求流程
hxxp://myserver.domain.com/wso2/ -> hxxps://internal.wso2.node:9443/
REDIRECT x3
hxxps://internal.wso2.node:8080/carbon ->
hxxps://internal.wso2.node:8080/carbon/admin/login.jsp
Back to my web browser
hxxp://myserver.domain.com:8080/wso2/carbon/admin/login.jsp
由于某种原因,apache 响应将其虚拟主机附加到我请求的 url 上。
如果我手动删除端口:8080 并在浏览器中再次请求完整 URL,它将可以正常访问资源。但是,任何仅使用以下方式访问的尝试都会失败:http://myserver.domain.com/wso2/将导致重定向和附加端口。
答案1
只要你在执行 ProxyPass 时更改 URI,你可能需要重写 cookie
<VirtualHost *:8080>
ServerName myserver.domain.com
ProxyVia On
ProxyPreserveHost Off
ProxyAddHeaders Off
ProxyRequests Off
SSLProxyEngine On
SSLProxyCheckPeerCN Off
ProxyPass /wso2/ https://internal.wso2.node:9443/
ProxyPassReverse /wso2/ http://myserver.domain.com:8080/
ProxyPassReverseCookiePath / /wso2
ProxyPassReverseCookieDomain internal.wso2.node myserver.domain.com
</VirtualHost>
通常 ProxyPassReverse 有点棘手(至少对我来说),并且可能你需要ProxyPassReverseCookiePath
,以防万一ProxyPassReverseCookieDomain
(重写你的 cookie 来维持会话)。