要求: 我们最近将我们的网站(公司内部)升级为 https。但是,许多团队要求我们将 http 支持延长 30 天。这是为了让非技术用户能够更新他们的书签、要渗透的信息等。
设置: Apache 2.x Web 服务器反向代理请求到 Apache Tomcat 8 服务器。
Apache 配置: 为了支持 http,使用了下面的配置。
<VirtualHost *:80>
ServerName localhost:80
ProxyPass /appName http://localhost:8080/appName
ProxyPassReverse /appName http://localhost:8080/appName
</VirtualHost>
为了支持 https,
<VirtualHost *:443>
SSLEngine on
SSLProxyEngine on
ServerName domainname.com:443
SSLCertificateFile "${SRVROOT}/conf/ssl/cerSan.pem"
SSLCertificateKeyFile "${SRVROOT}/conf/ssl/certSan.key"
DocumentRoot "${SRVROOT}/htdocs"
# DocumentRoot access handled globally in httpd.conf
CustomLog "${SRVROOT}/logs/ssl_request.log" \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
<Directory "${SRVROOT}/htdocs">
Options Indexes Includes FollowSymLinks
AllowOverride AuthConfig Limit FileInfo
Require all granted
</Directory>
ProxyPass /appName http://localhost:8080/appName
ProxyPassReverse /appName http://localhost:8080/appName
</virtualhost>
Tomcat 配置:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" address="127.0.0.1"
redirectPort="8443" />
问题:每当应用程序执行
((HttpServletResponse) response).sendRedirect("/appName/pages/login.jsp");
在登录等过程中,应用程序会切换回 http。我理解这是按照规范工作的。
会发生什么 :
http://域名.com==>http://域名.com/应用程序名称
https://域名.com==>http://域名.com/应用程序名称
https://域名.com/appName==>https://域名.com/appName
我尝试了这里给出的方法回答通过添加额外的 tomcat 连接器并反向代理该端口。在这种情况下,会添加额外的上下文并返回 404 请求。
https:域名.com/appName ==> https:域名.com/appName/appName。
然后我尝试删除 apache 配置中的上下文。
ProxyPass / http://localhost:8080/appName
ProxyPassReverse / http://localhost:8080/appName
这导致
https://域名.com==> tomcat 默认登陆页面
我还阅读了其他一些博客文章,他们建议重写代码。由于其他优先事项,应用程序团队需要一周时间在代码中修复此问题。
同时有没有办法通过服务器级配置来处理这个问题?哪些额外/不同的配置可以帮助我们实现要求