如何通过https在Laravel 5中提供静态内容?

时间:2016-05-30 05:01:29

标签: php laravel https laravel-5.2

我花了很多时间试图解决这个问题但到目前为止还没有任何运气。由于混合内容错误,我的应用无法加载css(' https://example.com/'页面是通过HTTPS加载的,但请求的是不安全的样式表' {{3} }'。此请求已被阻止;内容必须通过HTTPS提供)。我知道我可以通过将true传递给资产函数来加载资产,但这意味着我必须转到所有资产调用并更改它们。是否有我可以配置的站点范围设置,以便它在生产中执行https,在本地执行http?

由于

3 个答案:

答案 0 :(得分:0)

您可以创建类似ForceHttps中间件的内容,而不是为其创建环境条件,如下所示:

public function handle($request, Closure $next)
{
    if (!\App::environment('local')) {
        \URL::forceSchema('https');
    }

    return $next($request);
}

如果需要,可以将其添加到某个路径组或全局。

注意:我建议您在网络服务器上解决此问题,而不是在Laravel中解决此问题

答案 1 :(得分:0)

只需使用asset()帮助程序即可生成资产的网址。它将使用当前协议。

不要强迫资产由https加载,除非它们是敏感的(几乎不是这种情况)。这将是一个开销,因为您通常比安全资产更关注安全的网站内容。换句话说,如果您接受加载http网站,您很可能接受http资产。相反,请考虑使用中间件在每个非安全请求上将http重定向到https。

这是我自己使用的中间件:

public function handle($request, Closure $next)
{
    if (!$request->secure()) {
        return redirect()->secure($request->getRequestUri());
    }

    return $next($request);
}

如果您想使用它,请记住在附加任何cookie之前将其解雇,即在Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse中间件之前。

答案 2 :(得分:0)

我创建了app/Helpers/SiteHelpers.php,其中包含一个覆盖默认asset()函数的函数。

<?php

/**
 * Overrides the default asset() method, which generates an asset path for the application.
 *
 * @param  string $path
 * @param  bool   $secure
 *
 * @return string
 */
function asset ($path, $secure = null) {
    if (Request::server('HTTP_X_FORWARDED_PROTO') == 'https' || Request::server('HTTPS') == 'on') {
        $secure = TRUE;
    }

    return app('url')->asset($path, $secure);
}

然后将其添加到bootstrap/autoload.php require __DIR__.'/../vendor/autoload.php';以上,以便它如下所示:

require __DIR__.'/../app/Helpers/SiteHelpers.php';
require __DIR__.'/../vendor/autoload.php';

这很灵活,具体取决于您是在http或https

上提供静态内容