
У меня есть такое правило:
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.