在 phpEnv 集成环境中,Apache 的目录级重写规则并不会自动生效。很多项目在本地开发时明明已经在 public 目录放好了 .htaccess,访问伪静态地址却仍然出现 404。出现这种情况的核心原因是 phpEnv 生成的 Apache 主配置将站点目录的 AllowOverride 指令设为了 None,Apache 根本不会去读取 .htaccess 文件。要让框架自带的重写规则真正执行,需要手动修改配置文件并重启服务。

一、phpEnv 中 Apache 忽略 .htaccess 的原因
Apache 对 .htaccess 文件的读取受到 AllowOverride 指令控制。AllowOverride 用于声明当前目录或虚拟主机目录中,哪些指令可以被 .htaccess 覆盖。当取值为 None 时,Apache 不会在对应目录查找 .htaccess,即使文件存在并且规则正确,也不会产生任何效果。phpEnv 默认安装生成的 httpd.conf 中,通常对全局目录和站点根目录都保留了 AllowOverride None,这是一种偏安全和性能的默认策略。
许多框架的 URL 美化依赖 RewriteRule。例如 ThinkPHP 的 public 目录下自带了 .htaccess,里面包含将请求转发到 index.php 的规则。如果 Apache 没有读取该文件,框架只能依赖 PATH_INFO 或普通查询字符串,路由表现不一致。可以将 AllowOverride 理解为目录级配置开关,只有打开成 All 或 FileInfo 后,.htaccess 中与文件类型相关的指令才能覆盖主配置。
查看 phpEnv 默认配置可以看到类似片段:
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>
<Directory "D:/phpEnv/www">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
上述配置中,<Directory /> 针对 Apache 根目录,而 <Directory "D:/phpEnv/www"> 才是 phpEnv 默认创建的第一个站点目录。只修改根目录段落并不会影响站点目录,必须找到实际站点所对应的目录段落进行修改。
二、修改 phpEnv 的 Apache 配置开启 AllowOverride
首先定位配置文件。phpEnv 安装目录结构通常为 D:\phpEnv\server\Apache\conf\httpd.conf,使用 Notepad++ 或 VS Code 打开后搜索 <Directory,找到站点根目录对应的段落。如果 phpEnv 版本不同,站点配置也可能位于 conf\extra\httpd-vhosts.conf 中,建议两个文件都检查一遍。
修改时,将 AllowOverride None 改为 AllowOverride All。All 表示允许所有类型的指令覆盖,包括 mod_rewrite、认证、访问控制等。对于仅需要伪静态的场景,也可以使用 FileInfo 或 Limit 等更细粒度值,但本地开发环境直接使用 All 最省事。同时需要确认 LoadModule rewrite_module modules/mod_rewrite.so 这一行没有被注释掉。
修改后的参考配置如下:
# 加载重写模块
LoadModule rewrite_module modules/mod_rewrite.so
<Directory "D:/phpEnv/www">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
如果 phpEnv 中配置了多个虚拟主机,需要为每个虚拟主机单独添加目录权限。典型的多站点配置如下:
<VirtualHost *:80>
DocumentRoot "D:/phpEnv/www/thinkphp/public"
ServerName tp.local
<Directory "D:/phpEnv/www/thinkphp/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
保存配置文件后,一定要重启 Apache 服务。可以在 phpEnv 控制面板中点击重启按钮,也可以在 Windows 服务管理器中找到 Apache 服务重新启动。如果不重启,修改不会生效。
三、创建并验证 .htaccess 文件
配置完成后需要实际测试。Windows 资源管理器不能直接新建以点开头的文件,但可以通过命令提示符执行 echo test > .htaccess 创建,或者用编辑器另存为 .htaccess。也可以在站点目录中打开 Git Bash,执行 touch .htaccess 命令。
创建一个 test 目录,放入 .htaccess 与 article.php。.htaccess 内容如下:
RewriteEngine On RewriteBase /test/ RewriteRule ^article-([0-9]+)\.html$ article.php?id=$1 [L,QSA]
article.php 的内容可以非常简单:
<?php $id = isset($_GET['id']) ? $_GET['id'] : 'no id'; echo 'id=' . $id; ?>
重启 Apache 后访问 http://127.0.0.1/test/article-123.html。如果页面输出 id=123,说明 .htaccess 已被 Apache 读取并执行了重写规则。如果仍然 404 或显示原始路径,说明还有配置未生效,需要按照下一部分的思路继续排查。
四、开启后仍然不生效的排查思路
第一步检查配置是否真的加载。使用 phpEnv 自带的 Apache 命令检查语法和模块状态:
D:\phpEnv\server\Apache\bin\httpd.exe -t D:\phpEnv\server\Apache\bin\httpd.exe -M | findstr rewrite
如果 httpd.exe -t 报错,说明配置文件存在语法问题;如果 findstr rewrite 没有输出,说明 rewrite 模块没有加载,需要去掉 LoadModule 行前面的井号注释并重启。
第二步确认 .htaccess 文件名是否正确。有些编辑器会保存成 .htaccess.txt,在 Windows 中要查看真实扩展名。可以在命令提示符中使用 dir /a 查看文件全名。如果文件名多出 .txt,Apache 不会把它当作配置文件。
第三步检查 Directory 路径是否与实际站点根目录一致。phpEnv 中站点可能分别配置在不同目录,如果只修改了主配置中的默认 www 目录,而项目在另一个虚拟主机目录下,仍不会生效。此时需要到 httpd-vhosts.conf 中为对应 VirtualHost 添加 Directory 段并设置 AllowOverride All。
第四步查看 Apache 错误日志。phpEnv 日志一般位于 D:\phpEnv\server\Apache\logs\error.log。如果 .htaccess 中某个指令不被允许,或语法错误,日志会给出明确提示。根据提示修正后重启即可。开启 AllowOverride All 后,Apache 每次请求都会查找目录中的 .htaccess,会带来轻微性能损耗,但在本地开发和中小型站点中影响可以忽略。生产环境更推荐把重写规则直接写入虚拟主机配置,既能保证性能也能避免 .htaccess 被误修改。