Laravel项目部署到CWP服务器后,直接访问storage/uploads下的文件返回404但通过控制器可正常下载
Laravel项目部署到CWP服务器后,直接访问storage/uploads下的文件返回404但通过控制器可正常下载
嗨,这个问题我碰到过好多次啦!核心原因其实很好理解:直接通过URL访问是让Web服务器(Nginx/Apache)直接找文件,而控制器下载是通过Laravel程序读取文件再输出,两者的访问逻辑完全不一样,咱们一步步来排查解决:
第一步:先确认storage的软链接有没有正确创建
Laravel的storage/app/public目录里的文件,默认需要通过软链接映射到项目的public/storage目录,Web服务器才能直接访问到(因为Web服务器的根目录是项目的public文件夹)。本地环境可能自动帮你创建了,但CWP服务器上大概率没弄:
- 登录CWP的终端,cd到你的Laravel项目根目录
- 先删除可能存在的旧链接:
rm -rf public/storage - 重新创建软链接:
php artisan storage:link - 操作完后,你可以在项目的
public目录下看到storage这个软链接,它指向../storage/app/public
要是这一步没做,Web服务器根本不知道/storage/uploads/xxx.pdf对应的实际文件在哪里,自然会返回404。
第二步:检查CWP的Web服务器配置
如果软链接弄好了还是404,那就是Web服务器的配置没允许访问软链接,或者根目录设置错了:
- 如果用的是Nginx:
找到你网站的Nginx配置文件(CWP后台可以在「WebAdmin」→「你的域名」→「Nginx配置」里编辑,或者终端路径是/etc/nginx/conf.d/你的域名.conf)
确保两个关键点:- 根目录指向的是Laravel项目的
public文件夹,比如:root /home/你的用户名/public_html/laravel-project/public; - 在
location /块里加上follow_symlinks on;,允许Nginx跟随软链接访问文件
- 根目录指向的是Laravel项目的
- 如果用的是Apache:
打开项目public目录下的.htaccess文件,确保里面有Options +FollowSymLinks或者Options +SymLinksIfOwnerMatch的配置;另外也可以在CWP的Apache配置里给你的网站开启跟随软链接的权限。
第三步:检查文件和目录的权限
CWP服务器上的权限管控比较严,Web服务器进程(一般是apache、www-data或者nginx用户)没有读取storage目录的权限,也会返回404:
- 给storage目录设置可读可执行的权限:
chmod -R 755 storage/ - 把目录和文件的所属用户改成Web服务器的用户,比如:
chown -R apache:apache storage/(如果是Nginx的话就改成nginx:nginx,不确定的话可以看CWP后台的服务器信息)
为啥控制器下载就没问题?
因为控制器下载是Laravel程序先读取storage目录里的文件(Laravel进程的权限一般是你登录服务器的用户,权限足够),然后把文件内容输出给浏览器,这个过程绕开了Web服务器直接访问文件的逻辑,所以只要Laravel能读到文件,就能正常下载。
备注:内容来源于stack exchange,提问作者 uno
相关产品推荐
相关产品推荐

