我有一个Web应用程序来处理潜在的敏感信息,需要更公开的暴露。 不幸的是,它内置了自己的专有networking服务器,不支持SSL。 由于软件审批过程,我必须使用Apache作为反向代理。
我几乎完全工作,直接访问任何页面上的SSL完美的作品,但redirect发送的Web服务器不被重写。 例如,尝试访问根URL :https://frontend.example.tld:4000 /当您未login时,应该将您redirect到https://frontend.example.tld:4000 / login ,而是将其redirect到http: //frontend.example.tld:4000/login导致BadRequest。
我所做的所有Googlesearch结果都显示过时的设置似乎并不在apache2中可用,而是build议更改应用程序后面的代理来处理它(不幸的是这不是一个选项)。
这里是我的apacheconfiguration的相关部分:
<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和proxy_http模块。
更新:
以下是尝试redirect后收到的错误消息的内容:
错误的请求
您的浏览器发送了此服务器无法理解的请求。 原因:您正在向使用SSL的服务器端口说纯HTTP。 请使用HTTPSscheme访问此URL。 提示: https://frontend.example.tld/
似乎应用程序正在根据传入Host头的内容生成Location头,这是我们想要的(并且可以通过ProxyPreserveHost ),但是它不知道新位置的正确协议。
基于应用程序似乎正在工作的方式,我们有几个选项来处理这个问题:
ProxyPreserveHost Off ,看看是否有帮助; 生成的Location标题应该匹配您现有的ProxyPassReverse并相应地修改为正确的URL,否则不起作用; 添加一个新的ProxyPassReverse行(保留旧的)以尝试匹配和更改应用程序发送的Location标题。
ProxyPassReverse / http://frontend.example.tld:4000/
我遇到了一个类似的问题,下面的行在我的configuration上丢失了,它解决了我:
SSLProxyEngine On SSLProxyVerify none SSLProxyCheckPeerCN off
将这些行SSLEngine On 。