Правила Apache Rewrite мешают друг другу?

Правила Apache Rewrite мешают друг другу?

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

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 те, у которых в URL-адресе есть "/guide", на те, у которых его нет, без фактического перемещения файлов на сервер.

Я попробовал добавить это правило:

RewriteCond %{REQUEST_URI} ^/guide/(manhattan|queens|westchester|new-jersey|bronx|brooklyn)-apartments/.*$
RewriteRule ^guide/(.*)$ http://www.domain.com/$1 [R=301,L]

... но это полностью нарушает мое первое правило.

Есть мысли о том, что я делаю неправильно? Пожалуйста, дайте мне знать, если вам нужно узнать что-то еще от меня, чтобы помочь мне с этой проблемой.


EDIT: По предложению Мэтьюса я изменил свои правила следующим образом (отражая желаемое мной поведение):

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]похоже, не имеет никакого эффекта.

решение1

Я не уверен, почему вы используете 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 ниже показался мне избыточным, поэтому я его исключил. Если вы действительно пытаетесь переписать все в каталоге guide, вам придется включить его обратно.

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]

решение2

Я не смог найти обходного пути для этого бесконечного цикла, поэтому переместил файлы в новую папку под названием «neighborhoods» и использовал следующие правила:

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.

Связанный контент