Laravel中storage与public间符号链接无法访问问题求助
解决Laravel符号链接无法访问文件的问题
我之前迁移Laravel项目到独立服务器时,也碰到过几乎一模一样的符号链接问题!结合我的排查经验,给你几个靠谱的解决方向:
1. 检查文件/目录权限
这是最常见的坑,Apache或Nginx的运行用户(通常是www-data、apache或者nginx)需要拥有对源目录和符号链接本身的读取权限:
- 先给源目录设置合理权限,目录设为
755,文件设为644:chmod -R 755 /home/username/project/storage/app/public/receipts chmod -R 644 /home/username/project/storage/app/public/receipts/* - 确保符号链接的父目录
public_html权限正确:chmod 755 /home/username/public_html - 最后调整目录所属用户组,让Web服务器用户能访问:
# 假设Web运行用户是www-data chown -R username:www-data /home/username/project/storage/app/public/receipts
2. 检查Web服务器的符号链接配置
如果权限没问题,大概率是Web服务器默认禁止了跟随符号链接:
- Apache:在
public_html的配置文件或.htaccess中添加Options +FollowSymLinks,之后重启Apache:<Directory /home/username/public_html> Options +FollowSymLinks AllowOverride All </Directory> - Nginx:在server块中加入
disable_symlinks off;,确保root指向public_html,然后重启Nginx:server { root /home/username/public_html; disable_symlinks off; # 其他配置项... }
3. 验证符号链接的正确性
有时候看起来创建成功,但实际指向的路径有误:
- 用命令查看符号链接的真实指向:
ls -l /home/username/public_html/storage # 正确输出应该是:storage -> /home/username/project/storage/app/public/receipts - 如果路径不对,先删除旧链接再重新创建:
rm /home/username/public_html/storage ln -s /home/username/project/storage/app/public/receipts /home/username/public_html/storage
4. 检查SELinux状态(若服务器开启)
部分服务器默认开启SELinux,会阻止Web服务器访问符号链接指向的目录:
- 先临时关闭SELinux测试:
setenforce 0 - 如果关闭后能访问了,给源目录添加正确的SELinux上下文:
chcon -R -t httpd_sys_content_t /home/username/project/storage/app/public/receipts - 也可以永久修改SELinux配置(编辑
/etc/selinux/config,将SELINUX=enforcing改为SELINUX=permissive)
按照上面的步骤排查,应该就能解决问题了!我当时就是Apache没开FollowSymLinks加上权限没配置对,折腾了好一会儿才搞定。
内容的提问来源于stack exchange,提问作者Johnerino
相关产品推荐
相关产品推荐

