mod_rewrite - HTTP 到 HTTPS 重定向规则仅在通过 HTTP 访问后才有效

mod_rewrite - HTTP 到 HTTPS 重定向规则仅在通过 HTTP 访问后才有效

我在 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网站。这就是为什么当我清除缓存时它不起作用的原因。

相关内容