Laravel + Heroku:在Heroku中访问图片返回403(禁止)

时间:2018-11-06 02:05:18

标签: laravel heroku

我在Laroku中部署了Laravel应用,很高兴它运行良好,但是该应用无法访问/storage/app/public/uploads/内部的图像。我还运行php artisan storage:link,这是/storage/文件夹到/public/目录的符号链接,导致创建/public/storage/uploads/

  • Heroku内部有图像文件(使用heroku run bashls -la storage/app/public/uploads进行了查看。

Heroku日志

这是heroku中日志的一部分。

2-11-06T01:47:03.064600+00:00 app[web.1]: 10.101.243.98 - - [06/Nov/2018:01:47:03 +0000] "GET /storage/uploads/mobile-cabinet.jpg HTTP/1.1" 403 243 "http://somename.herokuapp.com/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.75 Safari/537.36

2018-11-06T01:47:03.225408+00:00 app[web.1]: [Tue Nov 06 01:47:03.224875 2018] [core:error] [pid 97:tid 139829891245824] [client 10.65.51.99:29323] AH00037: Symbolic link not allowed or link target not accessible: /app/public/storage, referer: http://somename.herokuapp.com/

问题

  • Laravel应用程序如何访问它以显示到Web应用程序?

1 个答案:

答案 0 :(得分:3)

Heroku dyno上的文件系统是短暂的。因此,如果手动创建符号链接,则在重新启动dyno或下次部署时它将被销毁。另外,如果您正在运行类似heroku php artisan storage:link之类的命令,那么该命令将在与Web dyno不同的上下文中执行。该命令运行完毕后,该符号链接将被销毁。

例如,heroku run "php artisan storage:link; ls -la public"会达到您的期望:

heroku run "php artisan storage:link; ls -la public"
Running php artisan storage:link; ls -la public on ⬢ glacial-ocean-62163... up, run.9596 (Free)
The [public/storage] directory has been linked.
total 28
drwx------  4 u28609 dyno 4096 Feb 27 19:39 .
drwx------ 14 u28609 dyno 4096 Feb 27 19:39 ..
-rw-------  1 u28609 dyno  593 Feb 27 19:32 .htaccess
drwx------  2 u28609 dyno 4096 Feb 27 19:32 css
-rw-------  1 u28609 dyno    0 Feb 27 19:32 favicon.ico
-rw-------  1 u28609 dyno 1823 Feb 27 19:32 index.php
drwx------  2 u28609 dyno 4096 Feb 27 19:32 js
-rw-------  1 u28609 dyno   24 Feb 27 19:32 robots.txt
lrwxrwxrwx  1 u28609 dyno   23 Feb 27 19:39 storage -> /app/storage/app/public

但是,如果您再次运行heroku run ls -la public,则该符号链接将消失:

Running ls -la public on ⬢ glacial-ocean-62163... up, run.7351 (Free)
total 28
drwx------  4 u54238 dyno 4096 Feb 27 19:32 .
drwx------ 14 u54238 dyno 4096 Feb 27 19:40 ..
-rw-------  1 u54238 dyno  593 Feb 27 19:32 .htaccess
drwx------  2 u54238 dyno 4096 Feb 27 19:32 css
-rw-------  1 u54238 dyno    0 Feb 27 19:32 favicon.ico
-rw-------  1 u54238 dyno 1823 Feb 27 19:32 index.php
drwx------  2 u54238 dyno 4096 Feb 27 19:32 js
-rw-------  1 u54238 dyno   24 Feb 27 19:32 robots.txt

实际上,它在您的Web dyno上从未存在。

了解文件系统是临时的,还应该引起您重新考虑使用存储文件夹进行用户上传。当您的dyno重新启动时,这些上载也会丢失。而是将用户上传的内容存储在Amazon S3或其他某种形式的异地存储中。这将使您可以随意缩放或破坏测功机,而不会冒用用户数据的风险。在Heroku documentation中有关于此的更多信息。