apache 默认禁用 .htaccess 生效,需在 httpd.conf 中将对应 directory 的 allowoverride 设为 all,并重启 apache;同时确保 404.html ≥512 字节且注释掉 httpd-multilang-errordoc.conf 中的全局 errordocument 指令。

确认 Apache 是否允许 .htaccess 覆盖配置
XAMPP 默认禁用 .htaccess 文件生效,即使你写了 ErrorDocument 404 /404.html,Apache 也会直接忽略。关键在 httpd.conf 中的 AllowOverride 设置。
打开 C:\xampp\apache\conf\httpd.conf(Windows)或对应路径,搜索 <directory></directory>(或你的 DocumentRoot 路径),确保其中包含:
AllowOverride All
如果看到的是 AllowOverride None 或注释掉的行,必须改为 All 并保存。否则后续所有 .htaccess 指令都不起作用。
- 改完必须通过 XAMPP Control Panel 重启 Apache,仅刷新浏览器无效
- 若项目不在
htdocs根目录下(比如在htdocs/myapp),要找到对应子目录的<directory></directory>块并同样设为AllowOverride All - 没启用
mod_rewrite不影响ErrorDocument,但若你同时用重写规则,需确认LoadModule rewrite_module modules/mod_rewrite.so已取消注释
正确书写 .htaccess 中的 ErrorDocument 指令
ErrorDocument 404 后面的路径是相对于网站根目录(DocumentRoot)的 URL 路径,不是文件系统绝对路径,也不是相对于 .htaccess 所在位置。
例如:你的项目放在 C:\xampp\htdocs\blog,想让该子目录使用独立的 404.html,那么:
-
.htaccess必须放在C:\xampp\htdocs\blog目录下 - 内容应为:
ErrorDocument 404 /blog/404.html(开头带/,表示从根开始) - 不能写成
ErrorDocument 404 404.html(相对当前目录,Apache 不支持这种写法) - 也不能写成
ErrorDocument 404 ./404.html或ErrorDocument 404 ../blog/404.html(语法错误,会被忽略)
常见错误现象:页面仍显示默认 Apache 404,且 error.log 中无相关警告——大概率是路径写错或 AllowOverride 未生效。
对设计或页面进行 WCAG 2.1 AA 无障碍审计。触发关键词:“audit accessibility”、 “check a11y”、 “is this accessible?” 或在审查设计时使用。
404.html 文件本身有硬性大小限制
Apache(特别是 Windows 下的 XAMPP)会主动忽略小于 512 字节的自定义错误页,直接回退到内置提示。这不是 bug,是 Apache 的安全策略:防止极简页面被用于钓鱼或信息泄露。
所以即使 404.html 内容正确、路径无误、配置全开,只要它太小,就一定不生效。
- 用文本编辑器打开
404.html,检查文件大小(右键属性 → 详细信息) - 如果显示小于 512B,往里面加点无害内容,比如多几行空格、注释或隐藏的
<div style="display:none">...</div> - 推荐最低写满 600 字节以上,避免临界值波动
- 别依赖浏览器“查看源码”判断大小——要查磁盘上真实字节数
优先检查 httpd-multilang-errordoc.conf 的干扰
XAMPP 默认启用了多语言错误文档模块,其配置文件 conf/extra/httpd-multilang-errordoc.conf 里已定义了 ErrorDocument 404 /404error.html 等指令。这个文件被 httpd.conf 通过 Include 加载,**优先级高于 .htaccess**。
如果你在 .htaccess 里写了 ErrorDocument 404 却没效果,先打开 conf/extra/httpd-multilang-errordoc.conf,找到这行:
ErrorDocument 404 /404error.html
把它注释掉(前面加 #),或者直接删掉整行,再重启 Apache。
- 不改这里,
.htaccess的设置永远被覆盖 - 改完后,
.htaccess才真正有机会接管 404 响应 - 注意:该文件里的路径也是相对于
DocumentRoot,所以/404error.html实际指向htdocs/404error.html
最常被忽略的其实是三件事:AllowOverride All 没开、404.html 小于 512 字节、httpd-multilang-errordoc.conf 里的全局 ErrorDocument 没关。只要这三个点都核对过,.htaccess 方式基本就能稳住。










