Express 仅设置set cookie标头中的第一个cookie(在Firebase主机重写到功能后)

Express 仅设置set cookie标头中的第一个cookie(在Firebase主机重写到功能后),express,cookies,http-headers,google-cloud-functions,firebase-hosting,Express,Cookies,Http Headers,Google Cloud Functions,Firebase Hosting,我正在尝试从express node后端以单个响应发送多个cookie。Set cookie标头设置的值似乎有效,但除了第一个cookie之外,没有任何cookie被存储。这可能是什么原因造成的?是否有可能是其他一些标头以某种方式进行了干扰 app.post(“/api/test”),函数(req,res){ 库奇案(“年龄”、“44岁”); res.cookie(“名称”、“确定”); 库奇(“某物”、“其他”); res.send(“cookies set”); }); 结果在标题中 Ac

我正在尝试从express node后端以单个响应发送多个cookie。Set cookie标头设置的值似乎有效,但除了第一个cookie之外,没有任何cookie被存储。这可能是什么原因造成的?是否有可能是其他一些标头以某种方式进行了干扰

app.post(“/api/test”),函数(req,res){
库奇案(“年龄”、“44岁”);
res.cookie(“名称”、“确定”);
库奇(“某物”、“其他”);
res.send(“cookies set”);
});
结果在标题中

Access-Control-Allow-Credentials: true
Cache-Control: private
Content-Type: text/html; charset=utf-8
Etag: W/"b-AindM8n+eJQTR6jb7Hg8S4fG8qI"
Expires: Sat, 05 Oct 2019 16:18:12 GMT
Function-Execution-Id: r7d6qjgl5noi
Server: Google Frontend
X-Cloud-Trace-Context: 051139bdc4cc753cad51c0dd3e89e0b8;o=1
X-Powered-By: Express
Content-Length: 11
Accept-Ranges: bytes
Date: Sat, 05 Oct 2019 16:18:12 GMT
Connection: keep-alive
Set-Cookie: age=44; path=/,name=ok; path=/,something=else; path=/
X-Served-By: cache-ams21036-AMS
X-Cache: MISS
X-Cache-Hits: 0
X-Timer: S1570292292.302186,VS0,VE410
Vary: Origin,cookie,need-authorization, x-fh-requested-host, accept-encoding
我希望它在浏览器中存储3个cookie,但总是只保存第一个cookie

编辑:


在进一步调查后,set cookie头被写为逗号分隔的一行的原因最终被Firebase托管为函数重写

{
   "source": "/{,/**}",
   "function": "testingexpress"
}

某些版本的express可能在生成无效或至少经常不兼容的cookie标头()时出现问题,其中多个cookie出现在单个集cookie标头中。更标准的方法是在响应中提供多个Set Cookie头

值得注意的是,从上述RFC中也可以看出:

源服务器不应将多个集合Cookie标头字段折叠到 单个标题字段。折叠HTTP头的常用机制 字段(即[RFC2616]中定义的字段)可能会更改 设置Cookie标头字段,因为使用了%x2C(“,”)字符 以与这种折叠冲突的方式设置Cookie

本文件说明了一种可能的解决方法,约于2014年发布:

我无法用Express4.17.1(类似的代码生成了多个集Cookie头)复制这一点。看起来行为可能在4.13.0前后发生了更改:


我会考虑更新您的Express版本,或者使用上述链接文章中的解决方法。

某些版本的Express可能会在生成无效或至少经常不兼容的cookie标头()时出现问题,其中多个cookie出现在一组cookie标头中。更标准的方法是在响应中提供多个Set Cookie头

值得注意的是,从上述RFC中也可以看出:

源服务器不应将多个集合Cookie标头字段折叠到 单个标题字段。折叠HTTP头的常用机制 字段(即[RFC2616]中定义的字段)可能会更改 设置Cookie标头字段,因为使用了%x2C(“,”)字符 以与这种折叠冲突的方式设置Cookie

本文件说明了一种可能的解决方法,约于2014年发布:

我无法用Express4.17.1(类似的代码生成了多个集Cookie头)复制这一点。看起来行为可能在4.13.0前后发生了更改:


我会考虑更新您的Express版本,或者使用上面链接文章中的解决方法。

进一步调查后,set cookie头被写为逗号分隔的原因,最后一行是Firebase托管函数重写。报告为错误。

进一步调查后,set cookie头被写为逗号分隔的一行代码的原因最终被Firebase托管为函数重写。报告为错误。

我正在运行相同的节点版本,并尝试了解决方法,但仍然没有成功。所以我想原因一定是在其他地方,并意识到我一直在Firebase函数上运行express。我在本地测试了它,它工作得非常完美。我猜Firebase的部署版本会将标题和格式改写为过时的逗号分隔格式。@llusi有趣。使用已部署或本地服务的firebase函数来测试这一点,我看不到重写。如果您确实看到了差异,那么这可能值得联系支持人员。不过,您提供的代码似乎不是firebase函数。(它使用的“app.post”通常不会出现在firebase函数中)。进一步测试后,原因是firebase函数从托管重写重定向,例如
{“source”:“/app/**”,“function”:“testingexpress”}
没有托管重写的函数运行良好似乎值得@llusi因为你自己找到了答案,如果你发布答案并接受它就好了,这样可以关闭此线程。我正在运行相同的节点版本,并且尝试了解决方法,但仍然没有成功。所以我想原因一定是在其他地方,并意识到我一直在Firebase函数上运行express。我在本地测试了它,它工作得非常完美。我猜Firebase的部署版本会将标题和格式改写为过时的逗号分隔格式。@llusi有趣。使用已部署或本地服务的firebase函数来测试这一点,我看不到重写。如果您确实看到了差异,那么这可能值得联系支持人员。不过,您提供的代码似乎不是firebase函数。(它使用的“app.post”通常不会出现在firebase函数中)。进一步测试后,原因是firebase函数从托管重写重定向,例如
{“source”:“/app/**”,“function”:“testingexpress”}
没有托管重写的函数运行良好似乎值得@llusi因为你自己找到了答案,如果你发布答案并接受它就好了,这样可以关闭此线程。是否有进一步的详细信息?有什么办法可以解决这个问题吗?非常感谢。我现在已经修复了这个错误。您应该能够按预期发送多个集Cookie头。你介意更新答案以反映这一点吗?@Michael