Laravel:无协议设置资产

时间:2014-12-19 09:32:17

标签: php laravel laravel-helper

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

并使用httphttps协议正确显示?

[编辑]

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

8 个答案:

答案 0 :(得分:5)

只有在请求被视为安全的情况下,Laravel才会创建安全链接。

Laravel已经有办法将非httpS流量视为&#34;安全&#34;如果它来自&#34;受信任代理&#34;。

您可以在应用程序服务提供程序中声明此类可信代理:

 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

&#34;公共&#34;像cloudflare这样的代理已经做到了这一点。

基本上,这里的一点是客户端连接在其中一个前端服务器(作为代理)终止,因此我们必须将来自该服务器的通信声明为受信任,以便laravel使用来自代理服务器的头而不是值当地人。

执行此操作可启用Request :: isSecure()或Request :: ip()等函数以返回一致的结果。

答案 1 :(得分:1)

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

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

<强>更新

如果您确实希望仅显示//的资源,则可以编写自己的HTML macro

答案 2 :(得分:0)

生成资产URL的代码在illuminate / Routing / UrlGenerator.php

有一个forceSchema()方法可以很容易地修改,以满足你的需要,但说实话,这个功能可能应该在Laravel中,并且可能值得在他们的github上提交一个pull请求。

答案 3 :(得分:0)

您应该查看这篇文章http://ankitpokhrel.com/explore/overriding-base-url-in-laravel-5/。您基本上可以覆盖 @Override public void onBindViewHolder(FeedsViewHolder feedViewHolder, int i) { if(d1.feeds.get(i).isMachineOrHuman()) { feedViewHolder.chat.setBackgroundResource(R.drawable.user); **feedViewHolder.chat.setGravity(Gravity.RIGHT);** // *Sent Message* feedViewHolder.chat.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END); } else { feedViewHolder.chat.setBackgroundResource(R.drawable.ais); **feedViewHolder.chat.setGravity(Gravity.LEFT);** // *Receive Message* feedViewHolder.chat.setText(d1.feeds.get(i).getMessage()); } 中的url()功能,以生成AppServiceProvider而不是/assets/something.js等网址

答案 4 :(得分:0)

asset()使用当前的请求方案(HTTP或HTTPS)生成资产的URL:

如果您想提供一个您不了解http或https的外部网址,例如cdn网址,您可以写如下

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

OR

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

答案 5 :(得分:0)

我有同样的问题,然后我发现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调用。

答案 6 :(得分:0)

我通常使用

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

不调用asset()函数

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

答案 7 :(得分:0)

这可能会帮助某人。

助手功能方式:

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中测试。它也应该在其他版本中工作。