在Heroku中使用Laravel关联存储目录显示图片(已执行php artisan storage:link)
我之前也碰到过一模一样的问题——软链接明明用php artisan storage:link建好了,但就是加载不出图片,折腾了好一阵才搞定。结合我的踩坑经验,给你梳理几个排查和解决的方向,应该能帮你搞定:
1. 先确认软链接是否真的创建正确
先别着急调配置,先检查软链接本身有没有问题:
- 直接去项目的
public目录下,看看有没有storage这个软链接文件; - 或者用命令行验证:
ls -l public/
如果输出里有类似storage -> ../storage/app/public的行,说明链接路径是对的。如果没看到,或者路径不对,先删掉旧链接再重建:
rm public/storage php artisan storage:link
⚠️ 执行命令时一定要在项目根目录下,别跑错路径了!
2. 检查Web服务器配置(这是最常见的问题!)
大部分时候,软链接无法访问是因为Web服务器默认不允许跟随符号链接,得手动开启:
如果你用的是Nginx:
打开你的站点配置文件(一般在/etc/nginx/sites-available/目录下),确保location /块里加上follow_symlinks on;,同时root要指向项目的public目录。示例配置:
server { listen 80; server_name your-domain.com; root /var/www/your-project/public; # 你的项目public目录路径 index index.php index.html; location / { try_files $uri $uri/ /index.php?$query_string; follow_symlinks on; # 必须加上这一行! } # 下面是PHP处理的配置,不用动,确保存在就行 location ~ \.php$ { include snippets/fastcgi-php.conf; fastcgi_pass unix:/run/php/php8.2-fpm.sock; # 对应你的PHP版本 } }
改完后重启Nginx生效:
sudo systemctl restart nginx
如果你用的是Apache:
要么在虚拟主机配置里,要么在项目根目录的.htaccess文件里,加上允许跟随符号链接的配置:
Options +FollowSymLinks
同时确保你的虚拟主机配置里AllowOverride设置为All,并且加载了mod_rewrite模块。最后重启Apache:
sudo systemctl restart apache2
3. 再核对一遍存储目录的权限
虽然你说改权限没用,但还是要确认是不是用了正确的权限设置——Laravel的storage目录需要让Web服务器的用户(比如www-data、nginx)有读写权限:
# 设置目录所有者为你的用户 + Web服务器用户组 sudo chown -R $USER:www-data storage/ bootstrap/cache/ # 设置目录权限为775,文件为664(安全且够用) sudo chmod -R 775 storage/ bootstrap/cache/
⚠️ 千万别图省事设成777,安全风险极高!
4. 检查Laravel的文件系统配置
打开config/filesystems.php,确认public磁盘的配置是否正确:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
重点看url字段,要和你的APP_URL环境变量对应,比如你的站点是http://localhost:8000,这里就应该是http://localhost:8000/storage,这样生成的图片链接才会指向软链接的路径。
5. 清除Laravel缓存
有时候旧的配置缓存会导致新设置不生效,执行这几个命令清一下:
php artisan cache:clear php artisan config:clear php artisan route:clear
6. 排查SELinux(仅Linux服务器)
如果你的服务器开启了SELinux,它可能会阻止Web服务器访问软链接指向的目录。可以先临时关闭测试:
sudo setenforce 0
如果图片能正常显示了,就给存储目录设置SELinux规则,之后再开启SELinux:
# 给storage目录添加Web服务器可访问的上下文 sudo chcon -R -t httpd_sys_rw_content_t storage/ # 重新开启SELinux sudo setenforce 1
按照这个顺序一步步排查,应该能解决软链接无法访问的问题。毕竟软链接省空间的优势确实很香,尤其是多项目复用资源的时候。
内容的提问来源于stack exchange,提问作者kaycee

