繁体   English   中英

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

[英]How to serve static content in Laravel 5 over https?

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

谢谢

您可以创建类似 ForceHttps 中间件的东西,然后为其中的环境创建条件,如下所示:

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

    return $next($request);
}

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

注意:我建议在你的网络服务器上解决这个问题,而不是在 Laravel

只需使用asset()助手来生成资产的 URL。 它将使用当前协议。

不要强制通过 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中间件之前。

我创建了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 上提供静态内容

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM