Verstoßen Apache-Rewrite-Regeln gegeneinander?

Verstoßen Apache-Rewrite-Regeln gegeneinander?

Ich habe diese Regel:

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]

Das funktioniert von sich aus großartig. Im Wesentlichen habe ich eine Reihe von Verzeichnissen, die eine Reihe von Dateien enthalten, die ich im Ordner „/guide“ behalten möchte, die aber aus SEO-Gründen im Webstammverzeichnis angezeigt werden sollen.

Diese Regel funktioniert, aber leider funktionieren auch die ursprünglichen URLs immer noch (mit „/guide“). Ich möchte die URLs mit „/guide“ in der URL mit 301 auf die ohne umleiten, ohne die Dateien tatsächlich auf den Server zu verschieben.

Ich habe versucht, diese Regel hinzuzufügen:

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

... aber das verstößt völlig gegen meine erste Regel.

Irgendwelche Ideen, was ich falsch machen könnte? Bitte lassen Sie mich wissen, wenn Sie noch etwas von mir wissen müssen, um mir bei diesem Problem zu helfen.


BEARBEITEN: Gemäß Matthews Vorschlag habe ich meine Regeln wie folgt geändert (um das gewünschte Verhalten widerzuspiegeln):

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]

Die Regeln verstoßen jedoch immer noch gegeneinander, diesmal nur auf eine andere Art und Weise. Beim Versuch, auf eine Seite zuzugreifen, die der zweiten Regel unterliegt (und auf die die erste Regel korrekt weiterleitet), erhalte ich in Safari diesen Fehler:

Beim Öffnen von „“ traten zu viele Weiterleitungen auf.http://www.domain.com/manhattan-apartments/east-village-chinatown-lower-east-side-apartments.php". Dies kann passieren, wenn Sie eine Seite öffnen, die auf eine andere Seite umgeleitet wird, die wiederum auf die ursprüngliche Seite umgeleitet wird.

Irgendwelche Vorschläge?


WEITERE BEARBEITUNG:

Es scheint, dass diese Regeln sich selbst wiederholen. Hier ist ein Auszug aus den Umschreibprotokollen:

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]

Ich glaube, das Problem liegt im mittleren Abschnitt (den ich durch Zeilenumbrüche getrennt habe). Es scheint, dass Apache, nachdem es den lokalen Pfad neu geschrieben hat (mit /home/neezer/...), eine weitere Anfrage mit entferntem Dokumentstamm ausgibt, die natürlich enthält /guide, die dann die erste Regel einfiltert, die schließlich die zweite Regel einfiltert, und so weiter bis ins Unendliche.

Wie sage ich ihm, dass es nach der ersten Regel einfach STOPPEN soll? Das Hinzufügen [L]scheint keine Wirkung zu haben.

Antwort1

Ich bin mir nicht sicher, warum Sie die RewriteConds verwenden. Mir scheint, Sie könnten alles direkt in die RewriteRules einfügen. Es sieht so aus, als ob Ihr Problem daher rührt, dass Sie alles umleiten, was mit dem Request_URI übereinstimmt. Wenn Sie den Abgleich in der RewriteRule selbst vornehmen, stimmt die neu geschriebene Regel nicht mehr mit der nächsten Regel überein.

Sie können beispielsweise Folgendes versuchen:

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 

Sie müssen diese wahrscheinlich optimieren, da ich nicht alles verstehe, was Sie erreichen möchten. Beispielsweise schien mir das unten stehende RewriteCond überflüssig, also habe ich es weggelassen. Wenn Sie wirklich versuchen, alles im Verzeichnis „guide“ neu zu schreiben, müssen Sie es wieder einbauen.

RewriteCond %{REQUEST_URI} !^/guide/(.*)$

BEARBEITEN
Nach einigen schnellen Tests auf meinem Server konnte ich diese Regeln zum Laufen bringen, allerdings nicht in einem Verzeichniskontext (d. h. nicht in einer .htaccess-Datei oder innerhalb einer <Directory></Directory>).

Ich habe das nicht getestet, aber Sie können das Problem möglicherweise umgehen, indem Sie mit der zweiten Regel eine Umgebungsvariable festlegen und diese dann bei der ersten testen.

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]

Antwort2

Ich konnte keinen Weg finden, diese Endlosschleife zu umgehen, also habe ich die Dateien in einen neuen Ordner mit dem Namen „Neighborhoods“ verschoben und diese Regeln verwendet:

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]

Nicht gerade ideal, da ich jetzt zwei Ordner habe (ich habe andere Dateien, die ich außerhalb des Handbuchs bereitstelle), aber es geht auf meine SEO-Bedenken ein.

verwandte Informationen