Laravel存储符号:链接在本地环境中不工作



我使用默认的laravel文件夹结构和文件系统public:

'public' => [
'driver'     => 'local',
'root'       => storage_path('app/public'),
'url'        => env('APP_URL') . '/storage',
'visibility' => 'public',
],

所有东西都在docker上运行,完整的laravel文件夹安装到/var/www/html:中

#... Laravel PHP-FPM service definition
volumes:
- "./:/var/www/html"
#...

当我运行php artisan storage:link,然后运行cd /var/www/html/publicls -la时,我看到符号链接存在:

lrwxr-xr-x 1 root root 32 May 5 11:19 storage -> /var/www/html/storage/app/public

如果我检查链接的文件夹是否也存在于容器cd /var/www/html/storage/app/public中,那么一切都如预期的那样存在。

此外,当直接检查ls -la /var/www/html/public/storage/时,它会向我显示链接文件夹的内容。所以一切都是从符号链接的角度

# ls -la /var/www/html/public/storage/
total 512
drwxr-xr-x  4 www-data www-data    128 May  5 11:21 .
drwxr-xr-x 11 www-data www-data    352 Apr 19 14:03 ..
-rw-r--r--  1 www-data www-data     14 Feb 16 16:58 .gitignore
-rw-r--r--  1 www-data www-data 519648 May  5 10:58 sample.png

然而,当打开url/storage/sample.png时,服务器返回404。

/var/www/html/public的其余内容工作正常,因此例如/var/www/html/public/test.pnglocalhost/test.png下可见。

在生产方面,一切都很好。有什么想法吗?为什么符号链接在本地系统上不起作用,而链接实际上是正确的?

我已经尝试删除存储链接并再次设置符号链接。

您提到您正在使用docker。我认为它不能在本地工作,而是在生产中工作的原因可能是两种部署之间的配置发生了变化。

Nginx容器必须能够访问存储文件夹,因为它应该为位于那里的资产提供服务。我猜目前情况并非如此,而且只装载了公用文件夹。

检查整个项目或./public./storage是否已安装到Nginx容器中。

类似这样的东西:

services:
#...
nginx:
#...
volumes:
- "./public:/var/www/html/public:ro"
- "./storage/app:/var/www/html/storage/app:ro"
#...

对于任何运行Laravel Sail和Docker的人,你需要通过命令行进入Docker容器,或者在我的情况下进入Docker Desktop的预构建终端,并运行以下命令:

su sail(切换到航行用户(

php artisan storage:link(将符号链接添加到docker容器中。

在nginx:的文件配置中添加这些行

location ^~ /storage/ {
root "/var/www/html/public/storage/"
}

每次请求以storage开始时,都会直接访问共享路径。

确保符号链接是从docker容器内部创建的,这一点很重要。

如果从容器外部运行storage:link,则符号链接将相对于本地计算机。

通过运行进入容器

docker exec -it name_of_your_php_container bash

一旦你进入,你应该能够运行php手工

最新更新