ProxyPass 返回 404,但一个名称可以

ProxyPass 返回 404,但一个名称可以

祝大家美好的一天。我给你举个例子,我试过了

/etc/hosts 中有 2 个 BalanceMember 条目。当然,别看这些虚拟机,它是一个黑匣子。所有请求都会返回404 not found。

    ServerName service.test.com

    SSLProxyEngine on

  <Proxy "balancer://service">
    BalancerMember https://service1.ng.com
    BalancerMember https://service2.ng.com
  </Proxy>

    ProxyPass "/" "balancer://service/"
    ProxyPassReverse "/" "balancer://service/"

如果我编辑 /etc/hosts 并将名称从 service1.ng.com 更改为 service.ng.com,然后将 conf apache 更改为此

    ServerName service.test.com

    SSLProxyEngine on

  <Proxy "balancer://service">
    BalancerMember https://service.ng.com
    BalancerMember https://service2.ng.com
  </Proxy>

    ProxyPass "/" "balancer://service/"
    ProxyPassReverse "/" "balancer://service/"

两个请求中有一个将返回 200 OK。你明白吧?但我无法理解。代理向平衡器之一发送什么,一切正常。嗯,或者在平衡器之后,我不知道。

预先感谢您的回复。

答案1

这看起来您可能需要在后端 ( service1,2) 上进行不同的配置来响应来自主机名的请求service1,2,或者需要不同的设置ProxyPreserveHost

在标准设置中,当请求代理到后端时,ProxyPass 将替换请求的 Host 标头。这是因为后端本身可能VirtualHost配置了多个,并且需要能够确定使用哪一个。这可能会导致问题,因为此时您不再知道原始请求的主机名是什么。

将所有后端配置为响应原始服务器名称是完全有效的,因为这会减少麻烦,例如,它们放入页面中的链接不会意外包含https://service1/或类似的内容,但您需要设置ProxyPreserveHost on来告诉您的前端 httpd 保留请求的Host标头。

答案2

<Location "/">
    ProxyPass "https://service.ng.com/"
    ProxyPassReverse "https://service.ng.com/"
    AllowOverride None
    Order Deny,Allow
    Deny from All
    Allow from All
</Location>

这个块解决了我的问题。谢谢。

相关内容