Як перенаправити піддомени на інший порт на одному сервері?


67

У мене є кілька субдоменів, які я хочу переспрямувати на конкретні порти на одному сервері. Скажи, що я

dev.mydomain.com 

Я хочу dev.mydomain.comпрозоро переспрямувати, mydomain.com:8080і я хочу зберегти початкове ім'я субдомена URL-адресу браузера.

Як це зробити з Apache 2.2? У мене Apache 2.2 працює на порту за замовчуванням 80. Я не можу з'ясувати конфігурацію запису, щоб це сталося.

Я вже налаштувався dev.mydomain.comвирішити в DNS до mydomain.com.

Це для сервера розробки внутрішньої мережі, який має ip-адресу, яка не може бути маршрутизована, тому мене не так турбують подвиги та безпека, які можуть поставити під загрозу публічний сервер.

Відповіді:


69

Рішення

Ось що я нарешті придумав після того, як Майлз Еріксон був встановлений у правильному напрямку. Я хотів, щоб адресний рядок відображав оригінальний піддомен / домен запиту, а не переспрямований сервер і порт, але він поставив мене на правильний шлях до Google до рішення, використовуючи, VirtualHostі я нарешті знайшов рішення, яке включало використання 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
Для всіх , хто ця відповідь не працював для того , майте на увазі , що ви повинні включити модов mod_proxy, а також proxy_http.
matewka

9

Якщо припустити, що dev.mydomain.com може бути вирішено до IP-адреси mydomain.com, ви можете додати наступне до свого httpd.conf:

NameVirtualHost *:80

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

Відповідна документація Apache:

  1. Посібник зі створення віртуальних хостів на основі імен
  2. Ядро , в тому числі VirtualHost і NameVirtualHost
  3. Перенаправлення

Пов'язане питання: переадресація Apache на основі імені хоста

(Примітка. Початкова версія цієї відповіді неправильно запропонувала використовувати RedirectMatch, який, як @ChrisS корисно зазначав, не може проаналізувати частину домену URL-адреси.)


1
дивіться свою відповідь на те, що я насправді використовував, що таке ідея VirtualHost з mod_proxy, щоб зберегти початковий хост, а не робити переадресацію. Це внутрішній сервер, тому я не переймаюся безпекою або експлуатацією mod_proxy.

1
Знайдено багато інших пропозицій, але це врешті-решт працювало для мене на Windows Server 2008 R2 / Apache 2.2.25.
HPWD

1
Проблема цього рішення полягає в тому, що у вашого брата ви не залишаєтесь на першому домені, ви отримуєте 302 на другий.
Плеймор

7

Запустіть наступний рядок на терміналі (правильно вкажіть домен і піддоменне ім’я)

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

Вставте наступний код і змініть як свою вимогу

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

Виконайте наступні рядки на терміналі (правильно вкажіть домен і піддоменне ім’я)

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

3
Чи є істотна різниця між цим та прийнятою відповіддю?
kasperd

1
Більшість людей забувають додавати, sudo a2enmod proxy_httpщоб зіткнутися з труднощами при правильному бігу. Також я намагаюся надати повний процес від початку до кінця в послідовності, щоб допомогти більш активізуватися. Дякуємо за запитання
MAK Ripon

1
+1 через згадування "ProxyRequests Off"
Себастьян

1
Це просто не працює для мене. 'sudo a2enmod subdomain.domain.com.conf' говорить "ПОМИЛКА: Модуль xyz не існує!" Чи потрібно це згадувати в конфігурації "за замовчуванням"?
Дірк Шумахер

2
Виправлення при реєстрації субдомену sudo a2ensite sub.yourdomain.com
Ali Azhar

5

Додайте до основної конфігурації vhost наступні рядки:

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

Зауважте, що для цього потрібен mod_proxy на Apache.


Це не перенаправлення; він підтримує з'єднання. Увімкнення mod_proxy може бути надзвичайно простим у використанні, якщо ви не дуже ретельно налаштовуєте його. Я б дуже рекомендував проти цього.
Кріс S

4
Він не хоче перенаправлення, відповідно до його ОП. Він хоче, щоб оригінальна URL-адреса залишалася в адресному рядку; це означає використовувати або mod_proxy, або mod_rewrite, і вам краще уникати mod_rewrite.
адаптор

4

Ви шукаєте mod_rewrite. Ось посилання на документацію Apache, яка містить безліч прикладів для базової та розширеної конфігурації.

Якщо ви не можете самостійно інтерпретувати документацію, спробуйте додати її до httpd.conf:

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

І якщо це не ясний приклад, ось посилання на посібник для початківців mod_rewrite .


1
Я на спільному хостингу. Перезапис - єдиний варіант. Я можу створити .htaccess файл, але не проксі або віртуальний хост.
abalter
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.