ThinkPHP5.0默认启用URL后缀黑名单检测,通过配置'url_deny_suffix'字符串(如'php|log|bak')拦截非法后缀请求,需确保该配置存在且'url_route_on'=>true开启;支持路由级关闭检测(deny_suffix(false))和运行时动态覆盖,但不支持正则、不区分大小写。

ThinkPHP5.0在URL访问检测阶段会自动校验请求URL是否携带非法后缀,若匹配到黑名单后缀则直接拦截返回404,防止敏感文件(如 .php、.log)被意外暴露或执行。
确认URL后缀检测是否启用
打开 application/config.php,检查是否存在并启用以下配置项:
【'url_deny_suffix' => 'php|html|htm|shtml|phtml|log|bak|swp'】 —— 这是实际生效的黑名单规则,必须为字符串格式,用竖线分隔;若该配置缺失或值为空数组/空字符串,后缀检测将完全失效。
同时确保 'url_route_on' => true 已开启,否则整个路由层(含后缀检测)不运行。
立即学习“PHP免费学习笔记(深入)”;
修改默认后缀黑名单
方法一:直接覆盖配置
在 application/config.php 中显式定义 'url_deny_suffix',例如只禁止 .log 和 .bak:
'url_deny_suffix' => 'log|bak'
注意:该配置不支持正则,仅支持精确后缀匹配;不区分大小写,.LOG 和 .log 均会被拦截。
方法二:运行时动态覆盖(仅限调试)
在应用初始化早期(如 application/common.php)插入:
\think\Config::set('url_deny_suffix', 'env|conf|ini');
该方式优先级高于配置文件,但上线环境应避免使用,以防被误覆盖。
绕过检测的例外路径设置
第一步:确定需放行的控制器或操作
例如静态资源控制器 Index/static 需允许 .js 请求,但框架默认会拦截。
第二步:在路由定义中显式关闭后缀检测
编辑 application/route.php,添加带 deny_suffix=>false 参数的路由规则:
Route::get('static/:file', 'index/Static/read')->deny_suffix(false);
第三步:验证放行效果
访问 /static/main.js 应正常返回内容,而非 404;若仍被拦截,说明该路由未被匹配到,需检查路由注册顺序或是否被更宽泛的规则覆盖。
注意:deny_suffix(false) 仅对当前路由生效,不影响其他路径;不可在闭包路由中使用此参数。
验证后缀检测是否真实生效
方法1:发起一个带禁用后缀的请求
用 curl 或浏览器直接访问 http://your-domain.com/index.php?m=index&c=Index&a=index.php,若返回 404 页面(非白屏或报错),说明检测已触发。
方法2:临时注入测试后缀
在配置中加入一个明显不存在的后缀,如 'url_deny_suffix' => 'xyz',再请求 /index/abc.xyz;若返回 404,则证明机制运行正常。
方法3:查看日志确认拦截动作
在 runtime/log/ 下查找最近的 log 文件,搜索关键词 deny_suffix 或 invalid suffix,有匹配记录即表示检测逻辑已执行。



















