Jak przekierować poddomeny do innego portu na tym samym serwerze?


67

Mam niektóre subdomeny, które chcę przekierować do określonych portów na tym samym serwerze. Powiedz, że mam

dev.mydomain.com 

Chcę w dev.mydomain.comsposób przejrzysty przekierować mydomain.com:8080na adres URL przeglądarki i zachować oryginalną nazwę subdomeny.

Jak to zrobić za pomocą Apache 2.2? Mam domyślny port Apache 2.2 80. Nie mogę wymyślić konfiguracji zapisu, aby tak się stało.

Skonfigurowałem już dev.mydomain.comrozwiązanie w DNS do mydomain.com.

Dotyczy to intranetowego serwera programistycznego, który ma nierutowalny adres IP, więc nie martwię się o exploity i zabezpieczenia, które zagroziłyby publicznie dostępnemu serwerowi.

Odpowiedzi:


69

Rozwiązanie

Oto, co w końcu wymyśliłem po tym, jak Miles Erickson ustawił mnie we właściwym kierunku. Chciałem, aby pasek adresu odzwierciedlał oryginalną subdomenę / domenę żądania, a nie przekierowany serwer i port, ale postawił mnie na właściwej ścieżce do Google, korzystając z rozwiązania VirtualHosti wreszcie znalazłem rozwiązanie, które obejmowało użycie 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
Dla każdego, kto ta odpowiedź nie pracują, należy pamiętać, że trzeba włączyć modów mod_proxy, jak również proxy_http.
matewka

9

Zakładając, że dev.mydomain.com można rozwiązać na adres IP mydomain.com, możesz dodać do httpd.conf:

NameVirtualHost *:80

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

Odpowiednia dokumentacja Apache:

  1. Przewodnik po tworzeniu wirtualnych hostów opartych na nazwach
  2. Rdzeń , w tym VirtualHost i NameVirtualHost
  3. Przeadresować

Powiązane pytanie: Przekierowanie Apache na podstawie nazwy hosta

(Uwaga: oryginalna wersja tej odpowiedzi niepoprawnie sugerowała użycie RedirectMatch, który, jak pomocnie zauważył @ChrisS, nie może przeanalizować części adresu URL domeny).


1
zobacz moją własną odpowiedź na to, czego faktycznie użyłem, co jest pomysłem VirtualHost z mod_proxy w celu zachowania oryginalnego hosta zamiast przekierowywania. To jest serwer wewnętrzny, więc nie interesuje mnie bezpieczeństwo ani exploity mod_proxy.

1
Znalazłem wiele innych sugestii, ale ostatecznie działało to dla mnie w systemie Windows Server 2008 R2 / Apache 2.2.25.
HPWD,

1
Problem z tym rozwiązaniem polega na tym, że u brata nie pozostajesz w pierwszej domenie, dostajesz 302 do drugiej.
Pleymor

7

Uruchom następującą linię na terminalu (poprawnie określ swoją domenę i subdomenę)

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

Wklej następujący kod i zmień go zgodnie z wymaganiami

<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>

Uruchom następujące wiersze na terminalu (poprawnie określ swoją domenę i subdomenę)

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

3
Czy jest jakaś istotna różnica między tym a zaakceptowaną odpowiedzią?
kasperd

1
Większość ludzi zapomina dodać, sudo a2enmod proxy_httpaby mieć trudności z prawidłowym działaniem. Staram się również podawać pełny proces od początku do końca w sekwencji, aby pomóc bardziej akulturacyjnie. Dziękuję za twoje pytanie.
MAK Ripon

1
+1 ze względu na wzmiankę o „ProxyRequests Off”
Sebastian

1
To po prostu nie działa dla mnie. „sudo a2enmod subdomain.domain.com.conf” mówi „BŁĄD: Moduł xyz nie istnieje!” Czy należy o tym wspomnieć w konfiguracji „domyślnej”?
Dirk Schumacher

2
Korekta rejestracji subdomeny sudo a2ensite sub.yourdomain.com
Ali Azhar

5

Dodaj w swojej głównej konfiguracji vhost następujące linie:

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

Zauważ, że wymaga to mod_proxy na Apache.


To nie jest przekierowanie; zastępuje połączenie. Włączenie mod_proxy może być bardzo łatwe do wykorzystania, jeśli nie bardzo ostrożnie go konfigurujesz. Gorąco polecam przeciwko temu.
Chris S

4
On nie chce przekierowania, zgodnie z jego OP. Chce, aby oryginalny adres URL pozostał w pasku adresu; oznacza to użycie mod_proxy lub mod_rewrite i lepiej unikać mod_rewrite.
adapttr

4

Szukasz mod_rewrite. Oto link do dokumentacji Apache, która zawiera wiele przykładów konfiguracji podstawowych i zaawansowanych .

A jeśli nie jesteś w stanie samodzielnie zinterpretować dokumentacji, spróbuj dodać to do httpd.conf:

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

A jeśli to nie jest jasny przykład, oto link do przewodnika dla początkujących mod_rewrite .


1
Jestem na hostingu współdzielonym. Przepisz to jedyna opcja. Mogę utworzyć plik .htaccess, ale nie proxy lub wirtualnego hosta.
abalter
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.