Skip to content

1Panel 站点管理的坑

面板会覆盖手改的配置

站点配置在 /opt/1panel/www/conf.d/站点代号.conf。手改是可以的,但在面板里动过站点设置之后(尤其是重新绑证书、开关 HTTPS),面板可能重新生成整个文件,把手改的东西打回去。

习惯:每次在面板里动过站点设置,都复查一遍关键行:

bash
grep -n "listen\|error_page" /opt/1panel/www/conf.d/站点代号.conf

error_page 497

面板生成的 HTTPS 站点配置里有一行:

nginx
error_page 497 https://$host:端口$request_uri;

497 是「用 HTTP 请求打到了 HTTPS 端口」,这行把它跳转到 HTTPS。问题是端口不是 443 的话,这个端口号会写进对外的跳转地址。不想暴露内部端口就删掉它。

SPA 需要 try_files

it-tools、各种前端框架的产物都是单页应用,刷新子路由会 404。加:

nginx
location / {
    try_files $uri $uri/ /index.html;
}

放在 server 块里,改完 reload 就行。

站点目录和权限

静态站根目录:/opt/1panel/www/sites/站点代号/index/

从别处 tar 解压进来的文件带着原来的 uid,最好统一:

bash
chown -R root:root /opt/1panel/www/sites/站点代号/index/

证书

  • HTTP-01 验证要求 80 由 OpenResty 直管,别让别的东西占 80
  • 申请成功后去「计划任务」确认续期任务存在
  • 同一个证书可以给多个站点用,选「已有证书」

部署 PWA 类前端要注意 Service Worker

有些前端项目(用 Vite PWA 插件打包的)自带 sw.js,注册后会把所有页面导航都回落到缓存里的 index.html。同域名下再放别的页面,返回访客会被劫持到首页。

不需要离线功能的话把 sw.js 换成一个自注销的桩:

js
self.addEventListener('install', function () { self.skipWaiting(); });
self.addEventListener('activate', function (e) {
  e.waitUntil(self.registration.unregister()
    .then(function () { return self.clients.matchAll({ type: 'window' }); })
    .then(function (cs) { cs.forEach(function (c) { c.navigate(c.url); }); }));
});

保留 200 响应,老客户端才能更新到它并自己注销。直接删文件返回 404,浏览器也会注销,但要等它下次检查更新。

个人笔记,写给未来忘事的自己。