Apache переписывает запросы домена к запросам поддоменов - PullRequest
0 голосов
/ 06 июня 2009

Предостережение: я не эксперт по Apache или веб-мастер по образованию или профессии (разработчик C ++), поэтому я ожидаю, что это довольно очевидный вопрос для начинающих. Заранее извиняюсь.

Мне нужно правило переписывания Apache 2.x, которое отобразит запрошенный домен в наш домен как поддомен.

Упрощенный пример (ы):

domain1.com/index.php?option=80     ->      domain1.masterdomain.com/index.php?option=80
www.domain1.com/index.php?option=99 ->      domain1.masterdomain.com/index.php?option=99
domain2.com/index.php?option=33     ->      domain2.masterdomain.com/index.php?option=33
www.domain2.com/index.php?option=44 ->      domain2.masterdomain.com/index.php?option=44

Я пробовал множество предложенных вариантов, но пока без радости. Последняя попытка:

RewriteRule   ([^.]+)\.com(.*) http://$1.masterdomain.com [L]

Примечание: он находится на виртуальном хосте, которому принадлежит порт 80 на определенном IP-адресе, поэтому в VHost больше ничего интересного не происходит, как я вижу, какое-либо влияние на это.

Я полагаю, что моя проблема в моем регулярном выражении, но, честно говоря, это ускользает от меня.

Любая помощь будет очень полезной. Я изучал документы по Apache и все советы по поиску, которые я могу найти, но я просто не вижу их.

спасибо ~

Ответы [ 2 ]

3 голосов
/ 06 июня 2009

На самом деле, нет необходимости переписывать имя домена, если домены «источника» и «назначения» обрабатываются одним и тем же сервером. Вам просто нужно псевдоним различных доменов, чтобы ссылаться на один и тот же хост. В частности: я полагаю, что сейчас у вас есть <VirtualHost> блоки, которые выглядят примерно так:

<VirtualHost *:80>
    ServerName domain1.masterdomain.com
    # other rules
</VirtualHost>
<VirtualHost *:80>
    ServerName domain2.masterdomain.com
    # other rules
</VirtualHost>

Все, что вам нужно сделать, это добавить директивы ServerAlias, как показано ниже:

<VirtualHost *:80>
    ServerName domain1.masterdomain.com
    ServerAlias domain1.com
    ServerAlias www.domain1.com
    # same other rules as before
</VirtualHost>
<VirtualHost *:80>
    ServerName domain2.masterdomain.com
    ServerAlias domain2.com
    ServerAlias www.domain2.com
    # same other rules as before
</VirtualHost>

Это заставит Apache обрабатывать доменные имена domain1.com и www.domain1.com так же, как он обрабатывает domain1.masterdomain.com.

0 голосов
/ 06 июня 2009

Спасибо за быстрый ответ! На самом деле, у меня есть один VHost, который обрабатывает все сайты (поскольку все они имеют одинаковую структуру), используя директивы VirtualDocumentRoot. При желании я могу опубликовать всю запись VHost, но я подумал, что это будет излишним для моего вопроса.

Я добился прогресса со времени моего предыдущего поста. Далее выполняется перезапись по желанию, хотя и обновляется URL-адрес браузера, и я не хочу, чтобы пользователь знал, что он был перенаправлен внутри.

 RewriteCond    %{HTTP_HOST}    ^(www\.)?([^.]+)\.com$ [NC]
 RewriteRule    ^(.*)$      http://%2.masterdomain.com$1

Я не уверен, почему он обновляет URL браузера при перенаправлении. Я думал, что прочитал, что происходит, только если вы явно добавите [R] в конце строки правила. В конечном итоге браузер должен по-прежнему отображать: test1.com/index.php?id=5, тогда как внутренне cgi получает test1.masterdomain.com/index.php?id=5.

Еще одна точка данных, которая может быть полезной (или нет), я вижу в моем rewrite.log, что после сопоставления она неявно выполняет перенаправление (rc = 302). Вот две строки, которые я считаю важными:

 implicitly forcing redirect (rc=302) with http://test1.masterdomain.com/index.php
 redirect to http://test1.masterdomain.com/index.php?id=5 [REDIRECT/302]

Любые мысли / предложения приветствуются! 20+ лет C ++, но чуть меньше недели с Apache, так что все еще очень трудный новичок.

-WB

P.S. из-за некоторых требований к кодированию для веб-приложений, которые заблокированы, мне действительно нужно, чтобы URL, полученный cgi, был xxx.masterdomain.com (длинная история, не , мой выбор или подход; просто попытка решить проблема, с которой я столкнулся, из-за жестких требований .... Кроме того, мои извинения за очищенные данные - следование директивам из-за высокого уровня. -smile-) Еще раз спасибо!

...