Назад | Перейти на главную страницу

Правила перезаписи Apache нарушают друг друга?

У меня такое правило:

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.