Apache2.49 cookie 无法通过我的 ProxyPass VirtualHost 工作
Apache2.49 cookies not working via my ProxyPass VirtualHost
在 apache virtualHost 中我有这些命令:
ProxyPass "/s" "http://127.0.0.1:3001"
ProxyPassReverse "/s" "http://127.0.0.1:3001"
RewriteRule ^/s/(.*) http://127.0.0.1:3001/ [P,L]
ProxyPassReverseCookiePath "/" "/"
后端服务器是NodeJS。代理本身工作正常。问题是节点在 HTTP header(session ID)中发送了一个 set-cookie,但浏览器似乎忽略了它。我使用 Chromium 和 Firefox 进行了测试,但 none 创建了 cookie。我尝试更改虚拟主机配置,但似乎无法解决问题 set-cookie 命令是:
set-cookie: sid=s%3AhgHWDO3D...BBUZbbOA; Path=/; HttpOnly; Secure;HttpOnly;Secure
我需要你的帮助来解决这个问题。谢谢。
更新
如果 url 包含对节点的直接请求:
https://example.com/s/backend
有效。它创建 session is cookie。但是如果这个 URL 是从 JS 中的 AJAX 请求调用的,它不会创建 cookie。
https://example.com
使用脚本加载 JS 文件加载 HTML。该 JS 文件使用路径 https://example.com/s/something 对后端进行 AJAX 调用,在这种情况下,永远不会创建 cookie。
有什么建议吗?
更新
我发现问题出在我使用 Fetch API 检索 JSON 文件时。此代码 运行 不会创建 session ID cookie:
fetch("https://localbestbatteriesonline.com/s/p.json?0103")
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
但是如果我有这段代码,它会创建 cookie:
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
xhttp.open("GET", "https://localbestbatteriesonline.com/s/p.json?0103", true);
xhttp.send();
分析请求,两者完全相同。两者都收到要创建的 cookie。
有什么想法为什么 fetch 不起作用吗?
问题已解决。使用 Fetch API 不像在 XMLHttpRequest 中那样包含 cookie 交换。因此,它不会创建会话 ID cookie。要启用此功能,Fetch 调用必须具有以下选项:
凭据:"same-origin".
fetch("https://localbestbatteriesonline.com/s/p.json?0103",{credentials:"same-origin"})
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
现在可以了。
在 apache virtualHost 中我有这些命令:
ProxyPass "/s" "http://127.0.0.1:3001"
ProxyPassReverse "/s" "http://127.0.0.1:3001"
RewriteRule ^/s/(.*) http://127.0.0.1:3001/ [P,L]
ProxyPassReverseCookiePath "/" "/"
后端服务器是NodeJS。代理本身工作正常。问题是节点在 HTTP header(session ID)中发送了一个 set-cookie,但浏览器似乎忽略了它。我使用 Chromium 和 Firefox 进行了测试,但 none 创建了 cookie。我尝试更改虚拟主机配置,但似乎无法解决问题 set-cookie 命令是:
set-cookie: sid=s%3AhgHWDO3D...BBUZbbOA; Path=/; HttpOnly; Secure;HttpOnly;Secure
我需要你的帮助来解决这个问题。谢谢。
更新 如果 url 包含对节点的直接请求:
https://example.com/s/backend
有效。它创建 session is cookie。但是如果这个 URL 是从 JS 中的 AJAX 请求调用的,它不会创建 cookie。
https://example.com
使用脚本加载 JS 文件加载 HTML。该 JS 文件使用路径 https://example.com/s/something 对后端进行 AJAX 调用,在这种情况下,永远不会创建 cookie。
有什么建议吗?
更新 我发现问题出在我使用 Fetch API 检索 JSON 文件时。此代码 运行 不会创建 session ID cookie:
fetch("https://localbestbatteriesonline.com/s/p.json?0103")
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
但是如果我有这段代码,它会创建 cookie:
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
console.log(this.responseText);
}
};
xhttp.open("GET", "https://localbestbatteriesonline.com/s/p.json?0103", true);
xhttp.send();
分析请求,两者完全相同。两者都收到要创建的 cookie。 有什么想法为什么 fetch 不起作用吗?
问题已解决。使用 Fetch API 不像在 XMLHttpRequest 中那样包含 cookie 交换。因此,它不会创建会话 ID cookie。要启用此功能,Fetch 调用必须具有以下选项: 凭据:"same-origin".
fetch("https://localbestbatteriesonline.com/s/p.json?0103",{credentials:"same-origin"})
.then(function(response) {
return response.json();
})
.then(function(myJson) {
console.log(myJson);
});
现在可以了。