在图像标签中显示S3图像?

时间:2017-08-17 08:48:50

标签: laravel laravel-5 amazon-s3

我已将图像上传到S3,现在是html我想简单地检索它们,所以我做了:

<a href="{{ url('/') }}">
    <img class="navbar-brand" src="https://s3.eu-west-2.amazonaws.com/production/public/images/logo-small.png">
</a>

然而,图像没有显示,如果我把链接放在浏览器中,我得到:

  

公共/图像/标志-small.png

而不是实际的图像。

我在这里做错了什么?

我遇到的另一个问题是我所有的css和js都有

{{ asset('path/to/file') }}在本地工作正常,但在我的网络服务器上没有,因为它为我提供http://domain,而我的服务器有https://

现在,如果我将资产更改为secure_asset,那么它可以在本地运行,但不会因为我的本地构建显然不安全。

我如何解决这两个问题?

2 个答案:

答案 0 :(得分:0)

首先,首先,public目录不需要调用,因为它是服务器的默认根目录,所以你的网址看起来像这样:

  

/images/logo-small.png

asset()帮助函数,如文档中所述:

  

使用当前的请求方案为资产生成URL   (HTTP或HTTPS)

因此,您可能需要更改请求方案,同时检查.env文件,APP_URL字段是使用https设置的。

最后我建议你将s3设置为存储磁盘,这样就可以调用这样的帮助:

use Illuminate\Support\Facades\Storage;

$url = Storage::url('file.jpg');

作为附加信息,过去我的文件不公开时我遇到了s3的问题,所以我无法通过url访问它们,如果设置为public,请检查s3面板中的文件配置也可以在同一个面板上查看其网址。

希望这会对你有所帮助。

答案 1 :(得分:0)

使用HTTP和HTTPS重定向第二个问题的答案。

使用env('APP_ENV')检查您的工作环境并相应地设置条件。要实现此目的,只需创建一个中间件,并根据环境重定向URL HTTPS or HTTP

如果您使用的是Laravel 5+

以下是中间件示例:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Routing\Middleware;

/**
 * Secure
 * Redirects any non-secure requests to their secure counterparts.
 *
 * @param request The request object.
 * @param $next The next closure.
 * @return redirects to the secure counterpart of the requested uri.
*/
class Secure implements Middleware
{

    public function handle($request, Closure $next)
    {
        $secureEnvs = ['dev', 'qa', 'stage', 'prod'];
        $isSecureEnv = in_array(env('APP_ENV'), $secureEnvs);
        $requestNotSecure = $request->header('x-forwarded-proto') !== 'https';

        // If environment is secure and request is not redirect
        if ($isSecureEnv && $requestNotSecure) {
            return redirect()->secure($request->getRequestUri());
        }

        return $next($request);
    }

}

$routeMiddleware数组中添加此中间件的条目。