.htaccess更新后WordPress网站出现500内部错误,求排查原因
WordPress .htaccess更新后反复触发500错误的解决办法
网站基于WordPress搭建,搭配WPML和Elementor插件,每次.htaccess自动更新后就会出现500内部服务器错误。手动删除# BEGIN WordPress与# END WordPress之间的乱码阿拉伯语注释后,网站能恢复正常,但问题会反复出现。
问题根源
乱码注释是字符编码不兼容导致的:Apache服务器要求.htaccess必须使用UTF-8无BOM编码,但自动生成这些注释的组件(大概率是WPML多语言插件或主机的Newfold缓存工具)写入注释时用了错误编码,产生无法解析的乱码字符,触发服务器报错。而且WordPress会在固定链接更新、插件配置变更等场景自动重写.htaccess,每次重写都会重新插入乱码注释,导致问题反复。
解决办法
1. 禁用WordPress自动生成注释的功能
往主题的functions.php文件添加以下代码,阻止WordPress在重写.htaccess时插入默认注释:
add_filter('mod_rewrite_rules', function($rules) { $rules = preg_replace('/# BEGIN WordPress.*?# END WordPress/s', '# BEGIN WordPress' . PHP_EOL . $rules . PHP_EOL . '# END WordPress', $rules); return $rules; });
或者直接替换默认重写规则输出:
add_filter('generate_rewrite_rules', function($wp_rewrite) { $wp_rewrite->rules = array( '^ar/wp-login.php' => '/wp-login.php [QSA,L]', '^index\.php$' => '- [L]', '.' => '/index.php [L]' ); });
注意:修改前先备份functions.php,用子主题修改更稳妥,避免主题更新覆盖代码。
2. 修复WPML的注释编码问题
WPML生成多语言规则时可能因编码设置出错:
- 进入WPML设置页面,检查站点语言和次要语言的编码,确保统一为UTF-8。
- 关闭WPML自动更新.htaccess的功能:在WPML → 语言 → 站点语言设置的高级选项里,关掉“自动更新.htaccess以支持多语言URL”。然后手动把必要的多语言重写规则(比如
RewriteRule ^ar/wp-login.php /wp-login.php [QSA,L])加到# BEGIN WordPress区块内,之后把.htaccess权限改成644,防止自动改写。
3. 清理并锁定.htaccess文件
- 手动清理乱码注释,保留正常规则(如下):
# BEGIN WordPress <IfModule mod_expires.c> ExpiresActive On ExpiresByType image/jpg "access plus 24 hours" ExpiresByType image/jpeg "access plus 24 hours" ExpiresByType image/gif "access plus 24 hours" ExpiresByType image/png "access plus 24 hours" ExpiresByType text/css "access plus 24 hours" ExpiresByType application/pdf "access plus 1 week" ExpiresByType text/javascript "access plus 24 hours" ExpiresByType text/html "access plus 2 hours" ExpiresByType image/x-icon "access plus 1 year" ExpiresDefault "access plus 24 hours" </IfModule> Options -Indexes <IfModule mod_headers.c> Header set X-Endurance-Cache-Level "1" Header set X-nginx-cache "WordPress" </IfModule> <IfModule mod_rewrite.c> RewriteEngine On RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] RewriteBase / RewriteRule ^index\.php$ - [L] RewriteRule ^ar/wp-login.php /wp-login.php [QSA,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
- 通过FTP或主机控制面板,把.htaccess权限设为644,禁止自动改写。后续需要更新规则时,再临时改为可写,更新后改回只读。
4. 排查主机插件冲突
你的.htaccess里有Newfold缓存相关规则,这类主机插件可能和WPML的.htaccess改写冲突:
- 暂时禁用Newfold缓存功能,看看问题是否消失。
- 联系主机提供商,确认Newfold工具是否支持多语言站点的编码兼容。
内容的提问来源于stack exchange,提问作者5G Salalah
相关产品推荐
相关产品推荐

