Как перенаправить субдомены на другой порт на том же сервере?


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. Core , включая 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
Есть ли существенная разница между этим и принятым ответом?
Касперд

1
Большинство людей забывают добавить, sudo a2enmod proxy_httpпоэтому они сталкиваются с трудностями при правильной работе. Также я стараюсь дать полный процесс от начала до конца в последовательности, чтобы помочь более аккуратным. Спасибо за ваш вопрос.
МАК Рипон

1
+1 из-за упоминания «ProxyRequests Off»
Себастьян

1
Это просто не работает для меня. 'sudo a2enmod subdomain.domain.com.conf' говорит: "ОШИБКА: Модуль xyz не существует!" Обязательно ли это указывать в конфигурации «по умолчанию»?
Дирк Шумахер

2
Исправление в регистрации поддоменов sudo a2ensite sub.yourdomain.com
Али Азхар

5

Добавьте в вашу основную конфигурацию vhost следующие строки:

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

Обратите внимание, что это требует mod_proxy на Apache.


Это не редирект; это проксирует соединение. Включение mod_proxy может быть чрезвычайно простым в использовании, если вы не очень тщательно настраиваете его. Я очень рекомендую против этого.
Крис С

4
Он не хочет перенаправления, согласно его ОП. Он хочет, чтобы оригинальный адрес оставался в адресной строке; это означает использование либо 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, но не прокси или виртуальный хост.
августа
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.