我有一个 Web 应用程序,用于处理需要公开披露的潜在敏感信息。不幸的是,它内置了自己专有的 Web 服务器,不支持 SSL。由于软件审批流程,我不得不使用 Apache 作为反向代理。
我几乎完全可以正常工作,通过 SSL 直接访问任何页面都可以完美运行,但 Web 服务器发送的重定向不会被重写。例如尝试访问根 URLhttps://frontend.example.tld:4000/当您未登录时应将您重定向至https://frontend.example.tld:4000/login但它却重定向到http://frontend.example.tld:4000/login这会导致 BadRequest。
我对此进行的所有谷歌搜索都表明过时的设置似乎在 apache2 中不再可用,并建议更改代理后面的应用程序来处理它(不幸的是这不是一个选项)。
这是我的 apache 配置的相关部分:
<IfModule mod_ssl.c>
Listen 4000
<VirtualHost *:4000>
ServerAdmin webmaster@localhost
ServerName frontend.example.tld
CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel info
SSLProtocol -ALL +SSLv3 +TLSv1
SSLCipherSuite ALL:!ADH:!EXPORT56:!EXP:!eNULL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2
SSLEngine on
SSLCertificateFile /etc/ssl/certs/frontend.crt
SSLCertificateKeyFile /etc/ssl/private/frontend.key
SSLCertificateChainFile /etc/ssl/certs/gd_bundle.crt
BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/
ProxyPassReverse / http://127.0.0.1:3000/
</VirtualHost>
</IfModule>
我在其他地方加载了代理和 proxy_http 模块。
更新:
以下是尝试重定向后收到的错误消息的内容:
错误的请求
您的浏览器发送了一个此服务器无法理解的请求。原因:您正在向启用 SSL 的服务器端口发送纯 HTTP 请求。请使用 HTTPS 方案访问此 URL。提示: https://frontend.example.tld/
答案1
似乎应用程序正在Location
根据传入标头的内容生成该标头Host
,这正是我们想要的(并由 实现ProxyPreserveHost
),但它不知道新位置的正确协议。
根据应用程序的工作方式,我们有几种处理此问题的选项:
- 转过头来
ProxyPreserveHost Off
看看是否有帮助;生成的Location
标题应该与您现有的标题相匹配ProxyPassReverse
,并相应地修改为正确的 URL,或者如果这不起作用; 添加新
ProxyPassReverse
行(保留旧行)尝试匹配并更改Location
应用程序正在发送的标头。ProxyPassReverse / http://frontend.example.tld:4000/
答案2
我遇到了类似的问题,我的配置中缺少以下几行,但它帮我解决了:
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
将这些行放在 之后SSLEngine On
。