2014-12-19 49 views
8

使用asset辅助函数,象下面这样:Laravel:无协议设定资产

<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> 

并正确显示httphttps协议?

[编辑]

我知道Laravel通常正确地检测该协议,但是当后面的负载均衡器,它没有。所以我仍然在寻找解决方案。

+0

你找到对此的解决方案? – kramer65 2016-10-07 09:10:32

+0

你知道'asset' helper有第二个参数'$ secure'?这意味着如果您知道协议需要为https,那么'{{asset('/ assets/js/jquery-2.1.1.min.js',true)}}'应该给你想要的。 – jszobody 2016-10-07 14:49:33

回答

1

Laravel会自动将资产的网址更改为用于加载网站的协议。

如果您的站点通过安全连接加载,资产链接将自动使用https。

更新:

如果你想只用//显示资产,你可以写你自己的HTML macro

+0

问题是,如果站点位于负载均衡器后面,则会显示http链接,它应该是https链接。 – kramer65 2016-10-07 09:10:19

0

生成资产的URL的代码是照射/路由/ UrlGenerator.php

有可能很容易地修改你需要什么,但说实话这个功能也许应该是forceSchema()方法在Laravel,它可能值得在他们的github上提交pull请求。

5

仅当请求被认为是安全的时,Laravel才会创建安全链接。

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使用来自代理服务器的头代替价值观地区。

这样做可以使Request :: isSecure()或Request :: ip()等函数返回一致的结果。

0

资产的网址()使用请求(HTTP或HTTPS)的现行计划生成资产的URL:

如果你希望为您提供不知道HTTP或HTTPS像CDN URL用于外部URL,你可以写像下面

<script src="{!! asset('//code.jquery.com/jquery-2.1.1.min.js') !!}"></script> 

但是你可以像

OR

<script src="{!! asset('//'.Request::server ('HTTP_HOST').'/assets/js/jquery-2.1.1.min.js') !!}"></script> 
0

我有同样的问题,后来我发现,资产()方法有一个可选的第二个变量,真或假的SSL请求。

的解决方案,我用的是以下几点:

<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调用。

+0

这与'//' – Neat 2016-10-13 14:14:00

+0

不一样,是的。但是,它将适当地允许通过SSL发出请求,因为资产方法被告知提供它。 – Sledmore 2016-10-13 14:24:19

0

我通常使用

<script src="/assets/js/jquery-2.1.1.min.js"></script> 

不调用资产()函数

脏我知道,但在我工作的站点90%,这是一个完美的解决方案