У меня такое правило:
RewriteCond %{REQUEST_URI} ^/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteCond %{REQUEST_URI} !^/guide/(.*)$
RewriteRule ^(.*)$ /home/neezer/public-html/domain.com/guide/$1 [L]
Что отлично работает само по себе. По сути, у меня есть группа каталогов, в которых есть куча файлов, которые я хочу сохранить в папке «/ guide», но я хочу, чтобы они отображались в корневом веб-каталоге по причинам SEO.
Это правило работает, но, к сожалению, исходный URL-адрес тоже работает (с «/ guide»). Я хочу 301 перенаправить те, у кого есть «/ guide» в URL, на те, у кого нет, без фактического перемещения файлов на сервере.
Я пробовал добавить это правило:
RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L]
... но это полностью нарушает мое первое правило.
Есть мысли о том, что я делаю неправильно? Пожалуйста, дайте мне знать, если вам нужно что-нибудь узнать от меня, чтобы помочь мне с этой проблемой.
РЕДАКТИРОВАТЬ: Согласно предложению Мэтьюза, я изменил свои правила на это (отражая поведение, которое я хочу):
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$1-apartments/$2 [L]
Однако правила по-прежнему нарушают друг друга, только на этот раз по-другому. Попытка получить доступ к странице, управляемой вторым правилом (и тем, на что правильно перенаправляет первое правило) дает мне эту ошибку в Safari:
Слишком много переадресации при попытке открыть "http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php». Это может произойти, если вы открываете страницу, которая перенаправляется на открытие другой страницы, которая затем перенаправляется, чтобы открыть исходную страницу.
Какие-либо предложения?
ДАЛЬНЕЙШЕЕ РЕДАКТИРОВАНИЕ:
Кажется, что эти правила зацикливаются сами на себе. Вот выдержка из журналов перезаписи:
init rewrite engine with requested uri /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> '/home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] strip document_root prefix: /home/neezer/public-html/domain.com/guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php -> /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] internal redirect with /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [INTERNAL REDIRECT]
init rewrite engine with requested uri /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
pass through /guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] rewrite 'guide/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php' -> 'http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php'
[perdir /home/neezer/public-html/domain.com/] explicitly forcing redirect with http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php
[perdir /home/neezer/public-html/domain.com/] escaping http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php for redirect
[perdir /home/neezer/public-html/domain.com/] redirect to http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php [REDIRECT/301]
Я считаю, что проблема кроется в средней части (которую я разделил переносом строки). Похоже, что после того, как Apache переписывает локальный путь (используя /home/neezer/...
), он выдает другой запрос с удаленным корнем документа, который, конечно, включает /guide
, который затем фильтруется в первом правиле, которое в конечном итоге фильтруется во втором правиле, и взад и вперед до бесконечности.
Как мне сказать, что он просто ОСТАНОВИТСЯ после первого правила? Добавление [L]
похоже, не действует.
Я не уверен, почему вы используете RewriteConds. Мне кажется, что вы могли бы поместить все прямо в RewriteRules. Похоже, ваша проблема связана с тем, что вы перенаправляете все, что соответствует Request_URI. Если вы выполните сопоставление в самом RewriteRule, перезаписанное правило больше не будет соответствовать следующему правилу.
Вы можете попробовать что-то вроде:
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/guide/$2
Возможно, вам придется их настроить, потому что я не понимаю всего, что вы пытаетесь достичь. Например, RewriteCond ниже казался лишним, поэтому я его не упомянул. Если вы действительно пытаетесь переписать все, что находится в каталоге руководства, вам придется включить его обратно.
RewriteCond %{REQUEST_URI} !^/guide/(.*)$
РЕДАКТИРОВАТЬ
После быстрого тестирования на моем сервере я смог заставить эти правила работать, но не в контексте каждого каталога (т.е. не в .htaccess или внутри <Directory></Directory>
).
Я не тестировал это, но вы могли бы обойти это, установив переменную окружения с помощью второго правила, а затем протестировав ее по первому.
RewriteCond %{ENV:REDIRECT} !^NO$
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$2 [R=301]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ [E=REDIRECT:NO]
Я никак не мог найти этот бесконечный цикл, поэтому переместил файлы в новую папку под названием «окрестности» и использовал следующие правила:
RewriteRule ^guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ http://www.domain.com/$1-apartments/$2 [R=301,L]
RewriteRule ^(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/(.*)$ /home/neezer/public-html/domain.com/neighborhoods/$1-apartments/$2 [L]
Менее чем в идеале, потому что теперь у меня есть две папки (у меня есть другие файлы, которые я обслуживаю вне руководства), но это решает мои проблемы с SEO.