在Web服务器子目录部署Laravel出现403错误的.htaccess配置求助
问题原因与解决方案
你遇到的403错误核心原因有两个:一是访问/erp路径时没有找到对应目录下的默认索引文件,Apache禁止列目录直接返回权限错误;二是现有根目录.htaccess的重写规则指向错误,没有把erp路径的请求转发到Laravel正确的入口目录。
1. 修正根目录.htaccess规则
原配置里的erp路径转发规则有误,当前是将/erp/的请求转发到站点根目录的public文件夹,而非erp子目录下的public文件夹,导致访问不到正确的入口文件。修改对应规则如下:
RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !GOOGLE404probe # 修正转发路径指向erp子目录下的public RewriteRule ^erp/(.*)$ /erp/public/$1 [L] RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
2. 补充Laravel必要的.htaccess配置
Laravel自带的public目录下默认包含入口重写规则,如果你没有保留该文件,需要在erp/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} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^ index.php [L] </IfModule>
如果希望直接访问/erp就能进入应用无需加/public后缀,也可以把上述文件复制到erp根目录,同时将erp目录下的server.php重命名为index.php即可。
3. 确认权限与Apache配置
- 确保erp目录的所属用户与Web服务器运行用户一致,Linux下常用的Web服务器用户为www-data,可执行命令
sudo chown -R www-data:www-data /你的站点根目录路径/erp修正所属权 - 确保Apache已经开启
mod_rewrite模块,且站点配置中允许.htaccess生效,即对应Directory配置段中有AllowOverride All配置 - Laravel的
storage和bootstrap/cache目录需要额外写入权限,可执行chmod -R 775 /你的站点根目录路径/erp/storage /你的站点根目录路径/erp/bootstrap/cache配置
内容的提问来源于stack exchange,提问作者Kis Gábor
相关产品推荐
相关产品推荐

