Apache2.49 cookie无法通过我的ProxyPass VirtualHost使用

时间:2018-07-02 10:21:14

标签: setcookie apache2.4 proxypass

在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/$1 [P,L]
            ProxyPassReverseCookiePath "/" "/"

后端服务器是NodeJS。代理本身可以正常工作。问题在于节点正在HTTP标头(会话ID)中发送set-cookie,但浏览器似乎忽略了它。我使用Chromium和Firefox进行了测试,但没有一个创建cookie。我试图更改虚拟主机配置,但没有任何解决方案可以解决问题set-cookie命令为:

set-cookie: sid=s%3AhgHWDO3D...BBUZbbOA; Path=/; HttpOnly; Secure;HttpOnly;Secure

我需要您的帮助来解决此问题。谢谢。

更新 如果该网址包含对Node的直接请求:

https://example.com/s/backend

有效。它创建的会话是cookie。但是,如果从JS中的AJAX请求中调用此URL,则不会创建cookie。 https://example.com加载HTML并加载JS文件的脚本。该JS文件使用路径https://example.com/s/something对后端进行AJAX调用,在这种情况下,永远不会创建cookie。 有什么建议吗?

更新 我发现问题出在我使用Fetch API检索JSON文件时。运行此代码不会创建会话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。 有什么想法为什么无法进行提取?

1 个答案:

答案 0 :(得分:0)

问题解决了。使用Fetch API不像XMLHttpRequest中那样包含cookie交换。因此,它不会创建会话ID cookie。要启用此功能,Fetch调用必须具有以下选项: 凭据:“同源”。

fetch("https://localbestbatteriesonline.com/s/p.json?0103",{credentials:"same-origin"})
  .then(function(response) {
    return response.json();
  })
  .then(function(myJson) {
    console.log(myJson);
  });

现在可以了。