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;
}
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-webroot.conf
chmod: 644
contents: |
set_real_ip_from 123.456.789.ABC; # 上游代理的 IP 地址
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;
有关保留最终用户 IP 地址的更多详细信息,请参阅 https://meta.discourse.org/t/handling-the-chain-of-trust-of-the-end-users-real-ip/406372。
进行这些更改后,像往常一样引导您的 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 文件中。

