ThinkPHP入口文件需置于Web可访问目录且仅暴露该目录,路径配置须基于__DIR__避免硬编码,runtime目录需正确授权,HTTPS需透传协议头并统一URL协议。

入口文件必须放在 web 可访问目录,但不一定要叫 public
ThinkPHP 默认把 index.php 放在 public 目录下,本质是让 Web 服务器只暴露这个目录——其他如 app、config、runtime 都不能被直接 HTTP 访问。你可以改名或挪位置,但核心原则不变:Web 根目录只能映射到「仅含入口文件 + 静态资源」的目录。
实操建议:
- 若用 Nginx,把
root指向你自定义的目录(比如/var/www/myapp/web),然后把index.php放进去,再调整index.php中的__DIR__ . '/../'路径,确保能正确加载框架和应用目录 - Apache 同理,修改
DocumentRoot,并确认.htaccess规则仍匹配新路径 - 别把
index.php留在项目根目录(如/var/www/myapp/index.php)还开着全目录浏览——这是最常见误操作,app/和config/会裸奔
index.php 里那几行路径定义不能硬编码绝对路径
很多人为了“省事”,在 index.php 里写死 define('APP_PATH', '/var/www/myapp/app/');,结果换服务器、换部署方式就报错。ThinkPHP 的启动逻辑依赖相对路径推导,硬编码会破坏自动识别机制,也影响命令行运行(如 php think 命令)。
实操建议:
- 保留默认的
__DIR__ . '/../app/'这类基于__DIR__的写法,它能适配绝大多数部署结构 - 如果必须动态指定(比如多环境共用同一份代码),用
getenv()或$_SERVER['TP_APP_PATH']注入,再做存在性校验,避免空路径导致require失败 - 注意 Windows 下反斜杠问题:不要手动拼接
'C:\myapp\app\',一律用str_replace('/', DIRECTORY_SEPARATOR, ...)或直接用dirname(__DIR__) . DS . 'app'(DS 是 ThinkPHP 定义的常量)
禁用 debug 模式后,runtime 目录权限仍可能引发 500 错误
线上环境关掉 app_debug = false 只是第一步。ThinkPHP 仍需往 runtime 写日志、缓存、模板编译文件。如果 Web 进程用户(如 www-data 或 nginx)没写权限,页面直接 500,错误日志还不一定输出——因为连日志文件都创建不了。
实操建议:
- 部署后立刻执行:
chmod -R 755 runtime/ && chown -R www-data:www-data runtime/(根据实际用户组调整) - 别把
runtime放进 Git —— 它应该出现在.gitignore里;否则容易因本地生成的缓存文件污染线上行为 - 如果用容器部署,确保
runtime目录挂载为可写卷,且容器内用户 UID 匹配宿主机权限设置
HTTPS 强制跳转和静态资源路径要同步处理
很多团队只在 Nginx 配置里加了 return 301 https://$host$request_uri;,却忘了 ThinkPHP 生成的 URL(比如 url() 函数、asset()、表单 action)仍可能输出 http://。尤其当服务器在反代之后(如阿里云 SLB、Nginx 反代),$_SERVER['HTTPS'] 不会自动为 on,框架就无法感知当前是 HTTPS。
实操建议:
- 在
index.php开头加判断:if ($_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') { $_SERVER['HTTPS'] = 'on'; }(前提是反代已透传该 header) - 配置
app_url或url_domain为完整 HTTPS 地址,避免依赖运行时检测 - 检查所有硬编码的
http://字符串,特别是第三方 SDK 初始化、图片上传回调地址、邮件模板里的链接
安全不是靠一个开关搞定的,是路径控制、权限约束、协议感知、环境隔离这四层一起绷着。漏掉任意一层,入口文件再“规范”,该被扫出来的还是会被扫出来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











