给 dh.liuchun.cn 装完程序后遇到两个现象:点链接 404、数据库文件能被公网直接下载。

原因

宝塔新建站点默认没有伪静态规则,/click/1 这类路由找不到对应文件就 404;同时 /data/xxx.db3 是真实存在的文件,nginx 就老老实实返回了它。

处理

宝塔 → 网站 → 站点 → 设置 → 伪静态,粘贴程序自带的规则:

location ~* ^/(class|controller|db|data|functions|templates)/.*.(db3|php|php5|sql)$ {
    return 403;
}
location /db { deny all; }
rewrite ^/click/(.*) /index.php?c=click&id=$1 break;
rewrite /login /index.php?c=login break;

一个要注意的坑

宝塔的 PHP 解析规则优先级高于伪静态里 include 进来的内容,所以 ^/(class|...)/.*\.php$ 这一段实际拦不住,PHP 文件仍然会被执行。

想彻底挡住,要用 ^~ 前缀匹配,它命中后不再检查正则 location:

location ^~ /data/ { deny all; }
location ^~ /db/   { deny all; }

但 templates 不能整目录 deny,因为主题的 css/js 在里面,前台要用。

验证

curl -sI https://域名/data/xxx.db3   # 期望 403
curl -sI https://域名/click/1        # 期望 302 到目标站