Laravel: 设置不带协议的资源文件路径

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 通常会正确检测协议,但当位于负载均衡器后面时,它无法正常工作。因此,我仍在寻找解决方案。


你找到解决方案了吗? - kramer65
你知道 asset 助手有第二个参数 $secure 吗?这意味着如果你知道协议需要是 https,那么 {{ asset('/assets/js/jquery-2.1.1.min.js', true) }} 应该会给你想要的结果。 - jszobody
8个回答

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


1

我曾经遇到同样的问题,后来发现asset()方法有一个可选的第二个变量,true或false用于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调用。

这与 // 不同。 - user1897253
是的,没错。然而,它将会允许通过 SSL 发送请求,因为 asset 方法被告知要提供它。 - Sledmore

1

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

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

更新:

如果您确实希望仅使用//显示资产,则可以编写自己的HTML宏


问题在于,如果一个网站在负载均衡器后面,它会显示应该是https链接的http链接。 - kramer65

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中测试过。其他版本也应该可以使用。


0

asset() 会使用当前请求的协议(HTTP 或 HTTPS)生成资源的 URL:

如果你想提供一个外部 URL,而你不知道它是 HTTP 还是 HTTPS(比如 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

我通常使用

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

不使用asset()函数

虽然有点不太好,但我在90%的网站上工作时,这是一个完美的解决方案。


0

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

有一个forceSchema()方法,可以轻松修改以实现您需要的功能,但老实说,这个功能可能应该在Laravel中,并且可能值得在他们的github上提交拉取请求。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接