Apache proxy_http 重定向到 ip 并设置主机名

Apache proxy_http 重定向到 ip 并设置主机名

希望你们能帮助我解决我遇到的代理问题。

我已经拥有的

我已经设置了一个 apache http 反向代理,将请求从 *.proxy.domain 代理到 *.intern.domain。apache 是从外部网络访问我的内部 Web 应用程序的唯一方法。

例子:

app.proxy.domain -> app.intern.domain
mail.proxy.domain -> mail.intern.domain

这一切都很顺利,但我遇到了以下问题。

问题
我想要代理以下请求:

app.proxy.domain -> app.internal.domain
app-dev.proxy.domain -> app-dev.internal.domain

这没问题,但不幸的是,app-dev 服务器运行的是应用服务器 web 应用程序的精确副本,并且该 web 应用程序仅响应其主机名(app.intern.domain)

所以我需要做的是代理以下内容

app.proxy.domain -> app.internal.domain (10.0.1.1)
app-dev.proxy.domain -> app.internal.domain (10.0.1.2)

我可以做第二件事,通过在 /etc/hosts 中添加“10.0.1.2 app.internal.domain”,但这也意味着 app.proxy.domain 将登陆开发服务器。

我正在寻找一个选项,仅在 app-dev.proxy.domain 的 vhost 配置文件中设置 /etc/hosts 条目,以便每个其他 vhost 配置都只使用 app.intern.domain 的 DNS。

想法……

有没有办法告诉 apache 配置

ProxyPass / http://10.0.1.2/

但发送 app.intern.domain 作为主机名?

编辑 dev-servers web 应用程序来监听 app-dev 是不可能的,因为它应该是一个精确的副本(不是我的决定......)

谢谢!

答案1

或许你可以将 mod_headers 与 mod_proxy 结合使用。不过我还没有测试过。

因此,对于您的 app-dev vhost,您可以拥有:

RequestHeader set Host "app.internal.domain"

然后你可以添加:

ProxyPreserveHost On

答案2

不太好的解决方法是使用(或者说滥用)/etc/hosts 将 app.internal.domain 指向 localhost,然后配置 Apache 监听另外两个端口,分别用于您的应用和 app-dev。因此反向代理两次:

Listen 80
Listen 127.0.0.1:8001
Listen 127.0.0.1:8001

<VirtualHost *:80>
   ServerName app.proxy.domain
   ProxyPass / http://app.internal.domain:8001
</VirtualHost>
<VirtualHost *:80>
   ServerName app-dev.proxy.domain
   ProxyPass / http://app.internal.domain:8002
</VirtualHost>
<VirtualHost 127.0.0.1:8001>
   ServerName app.internal.domain
   ProxyPreserveHost On
   ProxyPass / http://10.0.1.1/
</VirtualHost>
<VirtualHost 127.0.0.1:8002>
   ServerName app.internal.domain
   ProxyPreserveHost On
   ProxyPass / http://10.0.1.2/
</VirtualHost>

答案3

添加到反向代理的配置(针对 app-dev.proxy..):

RequestHeader edit Host ^app-dev.proxy.domain app.proxy.domain

您必须事先启用 mod_headers:

a2enmod headers

内部服务器 10.0.1.2 应该有

ServerName app.proxy.domain

相关内容