Jarland
(Jarland Donnell)
1
希望有人能提供一些建议,我将不胜感激。让我先说明一下情况。
我已经在自己的域名 hostballs[.]com 上多次部署 Discourse。每次访问 www[.]hostballs[.]com 时,都会顺利重定向到 hostballs[.]com,这是因为 Let’s Encrypt 证书同时覆盖了带 www 和不带 www 的域名。据我所知,这是 Discourse 配合其 Let’s Encrypt 实现时的默认标准行为。
然而,我当前新安装的 Discourse 只为非 www 站点(即配置中设定的 URL)设置了 SSL,并未覆盖 www 域名。这意味着访问 www[.]hostballs[.]com 的用户不会被重定向,而是会看到 SSL 错误。鉴于我知道默认行为并非如此,而且 Discourse 的安装过程过于受控,我不愿直接调用 certbot 手动操作(那样会让定期更新变得麻烦),因此不确定最佳解决路径是什么。
在尝试解决此问题时,我在 app.yml 中注释掉了 ssl 和 letsencrypt 模板,以及 letsencrypt 的邮箱地址。随后,我从 /shared/standalone 目录中删除了 letsencrypt 和 ssl 文件夹。我先重建站点(不带 SSL),然后在 app.yml 中重新启用这些选项并再次重建,以生成新的 SSL 证书和配置。虽然操作成功,但 www 问题仍未解决。
是否有人遇到过类似情况并找到了解决方案?
2 个赞
没问题!这虽然需要多花一点功夫,但操作很直接,而且是一个非常常见的使用场景。请参考:
然后:
5 个赞
Stephen
(Stephen)
3
如果上述建议让你感到有些畏难,你也可以设置一个简单的 DNS 重定向。大多数域名注册商都提供此服务。
Discourse 无法通过多个 URL 发布,根记录(非 www)和 www 的 ‘A’ 记录是不同的地址。一旦你为网站指定了一个 FQDN,任何额外的地址都需要通过重定向来处理。
4 个赞
pfaffman
(Jay Pfaffman)
4
如果您不喜欢已经提供的任一建议,可以选择使用 www.example.com,并通过 http://forcewww.com/ 将流量重定向到带 www 的网站。
4 个赞
Jarland
(Jarland Donnell)
5
谢谢大家。让我总结一下一些细节,或许未来能帮到其他人。
起因是一位用户告诉我,访问 www 不行,会出现证书错误。当我直接访问他在报告帖中提供的 https 链接时,也遇到了同样的问题。过去我使用 www 时并未遇到这种情况,而是会毫无问题地重定向到根域名。这让我得出结论:我最近迁移后的安装可能出现了问题,行为不符合 Discourse 新安装的默认特性。
于是,我在一个新域名上安装了 Discourse 的干净副本,旨在验证在使用根域名时,www 是否默认能正常工作。我访问该域名,然后在地址栏中编辑 URL,在其前面加上“www.”。它像预期那样毫无问题地重定向到了根域名。接着,我想再试一次。我手动在地址栏中输入了“https://”。结果却出现了同样的证书错误。
因此,我之前之所以认为在 Discourse 的 Let’s Encrypt 实现中为 www 配置证书是默认行为,很可能是因为我的浏览器默认使用了 80 端口,同时在我在地址栏重写 URL 时隐藏了 URL 中的 http/https 部分。
至少这是我目前对情况的最佳评估。
1 个赞
Stephen
(Stephen)
6
是的,任何访问您服务器 IP 地址 80 端口的请求都会被重定向到实际的 FQDN 并使用 HTTPS 连接,www 并不是特例。
2 个赞
Jarland
(Jarland Donnell)
7
对于使用根域名并希望让 www 子域名由 Let’s Encrypt 签发证书以实现正确的 HTTPS 重定向,同时又不想过度复杂化或借助其他 Web 服务器来管理重定向的用户,最简单的修复方法如下:
将以下内容:
issue_cert() {
LE_WORKING_DIR=“${LETSENCRYPT_DIR}” $$ENV_LETSENCRYPT_DIR/acme.sh --issue $2 -d $$ENV_DISCOURSE_HOSTNAME --keylength $1 -w /var/www/discourse/public
}
修改为:
issue_cert() {
LE_WORKING_DIR=“${LETSENCRYPT_DIR}” $$ENV_LETSENCRYPT_DIR/acme.sh --issue $2 -d $$ENV_DISCOURSE_HOSTNAME -d www.$$ENV_DISCOURSE_HOSTNAME --keylength $1 -w /var/www/discourse/public
}
文件路径为:
/var/discourse/templates/web.letsencrypt.ssl.template.yml
之后当然需要执行:
./var/discourse/launcher rebuild app
Stephen
(Stephen)
8
这并非解决方案,因为一旦模板更新,所做的更改就会被清除,仅凭这一点就不建议这样做。
如果您想修改容器内的文件,请在您的 app.yml 中使用钩子(hooks)。
1 个赞
Jarland
(Jarland Donnell)
9
嗯,我没看到有什么方法能在实现的同时避免在更新时出问题。这似乎就是那些为社区使用独立域名、又不喜欢多余子域的人所面临的困境。
当然,除非你在别处再运行一个 Web 服务器。
Jarland
(Jarland Donnell)
11
好的,我已经看到一个尝试,但因文件被修改而中断,这破坏了他们在 app.yml 中设置的修改文件的方式:
无论我们是直接编辑文件,还是让 app.yml 在之后进行编辑,更新都有可能更改该文件,从而破坏您的编辑方式。
Stephen
(Stephen)
12
我的意思是,对该模板的任何修改都会再次导致其失效。在过去几年中,只有一项修改破坏了 PUPS/hooks 方法,那就是增加了对 ECC 的支持。
3 个赞
system
(system)
关闭
13
This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.