Двунаправленное сопоставление и канонизация URL с использованием mod_rewrite - PullRequest
0 голосов
/ 20 января 2012

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

Я недавно унаследовал сайт для организации (назовем его theorganization.com) с установленным Joomla! , а кто-то просто пошел и купил дополнительный домен (anevent.com) для мероприятия, которое он проводит с ожиданием, что мы можем просто «указать» это прямо в соответствующем разделе нашего существующего сайта. Да, простая «маскировка» могла бы выполнить это в одном направлении, но я хотел бы канонизировать URL-адрес и отобразить его в обоих направлениях, используя mod_rewrite, и т. Д. (Это , а не бесконечный цикл: одно направление - это перенаправление 301; другое - маска URL.)

Я хочу разместить информацию о мероприятии на нашей существующей Joomla! установить в разделе, доступном по theorganization.com/eventname/, и сопоставить его с новым доменом. Примечание: Joomla! использует сам перезапись, поэтому , а не будет физический каталог eventname в пределах корпуса каталога theorganization.com. (Не уверен, если / как это повлияет на что-либо здесь.)

В частности, я хочу всех запросов, сделанных либо на theorganization.com/eventname, либо на anevent.com (с или без www или конечной косой чертой), чтобы обслуживать контент, который Joomla! обычно присваивается значение theorganization.com/eventname/ при отображении URL-адреса как www.anevent.com/. Конечно, все подкаталоги и файлы ниже этих уровней также должны отображаться соответствующим образом.


После просмотра документов Apache mod_rewrite я попытался сделать следующее.

Для theorganization.com:

RewriteEngine On

# STRIP "www" IF PRESENT (undesired, but necessary for now due to other issues)
RewriteCond %{HTTP_HOST} ^www.theorganization.com$ [NC]
RewriteRule ^(.*)$ http://theorganization.com/$1 [R=301,L]

RewriteCond %{REQUEST_URI} ^/eventname/?(.*)$ [NC]
RewriteRule ^http://(www\.)theorganization.com/eventname/?(.*)$ "http://www.anevent.com/$2" [R=301,L] 

# ...
# ... default Joomla! .htaccess code here ...

После долгих испытаний я обнаружил, что забыл Joomla! по умолчанию имеет свои собственные изменения в .htaccess, и я случайно их перезаписал. (К счастью, я нашел замену .) Но второе (оперативное) перенаправление, кажется, не действует, как и должно. Что я могу делать не так?

Для anevent.com:

RewriteEngine On

# ADD "www" IF MISSING
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# UNCONDITIONALLY DEFER ALL REQUESTS HERE TO theorganization.com/eventname/
RewriteRule ^(.*)$ http://theorganization.com/eventname/$1 [L]

Это, кажется, работает довольно хорошо (исходя из предположения, что я могу заставить работать первый). Тем не менее, безусловное правило в последней строке, кажется, действует как 301/302 или что-то подобное и загружает http://theorganization.com/eventname/FOO. Как я могу изменить это, чтобы вместо этого добиться «маскировки», чтобы пользователи могли видеть только http://www.anevent.com/FOO в своем браузере, но по-прежнему были направлены на тот же контент?

1 Ответ

1 голос
/ 20 января 2012

Для первой части добавьте следующее в ваш файл .htaccess в корне theorganization.com site

RewriteEngine on
RewriteBase /

#if its on theorganization.com domain
RewriteCond %{HTTP_HOST} theorganization\.com$ [NC]
#if the original request has eventname in it
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /eventname/ [NC]
# redirect eventname to anevent.com
RewriteRule ^eventname/(.*)$ http://www.anevent.com/$1 [R=301,L]

Для anevent.com:

Ваше правило содержит полный URL-адрес, поэтому оно будет автоматически перенаправлено. Я изменил его, как показано ниже, для перезаписи на стороне сервера, как показано ниже.

RewriteEngine on
RewriteBase /

#if not internal redirect
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(.*)$ theorganization.com/eventname/$1 [L]
...