You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:31:09