您现在的位置: 365建站网 > 365文章 > index.php 入口文件是干什么的?为什么必须指向 public,以及 $_SERVER 取值陷阱

index.php 入口文件是干什么的?为什么必须指向 public,以及 $_SERVER 取值陷阱

文章来源:365jz.com 点击数:44 更新时间:2024-07-28 09:05

访问一个 PHP 网站时浏览器里不显示 index.php,不代表它不存在。ThinkPHP、Laravel 这类框架都有明确的"入口文件"设计,理解它才能真正搞懂路由、404 和伪静态。本文依据可访问的官方手册原文整理。

index.php入口文件

一、入口文件到底做了什么

ThinkPHP 6.0 完全开发手册的目录里,紧接"框架简介"之后就是目录结构与入口文件两节,后面才是路由定义、路由中间件、资源路由、域名路由、MISS 路由、启动内置服务器。这个顺序本身就是框架的设计意图:所有请求先落到唯一入口,再由路由分发。

入口文件通常放在 public/ 下,只做四件事:定义路径常量、加载自动加载器、实例化应用、发送响应。因此 Web 根目录必须指向 public,而不是项目根目录。根目录指错会带来实际风险——.env、框架源码、runtime 日志都可能被直接下载。

手册还提到官方生态由顶想云提供(www.topthink.com 实测 200,标题为"顶想云 - 企业 AI 生产力底座"),项目主站为 www.thinkphp.cn,官方讨论区是 http://www.thinkphp.cn/topic,遇到问题比翻二手教程更可靠。

二、为什么地址栏看不到 index.php

两种情况:一是服务器配置了默认文档(DirectoryIndex),访问目录时自动执行它;二是开了伪静态/重写,把 /index.php/article/list 重写成 /article/list。判据是看网页源码里的资源链接:若表单 action 或分页链接仍带 index.php,说明重写只是表面功夫。

三、脚本自己是谁:$_SERVER 的四个键

PHP 官方 $_SERVER 手册列出了入口最依赖的变量:PHP_SELF、SCRIPT_NAME、DOCUMENT_ROOT、REQUEST_URI、QUERY_STRING、HTTP_HOST、REMOTE_ADDR、GATEWAY_INTERFACE。区别要点:

  • SCRIPT_NAME 是脚本自身路径(/index.php),不含查询串,最适合拼表单地址。
  • PHP_SELF 含路径信息,手册原文有告诫:"Not set on all PHP environments, may need setting via preg_replace('#\.php/.*#', '.php', $_SERVER['PHP_SELF'])"。并且它可被 URL 篡改,直接输出到页面会造成 XSS,正确替代是 htmlentities($_SERVER['PHP_SELF'], ENT_QUOTES) 或干脆用 SCRIPT_NAME。
  • REQUEST_URI 手册注明"might include the scheme and domain in certain cases",某些代理配置(request_fulluri => 1)下会变成完整 URL,拿它做前缀匹配时要先判协议头。
  • REMOTE_ADDR 在 CDN 后不准,官方备注提到用 HTTP_X_FORWARDED_FOR 替代,但后者可伪造,必须由可信代理层白名单收口。

四、入口报错的三种典型现象

白页:多为 PHP 版本低于框架要求,或入口里 require 的路径常量算错。500 且日志为空:runtime 目录无写权限。样式全丢但页面能出:根目录没指向 public,静态资源路径基准错位。

五、常见问题 FAQ

问:能不能直接访问 app 下的控制器文件?
答:不能也不该。框架的初始化只在入口完成,绕过入口就没有路由、中间件与容器。

问:本地怎么不装 Nginx 也跑起来?
答:手册有"启动内置服务器"一节,用 php -S localhost:8000 -t public,注意内置服务器需要入口文件做路由转发脚本。

问:index.php 能改名吗?
答:可以,但需同步改 DirectoryIndex 与重写规则中的目标,两处不一致会全站 404。

六、总结

关于 index.php 的结论是:它是框架唯一入口,负责加载、实例化与响应;Web 根目录必须指向 public 而非项目根;地址看不到它不代表不存在,判据是源码里的真实链接;取当前脚本一律优先 SCRIPT_NAME,PHP_SELF 有环境差异与 XSS 风险,REQUEST_URI 可能被代理改成完整 URL,REMOTE_ADDR 在 CDN 后不可信。排查入口问题先看根目录与 runtime 权限,再怀疑代码。

生产内容,同时打通搜索引擎(SEO)与AI搜索引擎(GEO)流量入口的软件! 点击进入365建站器 »