Laravel 存储 sym:link 在本地环境中不工作
Laravel storage sym:link not working in local environment
我正在使用默认 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/public
和 ls -la
我看到 symlink 存在:
lrwxr-xr-x 1 root root 32 May 5 11:19 storage -> /var/www/html/storage/app/public
如果我然后检查 linked 文件夹是否也存在于容器中 cd /var/www/html/storage/app/public
一切都按预期存在。
此外,当直接检查 ls -la /var/www/html/public/storage/
时,它会显示 linked 文件夹的内容。所以从 symlink 的角度来看一切都在工作
# 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
服务器时returns 404.
/var/www/html/public
的剩余内容可以正常工作,例如 /var/www/html/public/test.png
在 localhost/test.png
下可见。
在生产中,一切正常。知道为什么符号 link 在本地系统上不起作用而 link 实际上是正确的吗?
我已经尝试删除存储 link 并再次设置 symlink。
在 nginx 的文件配置中添加这些行:
location ^~ /storage/ {
root "/var/www/html/public/storage/"
}
每次以storage
开头的请求都会直接访问共享路径
您提到您正在使用 docker。我认为它在本地不起作用但在生产中不起作用的原因可能是两个部署之间存在配置转换。
要使其正常工作,Nginx 容器必须有权访问存储文件夹,因为它应该为位于那里的资产提供服务。我猜目前情况并非如此,只挂载了 public 文件夹。
检查是否将整个项目或 ./public
和 ./storage
都挂载到 Nginx 容器中。
像这样:
services:
#...
nginx:
#...
volumes:
- "./public:/var/www/html/public:ro"
- "./storage/app:/var/www/html/storage/app:ro"
#...
确保您的符号链接是从 docker 容器内部创建的,这一点很重要。
如果您从容器外部 运行 storage:link,则符号链接将相对于您的本地计算机。
通过运行ning进入容器:
docker exec -it name_of_your_php_container bash
进入内部后,您应该可以 运行 php artisan
我正在使用默认 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/public
和 ls -la
我看到 symlink 存在:
lrwxr-xr-x 1 root root 32 May 5 11:19 storage -> /var/www/html/storage/app/public
如果我然后检查 linked 文件夹是否也存在于容器中 cd /var/www/html/storage/app/public
一切都按预期存在。
此外,当直接检查 ls -la /var/www/html/public/storage/
时,它会显示 linked 文件夹的内容。所以从 symlink 的角度来看一切都在工作
# 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
服务器时returns 404.
/var/www/html/public
的剩余内容可以正常工作,例如 /var/www/html/public/test.png
在 localhost/test.png
下可见。
在生产中,一切正常。知道为什么符号 link 在本地系统上不起作用而 link 实际上是正确的吗?
我已经尝试删除存储 link 并再次设置 symlink。
在 nginx 的文件配置中添加这些行:
location ^~ /storage/ {
root "/var/www/html/public/storage/"
}
每次以storage
开头的请求都会直接访问共享路径
您提到您正在使用 docker。我认为它在本地不起作用但在生产中不起作用的原因可能是两个部署之间存在配置转换。
要使其正常工作,Nginx 容器必须有权访问存储文件夹,因为它应该为位于那里的资产提供服务。我猜目前情况并非如此,只挂载了 public 文件夹。
检查是否将整个项目或 ./public
和 ./storage
都挂载到 Nginx 容器中。
像这样:
services:
#...
nginx:
#...
volumes:
- "./public:/var/www/html/public:ro"
- "./storage/app:/var/www/html/storage/app:ro"
#...
确保您的符号链接是从 docker 容器内部创建的,这一点很重要。
如果您从容器外部 运行 storage:link,则符号链接将相对于您的本地计算机。
通过运行ning进入容器:
docker exec -it name_of_your_php_container bash
进入内部后,您应该可以 运行 php artisan