mod_rewrite 默认关闭,需启用模块并设 AllowOverride All 才生效;.htaccess 必须正确命名和编码;伪静态规则需加 RewriteCond 排除真实文件目录,并用 [L] 终止匹配;调试应查 error.log 和状态码。

mod_rewrite 默认是关闭的,必须手动启用 Apache 模块并正确配置 .htaccess 文件,否则 404 或规则完全不生效。
确认 mod_rewrite 模块已启用
XAMPP 自带 mod_rewrite,但默认未加载。需编辑 Apache 配置文件启用它:
- 打开
XAMPP\apache\conf\httpd.conf - 搜索
#LoadModule rewrite_module modules/mod_rewrite.so,去掉行首的# - 再搜索
AllowOverride None(通常在区块内),改为AllowOverride All - 保存后重启 Apache(通过 XAMPP Control Panel)
若跳过第二步,.htaccess 中的重写规则会被忽略,即使模块已加载也无效。
验证 .htaccess 是否被读取
在 htdocs 目录下新建一个 .htaccess,内容仅写一行:RewriteEngine On,然后访问任意 PHP 页面。如果页面直接报错(如 Internal Server Error),说明 Apache 已识别该文件;如果无反应,大概率是 AllowOverride 没设对或文件名拼写错误(注意是点开头、无扩展名)。
常见陷阱:
- Windows 资源管理器默认隐藏文件扩展名,易误存为
.htaccess.txt - 用记事本保存时务必选“所有文件”类型,编码选 ANSI 或 UTF-8 无 BOM
- 路径中含中文或空格可能导致解析失败,建议测试时用纯英文路径
写一个最简可用的伪静态规则
比如把 /article.php?id=123 变成 /article/123:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^article/(\d+)$ article.php?id=$1 [L]
关键点:
-
RewriteCond排除真实存在的文件和目录,避免 CSS/JS 被误重写 -
[L]表示“最后一条规则”,防止后续规则干扰 - 正则中的
^和$是边界锚点,不加可能匹配到意外路径(如/article/123/extra) - 若规则放在子目录,需加
RewriteBase /subdir/,否则路径解析会出错
调试 mod_rewrite 失效问题
Apache 不报具体重写错误,只能靠日志定位:
- 在
httpd.conf中开启重写日志(仅开发环境):RewriteLogLevel 3RewriteLog "logs/rewrite.log"
(注意:Apache 2.4+ 已弃用,改用RewriteLog会报错,应改用LogLevel alert rewrite:trace3) - 检查
error.log(XAMPP\apache\logs\error.log)是否有Invalid command 'RewriteEngine'(模块未加载)或Options FollowSymLinks or SymLinksIfOwnerMatch is off(需在块中加Options +FollowSymLinks) - 浏览器访问时用开发者工具看返回状态码:404 表示规则没命中,500 表示语法错误,200 但内容不对可能是正则或目标路径写错
真正麻烦的是规则嵌套和多级目录下的相对路径处理——.htaccess 的行为高度依赖所在目录层级,同一段规则移到子目录就可能失效,这点容易被忽略。










