伪静态规则仅负责路由转发,不提供安全防护;防止敏感目录访问必须依赖web服务器层显式拦截,如apache用.htaccess在项目根目录配置拒绝规则,nginx用location ^~ /application/ { deny all; }等前缀匹配方式,并确保规则位置优先于兜底规则。

伪静态规则本身不负责安全,它只管路由转发;真正防止敏感目录被访问,靠的是 Web 服务器层的显式拦截。如果你发现 http://yourdomain.com/application/database.php 能直接打开,或者 /runtime/log/ 可以列目录,说明伪静态配置没和安全拦截配合好——这不是改 index.php 或框架配置能解决的。
Apache 下用 .htaccess 拦敏感目录,顺序和路径必须严格
别把 .htaccess 放错位置:它必须在项目根目录(即包含 application 和 public 的同级目录),不是 public/ 里。否则对 application 这类同级目录完全无效。
-
RewriteRule ^application - [F,L]这类规则要写在所有重写规则之后,但必须在之前 - ThinkPHP 6+ 默认用
app不是application,写错名字就等于没拦 -
%{REQUEST_URI}总是以/开头,所以!^/application/才有效,!^application/匹配不到 - 如果用了
RewriteBase /subdir/,所有路径判断都要带前缀,比如!^/subdir/application/
Nginx 中 location 优先级决定拦截是否生效
Nginx 没有条件判断,全靠 location 块的匹配优先级。写成 location ~ \.php$ { deny all; } 是典型错误——它只拦后缀,拦不住 /config/database.php 这种路径。
- 必须用前缀匹配:
location ^~ /application/ { deny all; }、location ^~ /runtime/ { deny all; } -
^~表示前缀匹配且优先于正则,比location ~ /application/更可靠 - 上传目录如
/uploads/要额外加一层脚本拦截:location ~* ^/uploads/.*\.(php|phar|phtml)$ { return 403; } - 所有敏感目录规则必须放在
location /和location ~ \.php$之前,否则会被兜底规则覆盖
伪静态规则里排除静态路径,不是为了安全而是避免 404
很多人误以为在伪静态里加 RewriteCond %{REQUEST_URI} !^/static/ 是为了防攻击,其实只是为了不让 /static/css/app.css 被转到 index.php 导致 404。它本身不提供任何安全防护。
- 该排除只影响路由转发逻辑,不影响文件是否可读——
/static/目录本身仍需通过其他方式限制(比如location ^~ /static/配缓存头或权限) - 若静态资源放在
public/外(比如误放进了app/),再怎么排除也没用,因为 Web 服务器会直接返回那个文件 -
robots.txt、favicon.ico这类文件也得单独排除,否则可能被重写后 404,但它们本身不是敏感资源
最易被忽略的一点:本地开发用 php -S 启动时,没有任何 Web 服务器规则,所有文件都裸奔。这时候 application/ 目录下任何 PHP 文件都能被直接执行——这不是配置问题,是启动方式错了。生产环境用 Apache/Nginx,开发环境也得用对应服务器或 Docker 容器模拟,否则安全测试毫无意义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











