使用AWS Rewrite规则重定向HTTP到HTTPS时请求未走ProxyPass指向默认Webroot
看起来你的问题出在重定向规则和ProxyPass配置的配合上——当ELB转发请求到EC2的Apache时,你的重定向规则可能优先触发,但后续的ProxyPass规则没有被正确匹配到。这里给你一步步的解决方案:
1. 合并重定向与ProxyPass配置到同一VirtualHost
多个同ServerName的VirtualHost会让Apache优先匹配第一个,导致ProxyPass规则被忽略。把所有规则放到同一个<VirtualHost *:80>块里:
<VirtualHost *:80> # 替换成你的实际域名 ServerName your-domain.com ServerAlias www.your-domain.com # HTTP转HTTPS重定向(仅当ELB传递的原始协议是HTTP时触发) RewriteEngine On RewriteCond %{HTTP:X-Forwarded-Proto} =http RewriteRule .* https://%{HTTP:Host}%{REQUEST_URI} [L,R=permanent] # 处理ELB转发的HTTPS请求(原始协议为HTTPS时,执行ProxyPass) ProxyPass /your-proxy-path http://your-backend-target/path ProxyPassReverse /your-proxy-path http://your-backend-target/path </VirtualHost>
2. 确认必要的Apache模块已加载
Apache需要启用mod_rewrite、mod_proxy和mod_proxy_http才能让重定向和反向代理正常工作:
- 运行命令检查模块状态:
# Ubuntu/Debian系统 apache2ctl -M # RHEL/CentOS/Amazon Linux系统 httpd -M - 如果模块未加载,执行以下命令启用:
# Ubuntu/Debian sudo a2enmod rewrite proxy proxy_http # RHEL/CentOS/Amazon Linux sudo systemctl restart httpd
3. 重启Apache并验证配置
- 重启服务让新配置生效:
sudo systemctl restart apache2 # Ubuntu/Debian sudo systemctl restart httpd # RHEL/CentOS - 测试请求是否正常:
- 模拟ELB转发的HTTP请求:
应该返回301永久重定向到curl -H "X-Forwarded-Proto: http" http://your-ec2-private-ip/your-proxy-pathhttps://your-domain.com/your-proxy-path - 模拟ELB转发的HTTPS请求:
应该返回后端服务的内容,而非默认网站根目录curl -H "X-Forwarded-Proto: https" http://your-ec2-private-ip/your-proxy-path
- 模拟ELB转发的HTTP请求:
额外检查:ELB头部传递
确保你的ELB配置中已开启转发客户端IP和HTTP头部的选项,这样X-Forwarded-Proto等关键头部才能正确传递到EC2的Apache,否则重定向规则会失效。
内容的提问来源于stack exchange,提问作者kz2014
相关产品推荐
相关产品推荐

