这类问题我又碰上了一次。WordPress 站点跑在 Apache 2.4 上,运维在 .htaccess 里加了一段 RewriteCond,保存后整站 500,error_log 里只有 .htaccess: Invalid command 'RewriteEngine',看起来像模块没装。
第一反应是「文件里混进了 Windows 换行,指令被拼成一行」,验证下来不成立。
把日志和配置对完,能解释这个现象的基本就这几处。mod_rewrite 没加载,.htaccess 里的伪静态指令全部无效;AllowOverride 设成 None,Apache 直接忽略或报错;在 .htaccess 里写了只允许放主配置的指令,比如 VirtualHost。
动手时先确认模块和 AllowOverride 的实际状态
httpd -M | grep rewrite; grep -n AllowOverride /etc/httpd/conf/httpd.conf
接着检查文件里有没有非法换行和多余空格
file .htaccess && sed -n '1,20p' .htaccess
随后打开 AllowOverride 并加载模块
sed -i 's/AllowOverride None/AllowOverride All/' /etc/httpd/conf/httpd.conf
语法检查后平滑重载
httpd -t && apachectl graceful
中途换过一次思路,把范围缩到最小的那一层,反而快了。
改完先别撤,确认这几项。访问首页返回 200,伪静态规则生效,error_log 里不再出现 Invalid command。
容易忽略的是,.htaccess 每个请求都会重新读取,量大的站点把规则挪进主配置更好;AllowOverride All 会带来一定开销,按目录放开即可。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。
