为什么Apache服务器对我的NodeJS和Python请求的响应不同?
几个月来,我一直在用Python库为一个网站开发RESTAPI,没有任何问题。这是一个我无法控制的私人网络。它还需要客户端证书身份验证,因此调用类似于:为什么Apache服务器对我的NodeJS和Python请求的响应不同?,python,node.js,apache,python-requests,Python,Node.js,Apache,Python Requests,几个月来,我一直在用Python库为一个网站开发RESTAPI,没有任何问题。这是一个我无法控制的私人网络。它还需要客户端证书身份验证,因此调用类似于: r = requests.get('https://example.com/some/endpoint?param=something', cert=(key_path, cert_path), verify=ca_path) 在检查请求后,我能够看到服务器最初使用302重定向代码回复到服务器上的另一个URI,以便设置身份验证cookie,然
r = requests.get('https://example.com/some/endpoint?param=something', cert=(key_path, cert_path), verify=ca_path)
在检查请求后,我能够看到服务器最初使用302
重定向代码回复到服务器上的另一个URI,以便设置身份验证cookie,然后重定向回我请求的资源,然后成功完成。哈库纳·马塔塔
我们已经安装了一个新的NodeJS服务器组件,并试图将其连接到同一个端点。我尝试了几个不同的库,它们都得到了相同的结果。下面是我尝试使用流行库的一个示例:
奇怪的是,服务器用一个200
代码和一个HTML页面做出响应,该页面基本上是这样写的(当然我要解释一下):
“你好像丢失了会话信息,伙计。可能是你的浏览器在插件安装后重新启动了。”
它具有指向站点登录页面的嵌入式链接。不幸的是,我无法复制和粘贴输出,因为所有内容都在封闭的专用网络上
我一辈子都搞不明白为什么这个服务器(响应头表明它是Apache服务器)对节点的HTTP请求的响应与Python的不同。我甚至将请求
和get
调用上的HTTP请求头更改为完全相同,但没有任何效果。它始终适用于Python,而从不适用于Node
这对我来说毫无意义。是否有熟悉Python的请求
库和节点的HTTP
模块的人能够识别出可能导致此问题的连接服务器方式的细微差异?显然,服务器似乎能够区分这两个请求,即使头是相同的。任何熟悉Apache的人都有什么想法或东西可以帮助解决这个问题
如果相关的话,我们使用的是Python v3.6和节点v8.x(不记得具体是哪个次要版本…不幸的是,我目前无法访问该机器,稍后将更新)
有什么建议吗?我还可以尝试哪些其他方法让请求在Node中像在Python中一样成功完成?您确定Node能够成功读取cert文件吗?尝试在控制台中转储内容。正如您所描述的,Apache服务器没有收到证书。@Nick这是一个很好的建议。是,节点能够成功读取证书。当我将
opts
对象打印到控制台时,我可以看到控制台中的缓冲区。也就是说,我没有尝试在没有证书的情况下发出请求,以查看响应是否不同。有机会我会试试的。
let opts = {
key: fs.readFileSync(keyPath),
cert: fs.readFileSync(certPath),
ca: [fs.readFileSync(caPath)],
cookieJar: new CookieJar()
}
// Using Promise API here because I'm running on an older version of NodeJS which
// unfortunately doesn't have async/await :(
got('https://example.com/some/endpoint?param=something', opts).then((res) => {
// ...
});