DigitalOcean LEMP部署Laravel后public目录静态资源返回403禁止访问
问题根因定位
从你提供的Nginx错误日志access forbidden by rule可以直接判定:该403错误不是文件系统权限问题,是Nginx服务端配置规则主动拦截了静态资源的访问请求,你给出的目录/文件权限(属主为www-data、具备读/目录执行权限)完全符合Laravel运行要求,无需调整。
常见触发原因
- Nginx站点配置的
root参数指向错误,未直接指向Laravel项目的public目录,触发了Nginx默认的非web根目录访问限制 - 配置中存在误写的静态资源拦截规则,比如针对
.css/.js/.png/.jpg等后缀的请求设置了deny all规则 - 静态资源匹配优先级高于Laravel默认的
try_files规则,且规则逻辑错误导致请求被拦截 - 额外安装的WAF(如mod_security)、防盗链规则误拦截了本地正常的静态资源请求
解决方案
步骤1:修改Nginx站点配置
配置文件默认路径为/etc/nginx/sites-available/你的站点配置名.conf,调整为符合Laravel要求的标准配置:
- 确认
root参数直接指向项目public目录:
root /path/to/your/laravelproject/public; # 替换为你实际的public目录路径 index index.php index.html index.htm;
- 检查并删除所有针对静态资源后缀的拦截规则,保留默认的
try_files规则即可:
location / { try_files $uri $uri/ /index.php?$query_string; }
- 若安装了mod_security等安全组件,可临时关闭后测试是否恢复访问。
步骤2:生效配置
先测试配置合法性,避免配置错误导致Nginx崩溃:
sudo nginx -t
返回test is successful后重载Nginx生效:
sudo systemctl reload nginx
步骤3:验证访问
清空浏览器缓存后重新访问页面,或直接用curl本地测试静态资源返回:
curl -I http://你的站点域名/css/你的测试css文件.css
返回200状态码即代表修复成功。
可选优化(非必要)
你public下的img目录设置了SUID/SGID位(权限显示为drwsr-sr-x),无安全风险也不影响访问,如需调整为标准权限可执行:
chmod -R 755 /path/to/your/laravelproject/public/img
内容的提问来源于stack exchange,提问作者Fateh Alrabeai
相关产品推荐
相关产品推荐

