Javascript 除了覆盖';主机';标题程序化

Javascript 除了覆盖';主机';标题程序化,javascript,reactjs,Javascript,Reactjs,我在docker images上本地运行两个服务。其中一个是nginx服务器,配置为代理对各种其他服务的请求,另一个是简单的React-graphiqlui nginx服务器没有显式设置为在localhost上运行,但是当使用curl/postman发出请求时,我可以显式地将host头设置为实际url的头(而不是localhost),然后它将找到正确的配置,请求将成功 问题是我想从UI的本地实例调用服务器,但它失败了,因为我无法覆盖host头。我试图手动将其添加到我的reactfetch请求中,

我在docker images上本地运行两个服务。其中一个是nginx服务器,配置为代理对各种其他服务的请求,另一个是简单的React-graphiqlui

nginx服务器没有显式设置为在localhost上运行,但是当使用curl/postman发出请求时,我可以显式地将
host
头设置为实际url的头(而不是
localhost
),然后它将找到正确的配置,请求将成功

问题是我想从UI的本地实例调用服务器,但它失败了,因为我无法覆盖
host
头。我试图手动将其添加到我的react
fetch
请求中,但当我在浏览器中检查请求时,标题不在那里。经过一番搜索之后,我发现了一些松散的帖子,说这是不可能的,尽管没有提到原因

return fetch(
        edgeUrl(environment) + "/some/endpoint",
        {
            method: "POST",
            headers: {
                'Authorization': 'Bearer ' + getApiKey(partner, environment),
                'host': 'actual.host.com',
                'origin': 'http://localhost/'
            },
            body: JSON.stringify({ query })
        }
    )

是否有其他方法覆盖请求中使用的主机?可能是我可以使用的另一个http库?我不希望必须为localhost配置nginx服务器,因为它属于另一个团队。

您不应该尝试更改主机头。浏览器不允许您这样做,而且这不是正确的方式

在我看来,您有两种选择:

  • 配置NGINX以接受对localhost的请求,如果这是它的“实际主机名”

  • 更改主机文件,将您的域包含到127.0.0.1,这相当于将其添加到DNS

  • Windows主机文件位于此处:
    C:\Windows\System32\drivers\etc\Hosts

    您应该在注释
    #
    之后将以下内容添加到主机文件中


    对于任何感兴趣的人,这里有一些关于使用主机头的可能攻击的信息,以及为什么验证它很有用,这正是该服务所做的


    我要问另一个团队,我是否可以将本地主机配置添加到他们的nginx配置中,以便我可以在本地发出请求,看起来我的同事错误地建议我覆盖主机头。

    为什么主机与
    edgeUrl(环境)
    解析的主机不同?@AndréSnede服务器在本地主机上运行,但是在配置中,没有将localhost指定为主机。通过在请求上手动设置“主机”头,它将使用该主机的配置,而不是本地主机。您不应该摆弄主机头。我很高兴你被阻止了。更改主机文件,将react.host.com添加为指向127.0.0。1@Andr埃斯奈德为什么不呢?团队中拥有该服务的一位同事告诉我,在本地使用该服务时,只需覆盖主机头,所以我需要一些理由,除了“一个陌生人在互联网上告诉我不要”之外,回到他们那里说我不能这样做。你不应该依赖一个陌生人在互联网上我同意,你应该自己做研究。浏览器根本不允许你这么做。这也是错误的,你没有和你声称的主人交谈。这实际上是一种非常常见的渗透测试攻击,在这种攻击中,您欺骗了头部,因此浏览器中不允许使用这种攻击。您应该更改主机文件,将您想要的域指向该特定IP,以便您的浏览器知道它是网站的来源。出于安全原因,CORS原因。
    actual.host.com 127.0.0.1