Laravel存储系统:链接在本地环境中不工作

cnh2zyt3  于 2023-03-13  发布在  其他
关注(0)|答案(4)|浏览(137)

我使用默认的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/时,它会显示链接文件夹的内容,所以从符号链接的Angular 来看一切都正常

# 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下可见。
在生产上,一切都很好。你知道为什么符号链接在本地系统上不起作用,而链接实际上是正确的吗?
我已经尝试删除存储链接并再次设置符号链接。

9rnv2umw

9rnv2umw1#

你提到你正在使用docker,我认为它不能在本地工作,但在生产中工作的原因可能是两个部署之间的配置转换。
Nginx容器必须能够访问存储文件夹,因为它应该服务于存储文件夹中的资产。我猜目前情况并非如此,只有公共文件夹被挂载。
检查是否整个项目或./public./storage都已装入Nginx容器。
大概是这样的

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

8i9zcol22#

在nginx的文件配置中添加以下行:

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

每次请求以storage开头时,将直接访问共享路径。

nr9pn0ug

nr9pn0ug3#

对于运行Laravel Sail和Docker的任何人,您需要通过命令行进入Docker容器,或者在我的情况下进入Docker Desktop的预构建终端并运行以下命令:
su sail(切换到sail用户)
php artisan storage:link(将sym链接添加到Docker容器中。

omjgkv6w

omjgkv6w4#

确保符号链接是从Docker容器内部创建的,这一点很重要。
如果您从容器外部运行storage:link,则符号链接将相对于您的本地机器。
通过运行以下命令进入容器:

docker exec -it name_of_your_php_container bash

一旦你在里面,你应该能够运行php工匠

相关问题