我在 Elastic Beanstalk 上部署了一个 Tomcat 8 应用程序,它使用我主应用程序的子域。两者都是独立的应用程序,不会交互。我有一条mod_rewrite
规则将所有http
请求重定向到文件夹https
中的配置文件中.ebextensions
-
files:
"/etc/httpd/conf.d/httpd_redirect.conf" :
mode: "000644"
owner: root
group: root
content: |
LoadModule rewrite_module modules/mod_rewrite.so
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://sub.domain.com%{REQUEST_URI} [L,R]
sub.domain.com
因此理想情况下,访问或应用程序的用户http://sub.domain.com
将被重定向到https://sub.domain.com
。
问题是,这只有在我https
首先使用 请求应用程序后才会起作用。因此,我必须https://sub.domain.com
先请求,然后non-https
请求将被重定向到https
。
此外,这只有在我清除浏览器缓存之前才有效。清除缓存后,non-https
请求不再重定向到https
。我再次发出https
请求,以便重定向开始工作。
这可能是什么原因造成的?如果重要的话,主域使用与子域不同的证书。
我如何强制应用程序始终使用https
?
我在负载均衡器上启用了一个安全侦听器,配置文件如下.ebextensions
:
option_settings:
aws:elb:listener:443:
SSLCertificateId: arn:aws:acm:us-east-2:1234567890123:certificate/####################################
ListenerProtocol: HTTPS
InstancePort: 80
答案1
问题不在于重写规则。文件必须放在特定路径中.ebextensions
才能在 Tomcat 8 中工作。配置文件也必须以不同的方式设置。提供的大多数示例都不适用于 Tomcat,所以我最终把它们放在了错误的位置。
有效的方法-
到位/.ebextensions/httpd/conf.d/myconf.conf
-
LoadModule rewrite_module modules/mod_rewrite.so
并在/.ebextensions/httpd/conf.d/elasticbeanstalk/00_application.conf
,地方 -
<VirtualHost *:80>
<Proxy *:80>
Order Allow,Deny
Allow from all
</Proxy>
ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on
RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} =http
RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]
ErrorLog /var/log/httpd/elasticbeanstalk-error_log
</VirtualHost>
请注意使用.conf
文件而不是.config
。这很重要!
此外,我得到的重定向错误感觉是由于浏览器缓存为我提供该https
网站。这就是为什么当我清除缓存时它不起作用的原因。