当用户不是';t已登录(Laravel 5)
即使用户未登录,Laravel也会设置cookie。这将强制Varnish将每个请求发送到后端。我遇到过一些人()使用package,如果用户没有经过身份验证,它会设置一个当用户不是';t已登录(Laravel 5),laravel,varnish,Laravel,Varnish,即使用户未登录,Laravel也会设置cookie。这将强制Varnish将每个请求发送到后端。我遇到过一些人()使用package,如果用户没有经过身份验证,它会设置一个X-No-Session头。这是一个Laravel4包,因此我创建了一个中间件,如果用户未经授权,它将设置头 我不知道如何让Varnish仅在未设置头的情况下向后端发送请求。我非常感谢任何指导 编辑: 如果用户未登录,此中间件将设置X-No-Session头: <?php namespace App\Http\Midd
X-No-Session
头。这是一个Laravel4包,因此我创建了一个中间件,如果用户未经授权,它将设置头
我不知道如何让Varnish仅在未设置头的情况下向后端发送请求。我非常感谢任何指导
编辑:
如果用户未登录,此中间件将设置X-No-Session
头:
<?php
namespace App\Http\Middleware;
use Closure;
use Session;
class StripSessionsIfNotAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if(auth()->check()) {
return $next($request);
}
return $next($request)->header('X-No-Session', 'yeah');
}
}
试着替换
if (req.http. ~ "laravel_session") {
return (pass);
}
在您的子vcl_recv
功能中,使用
if (req.http.X-No-Session ~ "yeah") {
unset req.http.cookie;
}
因此,如果您确实有X-No-Session
头,那么您将转储cookie。这反过来将不会传递到基于cookies的后端。此时,您正在说如果有cookie,请传递到后端。正如你已经知道的,总会有一块饼干
如果它也有任何帮助 您的想法很好,但主要问题是您必须从后端响应测试
X-No-Session
头,而不是客户端请求。
我已成功地将其重写为以下内容:
sub vcl_backend_response {
set beresp.ttl = 1d;
if (beresp.http.X-No-Session ~ "yeah" && bereq.method != "POST") {
unset beresp.http.set-cookie;
}
if (bereq.method == "GET" && bereq.url ~ "\.(png|gif|jpg|css|js|ico|woff|woff2|svg)$") {
unset beresp.http.set-cookie;
set beresp.ttl = 5d;
}
return (deliver);
}
通过这种方式,来自后端的响应被缓存并从不需要的会话cookie中清除
编辑:顺便说一下,使用
$response->headers->set('X-No-Session', 'yeah');
在Laravel中,中间件也可用于重定向响应。因此,您可以执行类似于会话怪物的操作。也就是说,设置一个标题,不管其值是否不同,这取决于它们是否经过身份验证。也许发布你的中间件。嘿@DavidT我已经用我的中间件更新了帖子,并尝试替换它。我已经更新了OP中的代码。它现在似乎没有缓存任何东西!如果用gist中的我的VCL文件替换你的VCL文件会发生什么?
$response->headers->set('X-No-Session', 'yeah');