mod_rewrite - 当明确请求 HTTP 时,端口 80 不会更改为 443

mod_rewrite - Port 80 does not change to 443 when HTTP is explicitly requested

我有一个部署到 Elastic Beanstalk 的应用程序,其 Tomcat 容器使用 Google OpenID Connect 进行身份验证。我想将所有 http 请求重定向到 https,为此我在 .ebextensions -

的文件中有以下 mod_rewrite 配置
files:
    "/etc/httpd/conf.d/ssl_rewrite.conf":
        mode: "000644"
        owner: root
        group: root
        content: |
            LoadModule rewrite_module modules/mod_rewrite.so
            RewriteEngine On
            RewriteCond %{HTTP:X-Forwarded-Proto} =http
            RewriteRule . https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent]

Google OAuth2 凭据控制台具有 https://example.com/j_security_check 作为授权重定向 URL。当请求 example.comhttps://example.com 时,配置工作正常,于是应用程序被重定向到提到的授权 URL.

然而,当 http 被明确请求时 - http://example.com - 应用程序被重定向到 httpsport 80 仍在使用。授权重定向 URL 然后变成 https://example.com:80/j_security_check 我得到 Error: redirect_uri_mismatch.

如何将端口更改为 443 的显式 http 请求重定向到 https?主要目标是匹配提到的授权重定向URL。如果可能的话,我想用 .ebextensions 配置文件或类似的解决方案来实现它。

你能不能像这样。如果成功了我会给你解释。

RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

问题不在于重写规则。该文件必须放置在 .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。这很重要!

另外,我得到的重定向不是真实的。我没有密切注意,因为当我请求 example.com 时,浏览器缓存正在为我服务 https://example.com。它实际上并没有将 http 请求重定向到 https