我使用asset()
公共方法在laravel中生成正确的网址。
在文档中说:
所以理论上它应该检测正确的方案本身。
但在代码中我看到:https://github.com/illuminate/routing/blob/master/UrlGenerator.php#L210
public function asset($path, $secure = null)
{
安全的默认值为null。所以这种方法对http / https都没有好处。
我在这里错过了什么?
我使用反向代理,是不是因为那个?
答案 0 :(得分:2)
不是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
。
您可以检查以下链接以获取更多详细信息
答案 4 :(得分:0)
是的,这是因为反向代理会做 SSL 终止,这意味着浏览器请求 https,但从代理到应用程序的请求是 http。这有很多好处(提高性能),但也有副作用。
我认为该解决方案将作为一个环境变量,告诉您强制使用 https(在登台或生产中使用网络时)或在例如时保留为 http。本地开发。
我认为是最有效的。我这么说是因为你的应用永远不知道何时使用 https。