laravel asset()方法不会返回https

时间:2016-11-21 14:18:46

标签: php laravel

我使用asset()公共方法在laravel中生成正确的网址。

在文档中说:

enter image description here

所以理论上它应该检测正确的方案本身。

但在代码中我看到:https://github.com/illuminate/routing/blob/master/UrlGenerator.php#L210

public function asset($path, $secure = null)
    {

安全的默认值为null。所以这种方法对http / https都没有好处。

我在这里错过了什么?

我使用反向代理,是不是因为那个?

5 个答案:

答案 0 :(得分:2)

不是secure_asset你在寻找什么?

https://laravel.com/docs/5.3/helpers#method-secure-asset

答案 1 :(得分:0)

正如您在GitHub中看到的那样,asset方法正在调用getScheme以确定该方案应该是什么。

https://github.com/illuminate/routing/blob/master/UrlGenerator.php#L276

因此,如果您未提供asset第二个参数$secure,那么它会使用请求方案。否则,无论请求中的方案是什么,您都可以提供$secure强制所需的方案。

如果查看代码,您会看到如果$secure为空并且未设置缓存,则缓存设置为请求方案(即$this->request->getScheme())并因此返回。

答案 2 :(得分:0)

在同一个文件中,您有getScheme()方法的定义,该方法使用$ secure参数。

如果$ secure参数是默认的null值,则该方案可以从当前方案中猜出,也可以从之前保存的方案中检索(如果没有强制使用forceSchema())

您可以告诉$ secure参数以这种方式工作:

  • true将强制https
  • false将强制使用http
  • null将使用最佳方案,从当前方案中猜出

这里是getScheme()方法的代码:

protected function getScheme($secure)
{
    if (is_null($secure)) {
        if (is_null($this->cachedSchema)) {
            $this->cachedSchema = $this->forceSchema ?: $this->request->getScheme().'://';
        }
        return $this->cachedSchema;
    }
    return $secure ? 'https://' : 'http://';
}

答案 3 :(得分:0)

如果有人像我为了允许asset函数获得正确的架构而陷入同一问题,则必须启用TrustedProxies。 在laravel中,\App\Http\Middleware\TrustedProxies中有一个为您执行此操作的中间件,但是您必须将其包括在默认的中间件中,才能生效。

Laravel使用fideloper/TrustedProxy程序包,该程序包在trustedProxies对象中设置Request数组,选中该对象是为了批准标题中提供的X-Forwarded-Proto

您可以检查以下链接以获取更多详细信息

Explains in Laravel Trusted Proxy in details

For Setting it up

答案 4 :(得分:0)

是的,这是因为反向代理会做 SSL 终止,这意味着浏览器请求 https,但从代理到应用程序的请求是 http。这有很多好处(提高性能),但也有副作用。

我认为该解决方案将作为一个环境变量,告诉您强制使用 https(在登台或生产中使用网络时)或在例如时保留为 http。本地开发。

我认为是最有效的。我这么说是因为你的应用永远不知道何时使用 https。