启用rewrite模块后Laravel路由仍异常,需添加/index.php/才能访问
我来帮你定位这个问题——既然另一台Ubuntu 16.04上的相同实例能正常运行,说明代码本身没问题,大概率是当前服务器的Apache配置细节没到位,咱们一步步排查:
1. 检查虚拟主机的AllowOverride配置
这是最常见的原因,Apache默认可能限制了.htaccess的生效权限。打开/etc/apache2/sites-enabled/下的对应虚拟主机配置文件,找到指向Laravel项目public目录的<Directory>块,确保里面设置了:
AllowOverride All
示例配置应该像这样:
<Directory /var/www/your-laravel-project/public> Options Indexes FollowSymLinks MultiViews AllowOverride All Require all granted </Directory>
修改完成后,别忘了重启Apache生效:
sudo systemctl restart apache2
2. 验证.htaccess文件内容与权限
Laravel默认的public/.htaccess应该包含正确的重写规则,如果你不确定,替换成以下内容试试:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
同时要确保.htaccess在public目录下,并且Apache用户有读取权限:
sudo chown www-data:www-data /var/www/your-project/public/.htaccess
3. 确认mod_rewrite模块真的启用了
虽然你执行了a2enmod rewrite,但可以再验证一遍:
sudo apache2ctl -M | grep rewrite
如果输出显示rewrite_module (shared),说明模块确实启用;如果没有,重新执行a2enmod rewrite并重启Apache。
4. 检查Apache全局配置的限制
有时候/etc/apache2/apache2.conf里的全局<Directory /var/www/>配置会覆盖虚拟主机的设置,打开这个文件找到:
<Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory>
把AllowOverride None改成AllowOverride All,或者至少确保虚拟主机的<Directory>块优先级更高(虚拟主机配置通常后加载,但全局设置可能有影响)。
5. 用无痕模式测试路由
有时候浏览器缓存了旧的跳转规则,导致测试结果不准,切换到无痕模式访问路由试试看。
另外,你可以对比两台Ubuntu机器的Apache配置文件、.htaccess内容,找出差异点,基本就能定位问题了。
内容的提问来源于stack exchange,提问作者Benno Nijholt

