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.com
或 https://example.com
时,配置工作正常,于是应用程序被重定向到提到的授权 URL.
然而,当 http
被明确请求时 - http://example.com
- 应用程序被重定向到 https
但 port 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
。
我有一个部署到 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.com
或 https://example.com
时,配置工作正常,于是应用程序被重定向到提到的授权 URL.
然而,当 http
被明确请求时 - http://example.com
- 应用程序被重定向到 https
但 port 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
。