给 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 到目标站