Heroku新应用提交表单后从HTTPS重定向至HTTP的问题咨询
解决Heroku表单提交后从HTTPS跳转到HTTP的问题
1. 检查表单的Action属性
首先排查表单是否硬编码了HTTP协议的URL,比如:
<form action="http://your-app.herokuapp.com/search" method="GET">
改成相对路径(推荐)或者动态适配当前协议的URL:
<!-- 相对路径,自动继承当前页面的协议和域名 --> <form action="/search" method="GET"> <!-- 模板引擎动态生成(以Jinja2为例) --> <form action="{{ request.scheme }}://{{ request.host }}/search" method="GET">
2. 后端处理反向代理协议头(核心解决方法)
Heroku通过反向代理处理请求,后端收到的原始请求协议默认显示为HTTP,导致重定向时生成HTTP地址。需要让后端信任X-Forwarded-Proto头(Heroku用来传递用户真实请求协议的标识),并基于该头生成正确的HTTPS重定向URL。
不同框架的实现示例:
Express.js
开启代理信任,使用请求对象自带的protocol属性(自动读取X-Forwarded-Proto值):
app.set('trust proxy', true); // 信任Heroku的反向代理 app.get('/search', (req, res) => { // 处理搜索逻辑... // 重定向时用req.protocol获取用户真实请求的协议 res.redirect(`${req.protocol}://${req.get('host')}/results?query=${req.query.q}`); });
Django
在settings.py中添加配置:
# 信任Heroku传递的协议头 SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https') # 强制将所有HTTP请求重定向到HTTPS SECURE_SSL_REDIRECT = True
PHP
手动检查协议头,生成正确的重定向地址:
$protocol = isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' ? 'https' : 'http'; $redirectUrl = $protocol . '://' . $_SERVER['HTTP_HOST'] . '/results?q=' . urlencode($_GET['q']); header("Location: " . $redirectUrl); exit;
3. 启用HSTS(可选,增强长期安全性)
可以在后端设置HSTS响应头,强制浏览器后续所有请求都使用HTTPS:
- Express.js:使用
helmet中间件的hsts选项 - Django:设置
SECURE_HSTS_SECONDS = 31536000(有效期1年)
内容的提问来源于stack exchange,提问作者maybethebestprogrammer1
相关产品推荐
相关产品推荐

