为什么这个 cookie 没有跨请求保留?

Why is this cookie not preserved across requests?

我想在用户登录 Symfony 后添加一个带有值的 cookie,该 cookie 在当前会话的所有请求期间保存,并检查该 cookie 是否存在于 nginx 中,如果存在,将显示该文件.

cookie 已创建并发送,但它仅对一个请求有效,不会随所有新请求一起发送。我以这种方式添加新的 cookie:

$response = new Response();
$time = time() + (3600 * 24 * 7);
$response->headers->setCookie(new Cookie("nametest", "test", $time, "/"));
$response->sendHeaders();

编辑:将路径添加为“/”在所有请求中发送 cookie。现在最后一步是验证 nginx 中的 cookie。我正在使用以下 nginx 配置:

location /assets/users/images/ {
    if ($cookie_nametest !~* "test") {
       return 301 https://example_domain.com/login;
    }
}

造成这种情况的一个可能原因是您没有指定 cookie 路径。例如,如果此 cookie 设置在登录页面 https://example.com/login 上,它将从用户浏览器发送到服务器以获取以 /login 开头的 URI,而不是其他任何 URI。 Here is an example of this behavior (initially the needed cookie was set with /referral path and was invisible from the root URI, read both answer and comments). Following this 示例看起来你应该使用类似

的东西
$response->headers->setCookie(new Cookie("name_test", "test", $time, "/"));

但是这种方法的缺点是您的“秘密”cookie 名称和值在 nginx 配置中 hard-coded。由于您最初的问题标题是 如何阻止未通过身份验证的用户直接访问文件? 我可以建议您使用 X-Accel-Redirect 响应 header 的完全不同的解决方案。这个想法是你可以检查用户是否在后端登录,然后用正确的受保护文件路径响应。 Here is the official documentation and here 就是一个例子。请注意受保护的 location 块中的 internal 关键字。