使用asset
辅助函数,如下所示:
<script src="{{ asset('/assets/js/jquery-2.1.1.min.js') }}"></script>
会得到的
<script src="http://xxx.xxx.com/assets/js/jquery-2.1.1.min.js"></script>
是否有任何laravel内置解决方案可以让它成为现实
<script src="//xxx.xxx.com/assets/js/jquery-2.1.1.min.js"></script>
并正确显示http
和https
协议?
[编辑]
我知道Laravel通常会正确地检测到协议,但是在负载均衡器后面却没有。所以我仍然在寻找解决方案。
仅当请求被视为安全时,Laravel才会创建安全链接。
如果非httpS流量来自“可信代理”,那么Laravel已经有办法将非httpS流量视为“安全”。
您可以在应用程序服务提供程序中声明此类可信代理,如下所示:
Request::setTrustedProxies(array( '199.27.128.0/21', 'some other range'));
另外,请确保您的负载均衡器正确设置以下标头:
Host, X-Forwarded-Host, X-Forwarded-Port, X-Real-IP, X-Forwarded-For and X-Forwarded-Proto
像Cloudflare这样的“公共”代理已经做到了这一点。
基本上,这里的一点是客户端连接在其中一个前端服务器(作为代理)终止,因此我们必须将来自该服务器的通信声明为受信任,以便laravel使用来自代理服务器的头而不是readed localy的值。
这样做可以启用Request :: isSecure()或Request :: ip()等函数来返回一致的结果。
Laravel会自动将资产的URL更改为用于加载站点的协议。
如果您的站点是通过安全连接加载的,则资产链接将自动使用https。
更新:
如果你想显示只有//
的资产,你可以编写自己的HTML macro。
生成资产URL的代码位于illuminate / Routing / UrlGenerator.php中
有一个forceSchema()方法可以很容易地修改,以满足你的需要,但说实话,这个功能可能应该在Laravel中,并且可能值得在他们的github上提交一个pull请求。
你应该查看这篇文章http://ankitpokhrel.com/explore/overriding-base-url-in-laravel-5/。基本上你可以覆盖你的url()
中的AppServiceProvider
函数来生成像/assets/something.js
而不是http://example.com/assets/something.js
的网址
asset()使用当前的请求方案(HTTP或HTTPS)为资产生成URL:
如果您想提供一个您不了解http或https的外部URL,如cdn URL,您可以写如下
<script src="{!! asset('//code.jquery.com/jquery-2.1.1.min.js') !!}"></script>
不过你可以这样写
<script src="//{!! Request::server ('HTTP_HOST').'/assets/js/jquery-2.1.1.min.js' !!}"></script>
要么
<script src="{!! asset('//'.Request::server ('HTTP_HOST').'/assets/js/jquery-2.1.1.min.js') !!}"></script>
我有同样的问题,然后我发现asset()方法有一个可选的第二个变量,对于SSL请求是true或false。
我使用的解决方案如下:
<link rel="stylesheet" href="{{ asset('assets/bootstrap/3.3.7/css/bootstrap.min.css', !App::isLocal()) }}" />
<script type="text/javascript" src="{{ asset('assets/parsley/2.4.4/parsley.min.js', !App::isLocal()) }}"></script>
注意:
!App::islocal()
如果我的应用程序环境是本地的,则不会选择SSL,但是在生产环境中,将通过SSL调用资产。
我通常使用
<script src="/assets/js/jquery-2.1.1.min.js"></script>
不调用asset()函数
我知道,但在我工作的90%的网站中,这是一个完美的解决方案
这可能对某人有帮助。
辅助功能方式:
function schemalessAsset($path)
{
if (url()->isValidUrl($path)) {
return str_replace(['http:','https:'], '', $path);
}
return url()->assetFrom(url()->formatRoot('//'), $path);
}
宏观方式:
URL::macro('schemalessAsset', function ($path) {
if (URL::isValidUrl($path)) {
return str_replace(['http:','https:'], '', $path);
}
return URL::assetFrom(URL::formatRoot('//'), $path);
});
在Laravel 5.6中测试过。它也应该适用于其他版本。