RewriteRule для сопоставления x.domain.com с y.domain.com - PullRequest
1 голос
/ 14 июня 2009

Можно ли перенаправить все запросы на x.domain.com /.* на y.domain.com /.* БЕЗ того, чтобы это перенаправление было видно в URL?

Я неудачно попробовал несколько вещей в .htaccess. Просто указание флага [L] по-прежнему показывает это перенаправление в URL (как это происходит, когда я дополнительно использую флаг [R]).

РЕДАКТИРОВАТЬ: как кто-то утверждал, что нет никаких причин для этого, позвольте мне дать больше информации :) У меня есть один хороший URL: x.domain.com, который хорошо известен. Затем есть ряд других доменов: spring.domain.com, summer.domain.com, autumn.domain.com, winter.domain.com. В зависимости от времени года текущий y.domain.com становится текущим. Сайт x.domain.com всегда должен соответствовать текущему.

EDIT2: Я напишу здесь, так как код не очень хорошо отображается в комментариях ... Я попробовал то, что предложил Арджан:

RewriteCond %{HTTP_HOST} ^x.domain.com$
RewriteRule ^(.*)$ /path/to/y.domain.folder/$1

К сожалению, это продолжает перенаправлять вечно. (

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.

Поместив флаг [R] позади, я вижу в URL что-то вроде:

http://x.domain.com/path/to/y.domain.folder/path/to/y.domain.folder/path/to/y.domain.folder/ ... 

Есть предложения?

Теперь, когда я могу прочитать журналы ошибок, я могу дать прямой ответ, что означает возможная ошибка 500.

Ответы [ 4 ]

2 голосов
/ 14 июня 2009

Предполагая, что у вас есть доступ к конфигурации Apache, создайте следующий виртуальный хост для домена x.domain.com. Затем просто обновите y до того, что вам нужно каждый сезон.

<VirtualHost ...:80>
  ServerName x.domain.com

  UseCanonicalName Off
  ProxyRequests Off

  <Proxy *>
          Order Allow,Deny
          Allow from all
  </Proxy>

  ProxyPreserveHost Off

  RewriteEngine On
  RewriteRule      ^$             http://y.domain.com/ [P,NC]
  RewriteRule      ^/(.*)$        http://y.domain.com/$1 [P,NC]
  ProxyPassReverse /              http://y.domain.com/
</VirtualHost>

Также, чтобы получить предложения по псевдонимам, если у вас есть несколько виртуальных хостов (по одному на каждый сезон), вы можете поместить псевдоним сервера в текущий домен. Э.Г.

<VirtualHost ...:80>
  ServerName summer.domain.com
  ServerAlias x.domain.com
  ...
</VirtualHost>

<VirtualHost ...:80>
  ServerName spring.domain.com
  ...
</VirtualHost>

...

Это приведет к тому, что Apache доставит страницы summer.domain.com, если вы перейдете на x.domain.com. Если ваши сезонные субдомены зависят от правильной установки строки заголовка HOST (то есть на season.domain.com), вам, тем не менее, потребуется использовать первое предложение выше.

1 голос
/ 14 июня 2009

Если они не размещены на одном и том же сервере, вам понадобится флаг Proxy. Это также требует наличия прокси-модуля. Не проверено:

RewriteCond %{HTTP_HOST} ^x.domain.com$
RewriteRule ^(.*)$ http://y.domain.com/$1 [P]

РЕДАКТИРОВАТЬ: Учитывая изменения вашего вопроса, они, вероятно, просто на одном сервере. Итак, действительно, как предположил Джетру, Alias ​​мог бы сделать. Или:

# No RewriteCond required; serve all content from other folder:
RewriteRule ^(.*)$ /path/to/y.domain.folder/$1

РЕДАКТИРОВАТЬ: Выше не будет изменять заголовок HTTP_HOST, который был отправлен браузером (возможно, это можно сделать также). Это подразумевает, что это будет работать, только если субдомены представлены в файловой системе как отдельные каталоги. Таким образом, поскольку .htaccess будет помещен в каталог, содержащий веб-сайт для x.domain.com, RewriteCond даже не потребуется. Кроме того, каталог для этого поддомена x.domain.com фактически не будет нуждаться в HTML-содержимом; в итоге весь контент будет обслуживаться из каталога другого субдомена.

РЕДАКТИРОВАТЬ: Поскольку вышеприведенное, кажется, тоже не работает, и дает бесконечные циклы перезаписи, даже при добавлении [NS], может быть, простое добавление [L] помогает здесь:

RewriteRule ^(.*)$ /path/to/y.domain.folder/$1 [NS,L]

Или, может быть, можно установить переменную окружения, чтобы остановить цикл:

RewriteCond %{ENV:MY_VAR} !=1
RewriteRule ^(.*)$ /path/to/y.domain.folder/$1 [E=MY_VAR:1]

Но для [L] и [E]: я просто догадываюсь; Я никогда не заставлял mod_rewrite прыгать в каталог другого виртуального хоста. Я не уверен, что это можно сделать для начала.

К сожалению, неясно, как добавить новый поддомен. Если нужно просто создать новый каталог с именем субдомена (без какого-либо использования какого-либо инструмента администрирования), тогда поставщик может использовать переписывание всей системы. На самом деле, даже без поддоменов, провайдер может использовать массовый виртуальный хостинг , как описано в URL Rewrite Guide .

Я полагаю, что лучшим решением было бы изменить значение HTTP_HOST на лету, чтобы решить проблемы с любым переписыванием всей системы. Возможно, для этого разрешено следующее:

RewriteCond %{HTTP_HOST} ^x.domain.com$
RewriteRule ^(.*)$ /path/to/y.domain.folder/$1 [E=HTTP_HOST:y.domain.com]

Опять же, поскольку вышеупомянутое будет присутствовать только в .htaccess в папке x.domain.fi, RewriteCond, вероятно, вообще не нужен.

1 голос
/ 14 июня 2009

Вы пробовали Alias ​​/dir/file.html /full/path/to/other/file.html ??

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

Насколько мне известно и тестирование с помощью firebug, клиент всегда объявляет о перенаправлении через .htaccess, и ему решать, как действовать дальше. Поэтому это не альтернатива какой-либо функциональности SSI. Чтобы предотвратить «фальшивый» адрес, современный браузер всегда должен делать РЕАЛЬНЫЙ адрес видимым для пользователя, однако я думаю, что я видел некоторое неправильное поведение в программах, таких как «feeddemon», в которые встроен IE. Если вы - по какой-либо причине - действительно хотите показывать контент с одного субдомена на другой, вы можете попробовать использовать Javascript или (i) фреймы на стороне пользователя или некоторые из них включают функциональность на сайте сервера (например, file_get_contents с php). Однако я не рекомендую это.

...