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