如何为 cookie _forum_session 设置 secure 标志

你好,
我们的网站应同时支持 HTTP 和 HTTPS,我们需要为 Cookie(_forum_session)启用安全设置。目前该 Cookie 仅设置了 HttpOnly 标志,缺少 Secure 标志。如何配置以同时启用 Secure 标志?

谢谢

您应该将网站设置为仅通过 HTTPS 运行。

Discourse 代码中无法修改吗?

@mevaha

多年来,网页领域的趋势是仅使用 HTTPS。

过去这曾是个问题,直到像 Let’s Encrypt (LE) 这样的组织开始免费提供 SSL 证书,并提供了一套强大的证书管理机制。

当使用 LE(通过 certbot)在你的网站上配置证书时,它会自动设置 HTTP 和 HTTPS,并将所有 HTTP 流量自动重定向到 HTTPS。

当然,你可以找到方法让 Discourse 仅运行在 HTTP 上,但这不会得到官方支持,仅限于 Discourse 开发环境;因为如果没有 HTTPS,所有用户登录信息(包括密码)都将以未加密的形式在网络上传输。这在生产环境中是不支持的

可以这样理解:HTTPS 就像汽车上的安全带。那些选择不开安全带驾驶的人需自行承担风险;因此汽车制造商不会再生产不带安全带的汽车。

Discourse 也是如此。Discourse 的设计目标是在生产环境中安全运行;因此,在生产环境中受支持的 Discourse 版本必须使用 HTTPS。

希望这能帮到你。

抱歉没能提供更具体的帮助。

感谢 @neounix。我们的问题是 HTTPS 证书由负载均衡器管理,且 Discourse 与负载均衡器之间仅开放了 80 端口。我们尝试将 HTTP 重定向到 HTTPS 但未成功,能否请您分享一下 Discourse 中关于 cookie 的配置文件?

谢谢

你好 @mevaha

如果是这种情况,那么很可能在你的负载均衡器前面(或作为负载均衡器的一部分)有一个反向代理。

让我解释一下。

反向代理(如果你有负载均衡器,则包括它)使用 HTTP 与后端的 Discourse 进行通信。

所以你说得对,Discourse 仅使用 HTTP 进行通信,但只是与反向代理通信,而不是直接与外部世界通信。

流程如下:

WEB 用户  <-----> HTTPS  <-----> 反向代理 <----> HTTP <----> 负载均衡器 <----> DISCOURSE (DOCKER)

因此,你可以像你所讨论的那样,将你的 DISCOURSE Docker 容器暴露为 80 端口(仅 HTTP)。

不过,在面向网站的这一侧,你需要一个反向代理,它将 HTTPS 请求通过 HTTP 转发到后端。

如果你的反向代理(含负载均衡器)配置正确,它将确保 HTTP Cookie 和头部信息能够正确地在前后端之间传递。

希望这能帮到你。

如果你还有更多问题,请随时提问。

请注意,如果你能提供你架构的确切技术细节,我们将更容易为你提供帮助;因为我们没有水晶球应用程序可用 :slight_smile:

非常感谢 @neounix