Laravel:无协议设置资产

问题描述 投票:8回答:8

使用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通常会正确地检测到协议,但是在负载均衡器后面却没有。所以我仍然在寻找解决方案。

php laravel laravel-helper
8个回答
5
投票

仅当请求被视为安全时,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()等函数来返回一致的结果。


1
投票

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

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

更新:

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


0
投票

生成资产URL的代码位于illuminate / Routing / UrlGenerator.php中

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


0
投票

你应该查看这篇文章http://ankitpokhrel.com/explore/overriding-base-url-in-laravel-5/。基本上你可以覆盖你的url()中的AppServiceProvider函数来生成像/assets/something.js而不是http://example.com/assets/something.js的网址


0
投票

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>

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


0
投票

我通常使用

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

不调用asset()函数

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


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中测试过。它也应该适用于其他版本。

© www.soinside.com 2019 - 2024. All rights reserved.