Apache服务器不读取.htaccess文件,重定向失效求助
看起来你遇到的是.htaccess完全不生效的问题,结合你说的服务器上其他站点正常,大概率是几个容易忽略的配置点出了问题,我帮你一步步排查:
1. 先确认Apache的AllowOverride配置(核心前提)
这是.htaccess能生效的关键——哪怕文件权限正确,AllowOverride没开启的话,Apache会直接忽略.htaccess文件。打开你的VirtualHost配置,找到对应站点的<Directory>块,确保设置了AllowOverride All(如果只需要重定向权限,至少要设置AllowOverride FileInfo):
<Directory /path/to/your/site/documentroot> AllowOverride All # 其他原有配置... </Directory>
修改后记得重启Apache服务(比如sudo systemctl restart apache2,根据你的系统调整命令)。
2. 检查.htaccess的位置和拼写细节
- 确认文件确实放在网站的DocumentRoot根目录下,不能放在子目录(除非你特意针对子目录配置,但你要的是全局生效);
- 检查文件名是不是严格的
.htaccess——Unix/Linux系统下点开头的文件是隐藏文件,别写成htaccess(少了开头的点)或者.htaccess.txt(多了后缀)。
3. 关于Deny from all不生效的问题
如果你的Apache版本是2.4及以上,Deny from all是旧的2.2版本语法,2.4已经改用Require指令了,替换成下面的代码再测试:
Require all denied
如果替换后网站被禁止访问,说明.htaccess已经开始生效了。
4. 排查www转非www的重定向规则
不管是在.htaccess还是VirtualHost里,规则写法要准确:
在.htaccess中配置:
RewriteEngine On # 匹配www开头的域名(NC表示不区分大小写) RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com$ [NC] # 重定向到非www域名,301是永久重定向 RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301]
在VirtualHost中配置:
要确保在对应端口的VirtualHost块内开启RewriteEngine,并且包含ServerAlias匹配www域名:
<VirtualHost *:80> ServerName yourdomain.com ServerAlias www.yourdomain.com DocumentRoot /path/to/your/site RewriteEngine On RewriteCond %{HTTP_HOST} ^www\.yourdomain\.com$ [NC] RewriteRule ^(.*)$ https://yourdomain.com/$1 [L,R=301] # 其他原有配置... </VirtualHost>
⚠️ 注意:
- 如果用HTTPS,要在443端口的VirtualHost里也配置相同的重定向规则;
- 测试前清空浏览器缓存,因为301永久重定向会被浏览器缓存,可能导致修改规则后看不到变化;
- 可以用服务器端命令
curl -I https://www.yourdomain.com测试,查看返回的Location头是否正确。
5. 检查权限的细节
虽然.htaccess是644,但要确保:
- 网站的DocumentRoot目录权限至少是755,并且Apache进程的用户(比如
www-data)有读取权限; .htaccess的所有者如果不是Apache用户,至少要保证其他用户有读取权限(644权限已经满足,但如果父目录权限限制了Apache访问,也会出问题)。
6. 查看Apache错误日志
如果上面的步骤都没解决问题,直接去看Apache的错误日志(一般路径是/var/log/apache2/error.log),里面会有具体的错误提示——比如.htaccess被忽略的原因、规则语法错误等,这是最直接的排查方式。
内容的提问来源于stack exchange,提问作者xylar
相关产品推荐
相关产品推荐

