Wie leite ich Subdomains auf einen anderen Port auf demselben Server um?


67

Ich habe einige Subdomains, die ich auf bestimmte Ports auf demselben Server umleiten möchte. Sagen wir, ich habe

dev.mydomain.com 

Ich möchte die URL des Browsers dev.mydomain.comtransparent umleiten mydomain.com:8080und den ursprünglichen Subdomainnamen beibehalten.

Wie mache ich das mit Apache 2.2? Ich habe Apache 2.2 auf Standardport ausgeführt 80. Ich kann die Schreibkonfiguration nicht herausfinden, um dies zu erreichen.

Ich habe mich schon eingerichtet dev.mydomain.com, um in DNS aufzulösen mydomain.com.

Dies ist für einen Intranet-Entwicklungsserver gedacht, der eine nicht routbare IP-Adresse hat. Ich bin also nicht so besorgt über Exploits und Sicherheitsrisiken, die einen öffentlich zugänglichen Server gefährden würden.

Antworten:


69

Lösung

Hier ist, was ich endlich gefunden habe, nachdem ich von Miles Erickson in die richtige Richtung gelenkt wurde. Ich wollte, dass die Adressleiste die ursprüngliche Subdomain / Domain der Anfrage und nicht den umgeleiteten Server und Port widerspiegelt, aber er brachte mich auf den richtigen Weg, um eine Lösung mit Google zu finden, VirtualHostund ich fand schließlich eine Lösung, die die Verwendung von enthielt mod_proxy.

<VirtualHost *:80>
    ServerAdmin me@mydomain.com
    ServerName dev.mydomain.com
    ProxyPreserveHost On

    # setup the proxy
    <Proxy *>
        Order allow,deny
        Allow from all
    </Proxy>
    ProxyPass / http://localhost:8888/
    ProxyPassReverse / http://localhost:8888/
</VirtualHost>

7
Für alle , die diese Antwort für nicht funktioniert, denken Sie daran , dass Sie zu Mods ermöglichen mod_proxysowie proxy_http.
Matewka

9

Unter der Annahme, dass dev.mydomain.com in die IP von mydomain.com aufgelöst werden kann, können Sie Ihrer httpd.conf Folgendes hinzufügen:

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName dev.mydomain.com
    redirect / http://mydomain.com:8080/
</VirtualHost>

Relevante Apache-Dokumentation:

  1. Anleitung zum Erstellen von namensbasierten virtuellen Hosts
  2. Core , einschließlich VirtualHost und NameVirtualHost
  3. Umleiten

Verwandte Frage: Apache-Weiterleitung basierend auf dem Hostnamen

(Hinweis: In der Originalversion dieser Antwort wurde fälschlicherweise die Verwendung von RedirectMatch vorgeschlagen, das, wie @ChrisS unterstreicht, den Domain-Teil der URL nicht analysieren kann.)


1
Siehe meine selbst bereitgestellte Antwort für das, was ich tatsächlich verwendet habe. Dies ist die Idee von VirtualHost mit mod_proxy, um den ursprünglichen Host beizubehalten, anstatt eine Umleitung durchzuführen. Dies ist ein interner Server, daher beschäftige ich mich nicht mit der Sicherheit oder den Exploits von mod_proxy.

1
Es wurden zahlreiche andere Vorschläge gefunden, die sich jedoch letztendlich für Windows Server 2008 R2 / Apache 2.2.25 bewährt haben.
HPWD

1
Das Problem bei dieser Lösung ist, dass Sie bei Ihrem Bruder nicht in der ersten Domain bleiben, sondern eine 302 in die zweite Domain bekommen.
Pleymor

7

Führen Sie die folgende Zeile auf dem Terminal aus (geben Sie Ihre Domain und Ihren Sub-Domain-Namen korrekt an)

sudo nano /etc/apache2/sites-available/subdomain.example.com.conf 

Fügen Sie den folgenden Code ein und ändern Sie ihn nach Ihren Wünschen

<VirtualHost *:80>
        ServerAdmin admin@example.com
        ServerName subdomain.example.com
        ServerAlias subdomain.example.com
        ProxyRequests Off

        #ProxyPass / http://localhost:8080/
        <Location />
                ProxyPreserveHost On
                ProxyPass http://example.com:8080/
                ProxyPassReverse http://example.com:8080/
        </Location>
     # Uncomment the line below if your site uses SSL.
     #SSLProxyEngine On
</VirtualHost>

Führen Sie die folgenden Zeilen auf dem Terminal aus (geben Sie Ihre Domain und Ihren Sub-Domain-Namen korrekt an)

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2ensite subdomain.example.com.conf
sudo service apache2 restart

3
Gibt es einen wesentlichen Unterschied zwischen dieser und der akzeptierten Antwort?
Kasperd

1
Die meisten Leute vergessen das Hinzufügen, sudo a2enmod proxy_httpso dass sie Schwierigkeiten haben, richtig zu laufen. Außerdem versuche ich, den gesamten Prozess von Anfang bis Ende durchzuarbeiten, um die Akkulturation zu fördern. Danke für deine Frage.
MAK Ripon

1
+1 wegen Erwähnung von "ProxyRequests Off"
Sebastian

1
Das funktioniert bei mir einfach nicht. 'sudo a2enmod subdomain.domain.com.conf' sagt "FEHLER: Modul xyz existiert nicht!" Muss es in der 'Standard'-Konfiguration erwähnt werden?
Dirk Schumacher

2
Korrektur bei der Registrierung der Subdomain sudo a2ensite sub.yourdomain.com
Ali Azhar

5

Fügen Sie in Ihrer Haupt-VHOST-Konfiguration die folgenden Zeilen hinzu:

ProxyPreserveHost On
ProxyPass / http://example.com:8080/
ProxyPassReverse / http://example:8080/

Beachten Sie, dass hierfür mod_proxy auf Apache erforderlich ist.


Dies ist keine Weiterleitung. Es stellt die Verbindung her. Das Aktivieren von mod_proxy kann extrem einfach ausgenutzt werden, wenn Sie es nicht sehr sorgfältig konfigurieren. Ich kann es nur wärmstens empfehlen.
Chris S

4
Er möchte keine Weiterleitung, wie in seinem OP vorgesehen. Er möchte, dass die ursprüngliche URL in der Adressleiste bleibt. Dies bedeutet, entweder mod_proxy oder mod_rewrite zu verwenden, und Sie sollten mod_rewrite besser vermeiden.
1.

4

Du suchst nach mod_rewrite. Hier ist der Link zu Apaches Dokumentation, die viele Beispiele für grundlegende und erweiterte Konfigurationen enthält.

Und wenn Sie die Dokumentation nicht selbst interpretieren können, fügen Sie Folgendes zu httpd.conf hinzu:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^dev\.example\.com$ [NC]        
RewriteRule ^(.*)$ http://example.com:8080$1 [R=301]    

Und wenn dies kein klares Beispiel ist, finden Sie hier auch einen Link zu einem mod_rewrite-Leitfaden für Anfänger .


1
Ich bin auf Shared Hosting. Umschreiben ist die einzige Option. Ich kann eine .htaccess-Datei erstellen, aber keinen Proxy oder virtuellen Host.
Abalter
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.