docker - Heroku和Google Cloud Run上的HTTP请求不同

标签 docker http https google-cloud-platform google-cloud-run

我有一个NodeJS / ExpressJS API,该API执行HTTP请求以在发送响应之前获取一些JSON。这是代码片段:

const ipApiUrl = `https://ipapi.co/${ip}/json/`
const ipApiResponse = await axios.get(ipApiUrl)
console.log(ipApiResponse.data)
ipCountryCode = ipApiResponse.data.country_code

此代码在本地可以正常工作。在Heroku上也可以正常工作。但是,它的不能在Google Cloud Run上起作用。

这是ipApiResponse.data应该是的:
{
    "ip": "141.117.117.76",
    "city": "Toronto",
    "region": "Ontario",
    "region_code": "ON",
    "country": "CA",
    "country_code": "CA",
    ...
}

但是,从Google Cloud发送请求时,运行我正在使用的API会返回不同的结果。相反,我得到此响应:
{ ip: '169.254.8.129', reserved: true }

我认为这个问题与Google Cloud Run或Docker有关,因为我在向其他网站(例如ipstack.com)发出HTTP请求时也遇到了问题。

我正在使用Docker部署到Google Cloud Run。我的Dockerfile使用的是node:10,并像文档中所述公开PORT环境变量。除此HTTP请求外,其他所有内容均正常运行。我已经尝试了axiosfetch

最佳答案

要在Cloud Run应用程序上找到访客的IP地址,您需要阅读X-Forwarded-For header 。

当您仅查看请求或TCP连接上的IP地址时,就会看到将流量发送到应用程序的负载均衡器的内部IP地址。 (169.254.x.x是在RFC 3927中定义的内部IP地址空间,这就是为什么看到"reserved": true的原因。)

因此,在Express中,尝试执行以下操作:

var ip = req.header('X-Forwarded-For')

关于docker - Heroku和Google Cloud Run上的HTTP请求不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60347646/

相关文章:

javascript - Node JS : Listening for HTTPS POST JSON Requests

selenium - 如何从 docker 容器在网格上运行 selenium UI 测试?

php - Symfony 2 中的请求 header 包缺少授权 header ?

http - 多线程Go for HTTP get

node.js - 保护 HTTPS 客户端

ssl - 如果我用 libcurl 写一个 https 程序,我应该下载哪个 CA 证书?

linux - docker api ContainerExecInspect 无法获得正确的退出代码

docker - 在 gitlab ci before_script 中使用 apt 时找不到 apt

docker - 通过 ansible 模板化构建容器以使用配置文件

javascript - HTTP 状态代码 - Backbone.js 和 Jquery