Apache-2.2

Apache proxy_http 重定向到 ip 並設置主機名

  • November 25, 2013

希望你們能幫助我解決我遇到的代理問題。

我已經擁有的

我已經設置了一個 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 網路應用程序來監聽 app-dev 是沒有選擇的,因為它應該是一個精確的副本(不是我的決定……)

謝謝!

可能您可以將 mod_headers 與 mod_proxy 結合使用。不過我還沒有測試過。

因此,對於您的 app-dev 虛擬主機,您可以擁有:

RequestHeader set Host "app.internal.domain"

然後你會添加:

ProxyPreserveHost On

醜陋的解決方法是使用(而不是:濫用)/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>

引用自:https://serverfault.com/questions/557233