如何在外部域名的子目录中运行 Discourse?

我们正从 WordPress 网站迁移至云托管电商平台,由于我们的 SEO 排名很高,新平台将直接使用我们的裸域名。

我想将文章迁移到 Discourse,并在同一域名下运行,这可行吗?

明确一下:http://ultraluz.com.br/ 将在我无法控制或访问的外部服务器上运行,因此我认为无法使用 nginx 技巧或其他方法。我仅能访问运行 Discourse 的服务器。

我的目标是将类似 http://ultraluz.com.br/iluminacao-para-esportes-como-deixar-as-instalacoes-esportivas-dignas-de-um-atleta-profissional/ 这样的文章迁移到 Discourse,同时保留原有路径,或者至少采用 domain/blog/same-url 的形式,而我的裸域名则指向并托管在类似 Wix 的平台上。

有可能在两个网站前面都使用 Cloudflare,并通过规则将子文件夹的流量路由到 Discourse。但我不知道是否有人这样做过。你可能需要雇佣专业人士,或者自行研究。请遵循此处关于子文件夹安装的主题讨论,以及 Cloudflare 相关的说明。

我以为“子文件夹对 SEO 更有利”这一观点已经过时了。我的建议是直接使用子域名,但如果你有预算,可以联系我或在 Marketplace 频道发帖咨询。

从技术上讲,你确实可以通过 Cloudflare 的企业版页面规则或 Workers 来实现子文件夹部分,但我对能否为这两者提供任何协助持相当怀疑的态度。

除了 DNS 之外,Cloudflare 在任何形式上都难以提供支持。

是的,Google 自己已经驳斥了将所有内容塞进单个域名下的 SEO 骗局。

在SEO方面,宁可谨慎一些。我不明白blog.domain如何能提升我的域名SEO效果,因此完全没必要使用独立的blog域名。

我一直在考虑遵循这份指南。我应该使用哪一个 assetsPathnames: ["/public/", "/assets/"]

子文件夹安装要复杂得多,而且非常脆弱。

关键在于,在同一个完全限定域名(FQDN)下运行没有任何好处,反而会带来显著更高的风险和成本。

你或许这么认为,但没有任何证据表明子域名能对主域名产生任何提升作用。

就连 Cloudflare 也建议将所有内容放在同一个域名下运行。

那么,请问,为什么他们的讨论社区会位于一个子域名上?

因为任何域名中包含 Cloudflare 的内容排名都会很好,而且他们的论坛规模庞大。

如果你是这样想的,那就请便吧。这里没有什么适合你的。去别的地方吧,去那些和你有同样信念的人所在的地方。

如果不受只能提供两个链接的限制,我可以提供包含数据支持的更多链接。除了 Cloudflare 这种规模庞大、无需特别关注 SEO 的网站外,该搜索结果第一页上的所有网站都使用了子目录。

要找到其他持相同观点的人并不困难,因为这似乎是 SEO 社区的共识。

不过,如果你有任何证据表明子域名有助于提升根域名的排名,请 enlighten 互联网吧:slight_smile

来自马特·卡茨的直接分享。你的 SEO“专家”正在向你兜售骗人的把戏。

多年来,我在团队中见过的最糟糕、最无能的人,无一例外都是那些所谓的“SEO 专家”。他们一致地成为整个行业的耻辱和尴尬。

没错!做一件大家都认为无助于提升网页排名的事,却很可能导致你的网站意外宕机且毫无明确的修复手段,这要糟糕得多。

有人试过用 Cloudflare 做这个吗?

正如我们已在您的其他主题中解释过的那样,您请求的操作在此无法得到支持。

您需要选择 Cloudflare 的企业版计划,或者创建自定义 Worker。无论哪种方式,您都应直接联系 Cloudflare。

如前所述,我之前给出的答案 就是您在这里能得到的全部信息。

我之前没有表达清楚的是,这是一项徒劳无功的任务。

作为参考,我可能会向您收取约 1000 美元的费用,但无法保证设置完成后能正常运行超过一周。(或者我可能收取 500 美元,但无法保证我能否解决这个问题。)

此外,您还需要 Cloudflare 企业版计划。

如果您感兴趣,请在 Marketplace 中发帖,注明您的预算,并表明您愿意支付 Cloudflare 企业版费用,同时理解这很可能无法实现。

我想我已经完成了 80% 的这项工作。我在子域名上以“常规”方式安装了 Discourse。

然后,我创建了一个 Cloudflare Worker,将 /blog 代理到我的子域名。虽然它能工作,但 Chrome 由于 CSP 策略拒绝加载部分内容。

有人有什么解决办法吗?等做到 100% 时,我会分享我的 Worker 代码。

你可以访问 https://ultraluz.com.br/blog 查看具体情况。

我的计划是,在修复这个问题后,我只需用 robots.txt 阻止 Google 索引我的子域名,这样它只会看到并索引 /blog,而我仍然可以随时正常访问子域名。

对于“正常”安装来说,这永远无法真正完美运行。你确实应该遵循子文件夹安装流程。这将解决你的 CSP 问题以及许多其他问题。除此之外,我认为你已接近成功了。

使用 DISCOURSE_RELATIVE_URL_ROOT 时,DISCOURSE_HOSTNAME 应该设置为什么?对我来说,相对根路径应该是 /blog 吗?

这对 SSL 相关设置有什么影响?这是我的 yml 文件中的 env 部分:

env:
  LANG: en_US.UTF-8
  DISCOURSE_RELATIVE_URL_ROOT: /forum

  VIRTUAL_HOST: forum.ultraluz.com.br
  VIRTUAL_PORT: 80
  LETSENCRYPT_HOST: forum.ultraluz.com.br
  LETSENCRYPT_EMAIL: redacted@email.com

  DISCOURSE_HOSTNAME: forum.ultraluz.com.br
  DISCOURSE_DEVELOPER_EMAILS: 'redacted@email.com'
  
  DISCOURSE_SMTP_ADDRESS: smtp.sendgrid.net
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: apikey
  DISCOURSE_SMTP_PASSWORD: "password"
  DISCOURSE_SMTP_ENABLE_START_TLS: true
  SSL_POLICY: Mozilla-Modern

这里的 letsencrypt 和虚拟主机配置是用于我的 nginx docker(jwilder/nginx-proxy),它会根据这些变量自动处理代理和 SSL 证书的生成。

另外,我之前还配置了以下内容,但我觉得它会被上面的代码完全覆盖:

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 172.18.0.0/24;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {

是的,包括斜杠在内的 /blog

不,只需要 ultraluz.com.br

我想你应该保留 LetsEncrypt 部分原样不动。

这种方式行不通。我想这是因为 Worker 需要域名来抓取内容,而根域名位于不同的 IP 上。

我基本上是在告诉 Worker:“当有人访问 /blog 时,从 rootdomain/blog 抓取内容”。当然,这只会显示我当前的 WordPress 404 错误页面。

我认为,由于涉及同一域名、多个 IP/服务器的情况,需要一个子域名来加载 Discourse 资源。但现在太晚了,我需要去睡觉了。

不过,我认为实现这一目标最简单的方法还是通过常规的子域名安装方式来修复 CSP 错误。