Apache proxy_http leitet zu ip um und setzt den Hostnamen

16

hoffentlich könnt ihr mir bei einem Proxy-Problem helfen, das ich habe.

Was ich schon habe

Ich habe einen Apache-HTTP-Reverse-Proxy für Proxy-Anfragen von * .proxy.domain nach * .intern.domain eingerichtet. Der Apache ist die einzige Möglichkeit, meine internen Webanwendungen von einem externen Netzwerk aus zu erreichen.

Beispiel:

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

Das funktioniert alles prima, aber ich habe folgendes Problem.

Problem
Ich möchte die folgenden Anfragen vertreten:

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

Dies ist kein Problem, aber leider führt der App-Dev-Server eine exakte Kopie der App-Server-Webanwendung aus. Diese Webanwendung antwortet nur auf den Hostnamen (app.intern.domain).

Also, was ich tun muss, ist Proxy die folgenden

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

Ich kann das Zweite tun, indem ich "10.0.1.2 app.internal.domain" in / etc / hosts hinzufüge, aber das bedeutet auch, dass app.proxy.domain auf dem Dev-Server landet.

Ich suche nach einer Option, um den Eintrag / etc / hosts nur in der vhost-Konfigurationsdatei für app-dev.proxy.domain festzulegen, sodass jede andere vhost-Konfiguration nur DNS für app.intern.domain verwendet.

Gedanken...

Gibt es eine Möglichkeit, apache config mitzuteilen, zu

ProxyPass / http://10.0.1.2/

aber sende app.intern.domain als hostname?

Das Bearbeiten der Dev-Server-Webanwendung zum Anhören von App-Dev ist keine Option, da es sich um eine exakte Kopie handeln soll (nicht meine Entscheidung ...).

Vielen Dank!

Mohrphium
quelle

Antworten:

34

Möglicherweise könnten Sie mod_headers in Verbindung mit mod_proxy verwenden. Ich habe es aber nicht getestet.

Für Ihren App-Entwickler-Host könnten Sie also Folgendes haben:

RequestHeader set Host "app.internal.domain"

und dann würden Sie hinzufügen:

ProxyPreserveHost On
Piotr
quelle
2
Die ProxypreserveHost-Einstellung hat den Trick perfekt gemacht. Vielen Dank!
Einige Linux Nerd
3

Eine hässliche Abhilfe besteht darin, die Datei / etc / hosts zu verwenden (statt sie zu missbrauchen), um app.internal.domain auf localhost zu verweisen, und Apache dann so zu konfigurieren, dass zwei zusätzliche Ports abgehört werden, einer für jede App und jeden App-Entwickler. Also Proxy zweimal umkehren:

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>
HBruijn
quelle
2

Hinzufügen, um die Konfiguration des Proxys umzukehren (foe app-dev.proxy ..):

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

Sie müssen vorher mod_headers aktivieren:

a2enmod headers

Interner Server 10.0.1.2 sollte haben

ServerName app.proxy.domain
grafzero
quelle