Discourse 官方关于子文件夹设置的声明
我们为企业级及以上的托管客户提供子文件夹设置支持。由于技术设置复杂性较高,除非您对自定义子文件夹设置非常有经验,否则我们强烈建议您不要使用此设置。
关键是您必须对以下内容有深入的了解:
- Discourse Docker 容器中的 NGINX 设置
- 使用代理链中的自定义标头安全地转发原始 IP
- 前置代理服务器中的速率限制
如果所有这些听起来对您来说很奇怪,我们强烈建议您避免这种设置。
要在您的域名上从子文件夹(也称为路径前缀)提供 Discourse 服务,例如 https://www.example.com/=SUBFOLDER=,请按以下步骤操作!
Docker 配置
在您的 Docker 容器 yml 文件的 env 部分,添加 DISCOURSE_RELATIVE_URL_ROOT 设置以及您想使用的子文件夹。请确保它不以 / 结尾。
编辑此项将更新整个指南。
env:
...
DISCOURSE_RELATIVE_URL_ROOT: /=SUBFOLDER=
run 部分需要进行一些更改,以便将所有 Discourse 路由发送到正确的位置。以下是一个包含子文件夹支持的完整 run 部分:
run:
- exec:
cd: $home
cmd:
- mkdir -p public/=SUBFOLDER=
- cd public/=SUBFOLDER= & ln -s ../uploads & ln -s ../backups
- replace:
global: true
filename: /etc/nginx/conf.d/discourse.conf
from: proxy_pass http://discourse;
to: |
rewrite ^/(.*)$ /=SUBFOLDER=/$1 break;
proxy_pass http://discourse;
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: etag off;
to: |
etag off;
location /=SUBFOLDER= {
rewrite ^/=SUBFOLDER=/?(.*)$ /$1;
}
- replace:
filename: /etc/nginx/conf.d/discourse.conf
from: $proxy_add_x_forwarded_for
to: $http_your_original_ip_header
global: true
$http_your_original_ip_header 代表 Your-Original-Ip-Header,这是一个您在源站设置的受信任的 Header,其中包含实际的客户端 IP。
这是必需的,因为流量会经过一个中央代理,如果 Discourse 恰好有一个公共 IP,则可以伪造它。如果 Discourse 是私有的,您可能可以使用 X-Forwarded-For。
完成这些更改后,像往常一样引导您的 Docker 容器,或者如果您正在更改现有容器,则重建它。
./launcher bootstrap app
或者
./launcher rebuild app
附件是一个独立的容器的完整示例 yml 文件。
subfolder-sample.yml (3.1 KB)
速率限制问题
如果您采用此设置,您可能需要在请求到达容器内的 NGINX 之前对其进行速率限制,这意味着您可能将避免使用我们的速率限制模板。在容器中配置 NGINX 以根据重新映射的 IP 进行限制非常困难,并且需要对模板进行复杂的更改。
现有帖子
如果您在现有站点(之前使用子域名)上执行此操作,您会发现上传的文件已损坏。有一个工具可以帮助修复所有路径以包含子文件夹。首先,进入 Docker 容器并导航到 Discourse 目录:
cd /var/discourse
./launcher enter app
cd /var/www/discourse
然后,在备份之后运行重映射命令:
RAILS_ENV=production bundle exec script/discourse remap '/uploads' '/=SUBFOLDER=/uploads'
另请参阅:Use a subfolder (path prefix) to serve Discourse with multiple servers sharing a domain 以了解更多晦涩的设置。
robots.txt
现在 Discourse 运行在子文件夹上,它无法提供其 robots.txt 文件来控制哪些路由被网络爬虫抓取。爬虫将查看您主站点的 robots.txt 文件(位于 https://www.example.com/robots.txt)。您需要复制 Discourse 的 robots.txt 文件内容(位于 https://www.example.com/=SUBFOLDER=/robots.txt)并将其放入您主站点的 robots.txt 文件中。