PHP本地404主因是DocumentRoot配置错误,需确保Apache的DocumentRoot、路径与项目实际位置完全一致,且AllowOverride All、Require all granted已启用,.htaccess或Nginx的try_files规则正确并重启服务。

phpEnv里DocumentRoot配错直接404
phpEnv默认用Apache + PHP组合,但它的DocumentRoot常指向D:/phpenv/www或类似路径。如果你把项目放到了D:/www/myapp却没改配置,访问http://localhost/myapp/index.php就必然404——Apache压根不会去那个目录找文件。
检查D:/phpenv/Apache/conf/extra/httpd-vhosts.conf(或主httpd.conf),确认DocumentRoot和<directory></directory>路径完全一致且拼写无误。常见错误包括:
-
DocumentRoot "D:/phpenv/www"但项目实际在"D:/phpenv/www/myproject",这时应访问/myproject/index.php,而不是/index.php - 路径用了反斜杠
但没转义,Apache会解析失败;必须全用正斜杠/或双反斜杠\ - 目录存在但权限不对:Windows下Apache服务账户(通常是
SYSTEM或你指定的用户)需有读取+执行权限
mod_rewrite没启用或AllowOverride被禁用
phpEnv自带的Apache通常已启用mod_rewrite,但AllowOverride None是默认值,导致.htaccess里的重写规则完全被忽略。框架路由(如Laravel、ThinkPHP)因此收不到请求,直接返回404。
打开D:/phpenv/Apache/conf/httpd.conf,搜索<directory></directory>(或你实际的DocumentRoot路径),确保其中包含:
立即学习“PHP免费学习笔记(深入)”;
RewriteEngine On AllowOverride All Require all granted
注意:Require all granted是Apache 2.4必需项,缺了会导致403或静默失败;AllowOverride All不能写成FileInfo或None,否则RewriteRule不生效。
改完必须重启phpEnv的Apache服务(不是仅刷新页面)。
.htaccess规则写错或位置不对
phpEnv不自动为你生成.htaccess,得自己放。它必须放在DocumentRoot对应的真实目录下(比如D:/phpenv/www),而不是子目录里——除非你额外配了子目录的<directory></directory>块。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
标准Laravel风格的.htaccess内容应为:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
关键点:
- 第一行
RewriteEngine On不能漏,也不能被注释 - 两个
RewriteCond必须都在,否则index.php、favicon.ico这类真实文件也会被重写,造成循环或500 -
[QSA,L]不能丢:QSA保证查询参数(如?id=1)透传,L表示终止后续规则 - 如果用ThinkPHP 6.x,建议改成
RewriteRule ^(.*)$ index.php?$query_string [L],避免PATH_INFO干扰
Nginx模式下try_files漏掉$query_string
phpEnv支持切换Web服务器,若你选了Nginx,.htaccess完全无效。所有重写逻辑必须写进D:/phpenv/Nginx/conf/nginx.conf或站点配置里。
最常见的错误是try_files只写了/index.php而没带$query_string,结果/user?id=123变成$_GET为空,框架路由匹配失败,最终404。
正确写法(在location / { }块内):
try_files $uri $uri/ /index.php?$query_string;
同时确认fastcgi_param SCRIPT_FILENAME用的是$document_root$fastcgi_script_name,不是$request_filename——后者在重写后可能指向错误路径,导致PHP脚本根本没执行就被Apache/Nginx判为404。
改完运行nginx -t校验语法,再用phpEnv面板或命令重启Nginx。别跳过这步,配置错误时Nginx可能静默回退到默认行为,看起来像“没变化”。


















