Elastic Beanstalk下mod_rewrite HTTP转HTTPS时80端口未切443如何解决?
我完全懂你遇到的麻烦——当用户直接访问http://example.com时,虽然能被重定向到HTTPS,但URL里还带着80端口,导致Google OAuth的授权重定向地址变成了https://example.com:80/j_security_check,和你在控制台配置的不带端口的地址不匹配,直接触发了redirect_uri_mismatch错误。
这个问题的核心原因是Elastic Beanstalk的负载均衡器会保留原请求的Host头信息,而你的原rewrite规则里没有处理端口,导致重定向时把80端口带了过去。下面给你两个可行的修复方案,都是通过.ebextensions配置实现的:
方案一:明确指定443端口(最简单直接)
把你现有的ssl_rewrite.conf替换成下面的内容:
files: "/etc/httpd/conf.d/ssl_rewrite.conf": mode: "000644" owner: root group: root content: | LoadModule rewrite_module modules/mod_rewrite.so RewriteEngine On # 判断请求是否来自HTTP协议 RewriteCond %{HTTP:X-Forwarded-Proto} =http # 重定向时强制指定443端口,避免携带原80端口 RewriteRule ^ https://%{HTTP_HOST}:443%{REQUEST_URI} [L,R=permanent]
方案二:通过环境变量动态指定端口(更灵活)
如果以后端口有调整需求,这个方案更易维护:
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 # 使用预定义的环境变量指定HTTPS端口 RewriteRule ^ https://%{HTTP_HOST}:%{ENV:REDIRECT_HTTPS_PORT}%{REQUEST_URI} [L,R=permanent] # 设置环境变量为443 SetEnv REDIRECT_HTTPS_PORT 443
为什么原配置会失效?
原规则里的%{HTTP:Host}会完整保留用户请求时的Host头,包括端口号。当用户访问http://example.com时,Host头是example.com:80,所以重定向后的URL就变成了https://example.com:80/...,这自然和你在Google控制台配置的https://example.com/j_security_check不匹配了。
额外优化:让Tomcat识别HTTPS请求
为了避免应用内部生成错误的URL,你还可以给Tomcat添加配置,让它知道请求是通过负载均衡器的HTTPS转发过来的:
在.ebextensions里新增一个配置文件:
files: "/etc/tomcat9/conf/server.xml": mode: "000644" owner: tomcat group: tomcat content: | <!-- 这里保留你原server.xml的其他内容,只修改Connector节点 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" proxyName="example.com" proxyPort="443" scheme="https" secure="true"/>
这样Tomcat会默认使用HTTPS协议和443端口生成URL,进一步避免端口错误。
验证步骤
- 将修改后的配置文件放到应用的
.ebextensions目录下 - 重新部署你的Elastic Beanstalk应用
- 访问
http://example.com,检查重定向后的URL是否是https://example.com/...(不带80端口) - 测试Google OAuth登录流程,确认不再出现
redirect_uri_mismatch错误
内容的提问来源于stack exchange,提问作者Anish Sana

