Ubuntu 22.04 Apache2服务器移除.php后缀及.htaccess问题排查
解决Apache2下.htaccess移除.php后缀无效的问题
先修正规则中的核心错误
你当前的Rewrite规则存在正则匹配错误,这大概率是线上失效的关键原因:
- 第一条
RewriteCond里的\s/+(\.+?)\.php[\s?]写法错误,\.+?会匹配连续的点符号,而非文件名。根据需求,正确写法分两种场景:- 仅匹配根目录下的文件:
RewriteCond %{THE_REQUEST} \s/+([^/.]+)\.php[\s?] [NC] - 支持子目录下的文件(比如
/dir/file.php):RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC]
- 仅匹配根目录下的文件:
排查线上Apache配置细节
启用mod_rewrite模块
线上服务器默认可能未开启该模块,执行以下命令:sudo a2enmod rewrite sudo systemctl restart apache2确保.htaccess权限正确
Apache进程(通常是www-data用户)需要能读取该文件,执行:sudo chown www-data:www-data /path/to/your/site/.htaccess sudo chmod 644 /path/to/your/site/.htaccess验证AllowOverride配置位置
打开网站配置文件(比如/etc/apache2/sites-available/your-site.conf),确认AllowOverride All是配置在对应网站目录的<Directory>块中,而非全局或错误位置:<Directory /path/to/your/site> AllowOverride All Require all granted </Directory>修改后重启Apache:
sudo systemctl restart apache2清除浏览器缓存
301重定向会被浏览器持久缓存,测试前务必清除缓存,避免本地缓存干扰线上验证结果。
修正后的完整.htaccess规则
RewriteEngine On # 外部重定向 /dir/file.php 到 /dir/file RewriteCond %{THE_REQUEST} \s/+(.+?)\.php[\s?] [NC] RewriteRule ^ /%1 [R=301,NE,L] # 内部重写 /dir/file 到 /dir/file.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}.php -f RewriteRule ^(.+?)/?$ $1.php [L]
测试建议:先用R=302临时重定向确认规则生效,再改成R=301永久重定向,减少缓存风险。
内容的提问来源于stack exchange,提问作者DONALD BADA
相关产品推荐
相关产品推荐

