laravel - Laravel + Heroku:在 Heroku 中访问图像返回 403(禁止)
问题描述
我在 Heroku 中部署了我的 Laravel 应用程序,很高兴它运行良好,但该应用程序无法访问/storage/app/public/uploads/
. 我还运行了一个文件夹到目录php artisan storage:link
的符号链接,导致创建./storage/
/public/
/public/storage/uploads/
- Heroku 中有图像文件(使用
heroku run bash
和ls -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 应用程序?
解决方案
Heroku dyno 上的文件系统是短暂的。因此,如果您手动创建符号链接,它将在重新启动测功机或下次部署时被销毁。此外,如果您正在运行类似的命令,heroku php artisan storage:link
则该命令正在与您的网络测功机不同的上下文中执行。一旦该命令完成运行,该符号链接将被销毁。
例如,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
事实上,它从未存在于您的网络测功机上。
了解文件系统是短暂的也应该让您重新考虑使用存储文件夹进行用户上传。当您的测功机重新启动时,这些上传也将丢失。相反,将用户上传的内容存储在 Amazon S3 或其他形式的异地存储中。这将允许您随意扩展或破坏您的测功机,而不会冒用户数据的风险。Heroku 文档中有关此的更多信息。
推荐阅读
- python - XML etree 动态抓取 Python
- azure - 如何从 Azure Linux Web App 访问 VNET 内的 VM?
- postgresql - PostgreSQL 在解析 csv 文件时排除额外的逗号用作分隔符
- spring-data-jpa - 将一个实体上的规范映射到另一个实体上的查询
- intercom - 我们如何从 API 中检索对讲信使用户/联系人?
- php - 如何在 prestashop 1.6 中复制同一张表中的一行
- swift - 需要为 UIView Swift 创建自定义形状
- windows-8 - 在 Windows 8.0 SP1 上使用来自 CefSharp.Wpf 的 ChromiumWebBrowser 运行 WPF 应用程序时出错
- linux - linux中的多帧tiff拆分
- java - 停止监听用户输入