Debian 11环境Apache2的.htaccess重写规则不生效问题
Laravel项目Apache重写规则不生效排查修复
现有配置存在的核心问题
- 站点根目录配置错误:Laravel的唯一Web入口是项目自身的
public目录,当前配置将DocumentRoot指向/var/www/api.domain.pl/public_html,既会导致.env等敏感文件直接暴露在公网,也会让重写规则的路径匹配完全错乱。你当前写的重写规则会去找/var/www/api.domain.pl/public_html/public/index.php,和实际文件路径不匹配。 - 重写规则逻辑矛盾:规则中同时配置了
RewriteCond %{REQUEST_FILENAME} -f [OR]和RewriteCond %{REQUEST_FILENAME} !-f两个互斥条件,等于所有请求(包括静态资源)都会被强制重写,不符合Laravel的路由转发逻辑。 - 全局配置语法错误:贴出的
apache2.conf中最后一个<Directory /var/www/>配置段缺少闭合标签</Directory>,会导致Apache加载配置时出现异常,部分目录规则不生效。 - HTTPS虚拟主机未配置:当前80端口的配置仅做HTTP到HTTPS的跳转,certbot自动生成的443端口SSL虚拟主机默认不会继承80端口的目录权限、
AllowOverride配置,跳转到HTTPS后.htaccess规则不会被加载,这是自动签证书后最容易遗漏的配置点。 - Webmin配置覆写风险:Webmin会自动生成Apache配置缓存,如果手动修改conf文件后没有在Webmin面板点「应用更改」,重启服务时手动修改的内容会被旧缓存覆盖。
修复步骤
1. 调整目录结构
将Laravel项目文件直接放在/var/www/api.domain.pl/目录下,保证项目入口文件路径为/var/www/api.domain.pl/public/index.php,不要嵌套在public_html目录下。
2. 修正虚拟主机配置
修改80端口的站点配置文件(domain.conf),将根目录直接指向Laravel的public目录,推荐直接将重写规则写在虚拟主机配置中(比.htaccess解析效率更高):
<VirtualHost *:80> ServerAdmin admin@api.domain.pl ServerName api.domain.pl ServerAlias www.api.domain.pl DocumentRoot /var/www/api.domain.pl/public <Directory /var/www/api.domain.pl/public> Options FollowSymLinks Options -Indexes AllowOverride All Require all granted RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [L,QSA] </Directory> ErrorLog ${APACHE_LOG_DIR}/api.error.log CustomLog ${APACHE_LOG_DIR}/api.access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =www.api.domain.pl [OR] RewriteCond %{SERVER_NAME} =api.domain.pl RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost>
找到/etc/apache2/sites-available/目录下自动生成的443端口SSL配置文件(一般命名为api.domain.pl-le-ssl.conf),将其中的DocumentRoot和<Directory>段替换为和上面完全一致的内容,删除默认指向public_html的配置。
3. 修复全局Apache配置
编辑/etc/apache2/apache2.conf,删除重复的/var/www目录配置,补上缺失的标签闭合,最终保留如下配置段即可:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
4. 设置正确的目录权限
Debian系统下Apache的运行用户为www-data,执行以下命令修正项目权限,避免权限问题导致规则不生效:
chown -R www-data:www-data /var/www/api.domain.pl/ find /var/www/api.domain.pl/ -type d -exec chmod 755 {} \; find /var/www/api.domain.pl/ -type f -exec chmod 644 {} \;
5. 校验配置并重启服务
先执行配置语法校验,确认没有错误:
apache2ctl configtest
命令返回Syntax OK后,重启Apache服务,同时在Webmin面板的Apache管理页点击「应用更改」同步配置:
systemctl restart apache2
可选:使用.htaccess的配置方式
如果需要保留.htaccess配置方式,删除你之前写的错误规则,在/var/www/api.domain.pl/public目录下新建.htaccess文件,写入Laravel官方默认规则即可:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理Authorization头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 真实存在的文件/目录不转发,其余请求全部走index.php入口 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
内容的提问来源于stack exchange,提问作者fkrzski
相关产品推荐
相关产品推荐

