Halo 域名主题路由插件 完整配置手册
插件地址:https://www.halo.run/store/apps/app-rgfjzxsx
适用环境:1Panel + Docker 部署 Halo-Pro,多域名共用同一个 Halo 实例,根据访问域名自动切换站点主题
⚠️ 核心原理:依靠 Nginx 反向代理传递 Host、X-Forwarded-Host 请求头,插件读取请求头识别当前访问域名,匹配预设绑定规则。 缺少 / 传错这两个请求头,插件无法识别域名,主题切换失效。
一、前置准备
所有域名 DNS 解析到当前服务器公网 IP
服务器安全组 / 防火墙开放 80、443 端口
域名 SSL 证书已申请并在 1Panel 网站配置完成
Halo 容器正常运行,状态 healthy
在 Halo 应用市场安装【域名主题路由】插件
二、1Panel Nginx 反向代理配置(关键步骤)
警告:不要使用 1Panel 可视化反向代理新增location /,会出现duplicate location "/"重复 location 报错,直接编辑网站配置文件
进入 1Panel → 网站 → docs.jingdiekeji.com → 切换【配置文件】标签,全选原有内容,替换为下方完整 Server 配置
server {
listen 80 ;
listen 443 ssl ;
server_name docs.jingdiekeji.com app.jingdiekeji.com nav.jingdiekeji.com;
index index.php index.html index.htm default.php default.htm default.html;
access_log /www/sites/docs.jingdiekeji.com/log/access.log main;
error_log /www/sites/docs.jingdiekeji.com/log/error.log;
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404;
}
location ^~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_ssl_server_name off;
proxy_ssl_name $proxy_host;
proxy_pass http://172.18.0.3:8090;
}
http2 on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
ssl_certificate /www/sites/docs.jingdiekeji.com/ssl/fullchain.pem;
ssl_certificate_key /www/sites/docs.jingdiekeji.com/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
add_header Strict-Transport-Security "max-age=31536000";
}
配置修改要点说明
proxy_pass http://172.18.0.3:8090;:填写 Halo 容器内网 IP,禁止使用 127.0.0.1,OpenResty 在 Docker 容器内,127.0.0.1 指向自身。
proxy_set_header X-Forwarded-Host $host;:必须是\(host,不能写\)server_name,$host 代表用户真实访问域名,插件依靠该 Header 识别域名。
保留Connection upgrade和Upgrade:用于 Halo 后台 WebSocket 实时通信,后台编辑器、通知功能依赖此项。
保存后,1Panel 自动校验 Nginx 配置,无报错即代表 Nginx 配置生效。 ⚠️ 注意:Halo 容器重启后内网 IP 可能变动,出现 502 Bad Gateway 时,进入容器页面查看新 IP 并更新proxy_pass地址。
三、Halo 后台基础设置
登录 Halo 后台 → 【系统设置】→【基本设置】
外部访问地址(站点 URL):填写主域名 https://docs.jingdiekeji.com
多域名场景只需要填写主站点 URL,域名主题路由插件会接管多域名识别,无需修改此项为多个地址。
保存设置。
四、域名主题路由插件后台配置
Halo 后台 → 【插件】→ 找到【域名主题路由】→ 点击【设置】
点击【添加绑定】,逐个添加域名绑定规则:
表格
⚠️ 填写规则:访问域名只填写纯域名,不要加 http/https,不要带末尾斜杠。 每个域名单独一条绑定记录,绑定的主题需要提前在【主题管理】中安装并存在。
全部添加完成后保存插件配置。
五、验证测试步骤
分别打开浏览器无痕窗口访问 3 个域名:
观察每个域名加载的主题是否和插件绑定设置一致。
辅助校验(查看请求头):浏览器 F12 开发者工具 → Network,查看请求的 Request Headers,确认Host和X-Forwarded-Host为当前访问域名。
六、常见故障排查
1. 访问出现 502 Bad Gateway
2. 所有域名都只显示同一个主题,切换失效
99% 为请求头传递错误,按顺序检查:
Nginx 配置内 X-Forwarded-Host 是否设置为 $host,不是$server_name
保存 Nginx 配置,确认 Nginx 重载成功无报错
插件绑定的域名拼写是否完全一致,没有多余 http、斜杠、空格
绑定规则【启用状态】已打开,选中的主题已安装
3. 后台跳转异常,域名变成 172.18.0.3:8090
4. 静态资源(图片、CSS)404
七、维护备注
Halo 容器重启后,Docker 内网 IP 可能发生变化。网站出现 502 报错时优先排查容器 IP。 新增域名:在 Nginx 的server_name追加域名,再到插件后台新增一条域名 - 主题绑定记录即可。
<p style=""></p><h1 style="" id="halo-%E5%9F%9F%E5%90%8D%E4%B8%BB%E9%A2%98%E8%B7%AF%E7%94%B1%E6%8F%92%E4%BB%B6-%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E6%89%8B%E5%86%8C">Halo 域名主题路由插件 完整配置手册</h1><p style="">插件地址:<a href="https://www.halo.run/store/apps/app-rgfjzxsx">https://www.halo.run/store/apps/app-rgfjzxsx</a></p><p style="">适用环境:1Panel + Docker 部署 Halo-Pro,多域名共用同一个 Halo 实例,根据访问域名自动切换站点主题</p><blockquote><p style="">⚠️ 核心原理:依靠 Nginx 反向代理传递 Host、X-Forwarded-Host 请求头,插件读取请求头识别当前访问域名,匹配预设绑定规则。 缺少 / 传错这两个请求头,插件无法识别域名,主题切换失效。</p></blockquote><h2 style="" id="%E4%B8%80%E3%80%81%E5%89%8D%E7%BD%AE%E5%87%86%E5%A4%87">一、前置准备</h2><ol><li><p style="">所有域名 DNS 解析到当前服务器公网 IP</p></li><li><p style="">服务器安全组 / 防火墙开放 80、443 端口</p></li><li><p style="">域名 SSL 证书已申请并在 1Panel 网站配置完成</p></li><li><p style="">Halo 容器正常运行,状态 healthy</p></li><li><p style="">在 Halo 应用市场安装【域名主题路由】插件</p></li></ol><h2 style="" id="%E4%BA%8C%E3%80%811panel-nginx-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E9%85%8D%E7%BD%AE%EF%BC%88%E5%85%B3%E9%94%AE%E6%AD%A5%E9%AA%A4%EF%BC%89">二、1Panel Nginx 反向代理配置(关键步骤)</h2><blockquote><p style="">警告:不要使用 1Panel 可视化反向代理新增<code>location /</code>,会出现<code>duplicate location "/"</code>重复 location 报错,直接编辑网站配置文件</p></blockquote><p style="">进入 1Panel → 网站 → <code>docs.jingdiekeji.com</code> → 切换【配置文件】标签,全选原有内容,替换为下方完整 Server 配置</p><pre><code class="language-Markdown">server {
listen 80 ;
listen 443 ssl ;
server_name docs.jingdiekeji.com app.jingdiekeji.com nav.jingdiekeji.com;
index index.php index.html index.htm default.php default.htm default.html;
access_log /www/sites/docs.jingdiekeji.com/log/access.log main;
error_log /www/sites/docs.jingdiekeji.com/log/error.log;
location ~ ^/(\.user.ini|\.htaccess|\.git|\.env|\.svn|\.project|LICENSE|README.md) {
return 404;
}
location ^~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
if ( $uri ~ "^/\.well-known/.*\.(php|jsp|py|js|css|lua|ts|go|zip|tar\.gz|rar|7z|sql|bak)$" ) {
return 403;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Connection upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
proxy_ssl_server_name off;
proxy_ssl_name $proxy_host;
proxy_pass http://172.18.0.3:8090;
}
http2 on;
if ($scheme = http) {
return 301 https://$host$request_uri;
}
ssl_certificate /www/sites/docs.jingdiekeji.com/ssl/fullchain.pem;
ssl_certificate_key /www/sites/docs.jingdiekeji.com/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
add_header Strict-Transport-Security "max-age=31536000";
}
</code></pre><h3 style="" id="%E9%85%8D%E7%BD%AE%E4%BF%AE%E6%94%B9%E8%A6%81%E7%82%B9%E8%AF%B4%E6%98%8E">配置修改要点说明</h3><ol><li><p style=""><code>proxy_pass http://172.18.0.3:8090;</code>:填写 Halo 容器内网 IP,禁止使用 127.0.0.1,OpenResty 在 Docker 容器内,127.0.0.1 指向自身。</p></li><li><p style=""><code>proxy_set_header X-Forwarded-Host $host;</code>:必须是\(host,不能写\)server_name,$host 代表用户真实访问域名,插件依靠该 Header 识别域名。</p></li><li><p style="">保留<code>Connection upgrade</code>和<code>Upgrade</code>:用于 Halo 后台 WebSocket 实时通信,后台编辑器、通知功能依赖此项。</p></li></ol><blockquote><p style="">保存后,1Panel 自动校验 Nginx 配置,无报错即代表 Nginx 配置生效。 ⚠️ 注意:Halo 容器重启后内网 IP 可能变动,出现 502 Bad Gateway 时,进入容器页面查看新 IP 并更新<code>proxy_pass</code>地址。</p></blockquote><h2 style="" id="%E4%B8%89%E3%80%81halo-%E5%90%8E%E5%8F%B0%E5%9F%BA%E7%A1%80%E8%AE%BE%E7%BD%AE">三、Halo 后台基础设置</h2><ol><li><p style="">登录 Halo 后台 → 【系统设置】→【基本设置】</p></li><li><p style=""><strong>外部访问地址(站点 URL)</strong>:填写主域名 <code>https://docs.jingdiekeji.com</code></p></li></ol><blockquote><p style="">多域名场景只需要填写主站点 URL,域名主题路由插件会接管多域名识别,无需修改此项为多个地址。</p></blockquote><ol start="3"><li><p style="">保存设置。</p></li></ol><h2 style="" id="%E5%9B%9B%E3%80%81%E5%9F%9F%E5%90%8D%E4%B8%BB%E9%A2%98%E8%B7%AF%E7%94%B1%E6%8F%92%E4%BB%B6%E5%90%8E%E5%8F%B0%E9%85%8D%E7%BD%AE">四、域名主题路由插件后台配置</h2><ol><li><p style="">Halo 后台 → 【插件】→ 找到【域名主题路由】→ 点击【设置】</p></li><li><p style="">点击【添加绑定】,逐个添加域名绑定规则:</p></li></ol><p style="">表格</p><div class="halo-table-wrapper" data-table-layout="auto" style="box-sizing: border-box; overflow-x: auto; overflow-y: hidden; width: 100%; max-width: 100%; min-width: 0;"><table data-table-layout="auto" style="display: table; width: 100%; min-width: 100%; table-layout: auto;"><tbody><tr><th colspan="1" rowspan="1"><p style="">访问域名</p></th><th colspan="1" rowspan="1"><p style="">绑定主题</p></th><th colspan="1" rowspan="1"><p style="">启用状态</p></th></tr><tr><td colspan="1" rowspan="1"><p style=""><a href="https://docs.jingdiekeji.com">docs.jingdiekeji.com</a></p></td><td colspan="1" rowspan="1"><p style="">选择文档站点主题</p></td><td colspan="1" rowspan="1"><p style="">✅ 开启</p></td></tr><tr><td colspan="1" rowspan="1"><p style=""><a href="https://app.jingdiekeji.com">app.jingdiekeji.com</a></p></td><td colspan="1" rowspan="1"><p style="">选择应用站点主题</p></td><td colspan="1" rowspan="1"><p style="">✅ 开启</p></td></tr><tr><td colspan="1" rowspan="1"><p style=""><a href="https://nav.jingdiekeji.com">nav.jingdiekeji.com</a></p></td><td colspan="1" rowspan="1"><p style="">选择导航站点主题</p></td><td colspan="1" rowspan="1"><p style="">✅ 开启</p></td></tr></tbody></table></div><blockquote><p style="">⚠️ 填写规则:访问域名只填写纯域名,不要加 http/https,不要带末尾斜杠。 每个域名单独一条绑定记录,绑定的主题需要提前在【主题管理】中安装并存在。</p></blockquote><ol start="3"><li><p style="">全部添加完成后保存插件配置。</p></li></ol><h2 style="" id="%E4%BA%94%E3%80%81%E9%AA%8C%E8%AF%81%E6%B5%8B%E8%AF%95%E6%AD%A5%E9%AA%A4">五、验证测试步骤</h2><ol><li><p style="">分别打开浏览器无痕窗口访问 3 个域名:</p></li></ol><ul><li><p style=""><a href="https://docs.jingdiekeji.com">https://docs.jingdiekeji.com</a></p></li><li><p style=""><a href="https://app.jingdiekeji.com">https://app.jingdiekeji.com</a></p></li><li><p style=""><a href="https://nav.jingdiekeji.com">https://nav.jingdiekeji.com</a></p></li></ul><ol start="2"><li><p style="">观察每个域名加载的主题是否和插件绑定设置一致。</p></li><li><p style="">辅助校验(查看请求头):浏览器 F12 开发者工具 → Network,查看请求的 Request Headers,确认<code>Host</code>和<code>X-Forwarded-Host</code>为当前访问域名。</p></li></ol><h2 style="" id="%E5%85%AD%E3%80%81%E5%B8%B8%E8%A7%81%E6%95%85%E9%9A%9C%E6%8E%92%E6%9F%A5">六、常见故障排查</h2><h3 style="" id="1.-%E8%AE%BF%E9%97%AE%E5%87%BA%E7%8E%B0-502-bad-gateway">1. 访问出现 502 Bad Gateway</h3><ul><li><p style="">原因:proxy_pass 的 Halo 容器 IP 错误,或 Halo 容器未启动</p></li><li><p style="">解决:进入 1Panel 容器页面,确认 Halo 容器状态,获取最新内网 IP,修改 Nginx 配置的 proxy_pass。</p></li></ul><h3 style="" id="2.-%E6%89%80%E6%9C%89%E5%9F%9F%E5%90%8D%E9%83%BD%E5%8F%AA%E6%98%BE%E7%A4%BA%E5%90%8C%E4%B8%80%E4%B8%AA%E4%B8%BB%E9%A2%98%EF%BC%8C%E5%88%87%E6%8D%A2%E5%A4%B1%E6%95%88">2. 所有域名都只显示同一个主题,切换失效</h3><p style="">99% 为请求头传递错误,按顺序检查:</p><ol><li><p style="">Nginx 配置内 <code>X-Forwarded-Host</code> 是否设置为 <code>$host</code>,不是<code>$server_name</code></p></li><li><p style="">保存 Nginx 配置,确认 Nginx 重载成功无报错</p></li><li><p style="">插件绑定的域名拼写是否完全一致,没有多余 http、斜杠、空格</p></li><li><p style="">绑定规则【启用状态】已打开,选中的主题已安装</p></li></ol><h3 style="" id="3.-%E5%90%8E%E5%8F%B0%E8%B7%B3%E8%BD%AC%E5%BC%82%E5%B8%B8%EF%BC%8C%E5%9F%9F%E5%90%8D%E5%8F%98%E6%88%90-172.18.0.3%3A8090">3. 后台跳转异常,域名变成 172.18.0.3:8090</h3><ul><li><p style="">缺少<code>X-Forwarded-Host</code>请求头,或者 Halo 后台【外部访问地址】没有正确填写主域名。</p></li></ul><h3 style="" id="4.-%E9%9D%99%E6%80%81%E8%B5%84%E6%BA%90%EF%BC%88%E5%9B%BE%E7%89%87%E3%80%81css%EF%BC%89404">4. 静态资源(图片、CSS)404</h3><ul><li><p style=""><code>Host $host</code>请求头缺失,检查 Nginx 配置中<code>proxy_set_header Host $host;</code>是否存在。</p></li></ul><h2 style="" id="%E4%B8%83%E3%80%81%E7%BB%B4%E6%8A%A4%E5%A4%87%E6%B3%A8">七、维护备注</h2><blockquote><p style="">Halo 容器重启后,Docker 内网 IP 可能发生变化。网站出现 502 报错时优先排查容器 IP。 新增域名:在 Nginx 的<code>server_name</code>追加域名,再到插件后台新增一条域名 - 主题绑定记录即可。</p></blockquote><p style=""></p>