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 通常会正确检测协议,但在负载均衡器后面时,它不会。所以我仍在寻找解决方案。

4

8 回答 8

5

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

如果非 httpS 流量来自“受信任的代理”,Laravel 已经有一种方法可以将其视为“安全的”。

您可以像这样在应用程序服务提供商中声明此类受信任的代理:

 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() 等函数返回一致的结果。

于 2016-10-07T09:33:27.767 回答
1

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

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

更新:

如果您确实想只显示资产//,您可以编写自己的HTML 宏

于 2014-12-19T09:38:39.073 回答
1

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

于 2016-10-11T15:20:13.237 回答
0

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

有一个 forceSchema() 方法可以很容易地修改为你需要的,但老实说这个功能可能应该在 Laravel 中,它可能值得在他们的 github 上提交一个拉取请求。

于 2014-12-19T09:40:45.297 回答
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 中测试。它也应该在其他版本中工作。

于 2018-09-06T07:16:15.160 回答
0

我通常使用

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

不调用asset() 函数

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

于 2016-10-12T11:15:47.947 回答
0

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

于 2016-10-07T14:41:09.340 回答
0

assets() 使用请求的当前方案(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>
于 2016-10-11T06:35:02.323 回答