.htaccess / mod_rewrite: Запад <--- Главный сайт ---> Восток - PullRequest
0 голосов
/ 29 ноября 2011

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

Ниже приведено описание того, чего я пытаюсь достичь ...

3 сайта:

http://www.example.com/ or http://example.com/
http://east.example.com/
http://west.example.com/

На главном сайте есть страницы, которые нужно перенаправить на другие сайты:

http://www.example.com/location1
http://www.example.com/location2
http://www.example.com/location3
http://www.example.com/location4
http://www.example.com/location5
http://www.example.com/location6

Необходимо перенаправить некоторые страницы на один веб-сайт в зависимости от местоположения, например, http://east.example.com/:

http://www.example.com/location1 redirect to http://east.example.com/location1
http://www.example.com/location2 redirect to http://east.example.com/location2
http://www.example.com/location3 redirect to http://east.example.com/location3
(also without www) e.g.
http://example.com/location1 redirect to http://east.example.com/location1

Необходимо перенаправить некоторые страницы на другой веб-сайт в зависимости от местоположения, например, http://west.example.com/:

http://www.example.com/location4 redirect to http://west.example.com/location4
http://www.example.com/location5 redirect to http://west.example.com/location5
http://www.example.com/location6 redirect to http://west.example.com/location6
(also without www) e.g.
http://example.com/location4 redirect to http://west.example.com/location4

Хотите переписать правило, которое работает как:

If domain name is www.example.com or domain name is example.com
And domain name is not east.example.com
And domain name is not west.example.com
And "somelocation" (in the east) is in the URL
Then Rewrite(Redirect) URL to http://east.example.com/.../somelocation/.../somepage

ПРИМЕЧАНИЕ. Три веб-сайта на самом деле используют одну и ту же кодовую базу, поэтому все URL-адреса указывают на один и тот же файл местоположения / .htaccess. Итак, я попытался использовать базовое перенаправление, и в результате возникла ошибка: «Не удается открыть страницу из-за слишком большого количества перенаправлений.

»

Если кто-нибудь знает ответ и может помочь с этим, я был бы очень признателен за помощь!

РЕДАКТИРОВАТЬ: Пример ожидаемых результатов

Оригинальный URL: «http://www.example.com/locations/eastend-web-page"

Переписанный URL: «http://east.example.com/locations/eastend-web-page"

Ответы [ 2 ]

0 голосов
/ 29 ноября 2011

Пожалуйста, попробуйте заполнить файл перезаписи карты (см. здесь ), чтобы соответствовать URL-адресам, которые являются частью вашего "восточного" домена.Вы можете объявить это так:

RewriteMap mapmaintoeast \
  dbm:/web/htdocs/yoursite/rewriterules/mapmaintoeast.map

Что касается вашего образца, ваш файл карты может быть заполнен такими вещами, как:

eastlocation1        mainlocation1
eastlocation2        mainlocation2
eastlocation3        mainlocation3
...

Я назвал их 'восточными' и 'основнымиРазличать четко.Эти примеры должны быть URL-адресами.

Сделайте то же самое для запада:

RewriteMap mapmaintowest \
  dbm:/web/htdocs/yoursite/rewriterules/mapmaintowest.map

В этом файле:

westlocation1        mainlocation4
westlocation2        mainlocation5
westlocation3        mainlocation6
...

Затем перейдем к сложной части.:

# This cond put any non-empty string into "%1" (= parenthesis + first cond):
RewriteCond %{QUERY_STRING} (.+)
# The following rule doesn't touch the URL, but 
# will try to search into the map file and
# create fill an environment variable called MAINTOEAST with the
# string found and if not found, assign MAINTOEAST to "notfound"
RewriteRule . - [QSA,E=MAINTOEAST:${mapmaintoeast:%1|notfound}]

# if MAINTOEAST not empty and different from "notfound":
RewriteCond %{ENV:MAINTOEAST} !^$
RewriteCond %{ENV:MAINTOEAST} !(notfound)
# ok found => redirect to east:
RewriteRule (.*) http://east.example.com$1 [QSA,R=301,L]

# Now do the same with west (no comments needed (see previous)):
RewriteCond %{QUERY_STRING} (.+)
RewriteRule . - [QSA,E=MAINTOWEST:${mapmaintowest:%1|notfound}]
RewriteCond %{ENV:MAINTOWEST} !^$
RewriteCond %{ENV:MAINTOWEST} !(notfound)
RewriteRule (.*) http://west.example.com$1 [QSA,R=301,L]

Это должно работать.Я надеюсь, что дал вам достаточно подсказок, чтобы закончить работу;) Если вам не хватает подсказок ...

Два совета:


Пожалуйста, попробуйте использовать *Директива 1025 *: она помогает вам отследить такие проблемы:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

Мой любимый инструмент для проверки регулярных выражений:

http://www.quanetic.com/Regex (не забудьтевыбрать ereg (POSIX) вместо preg (PCRE)!)

0 голосов
/ 29 ноября 2011
RewriteEngine On
# If domain name is www.example.com or domain name is example.com
RewriteCond %{HTTP_HOST} ^(www\.)?example.com$ [NC]
# And "somelocation" (in the east) is in the URL, 
# Then Rewrite(Redirect) URL to http://east.example.com/.../somelocation/.../somepage
RewriteRule ^(.*somelocation.*)$ http://east.example.com/$1 [R,L]

Тебе нужно сделать то же самое для запада. Обратите внимание, что если имя домена www.example.com или example.com, оно не может быть east.example.com или west.example.com

...