2016-08-10 4 views
2

ich sowohl Rewrite versuchen und leiten Sie diese URL:Htaccess - Rewrite und Redirect-URL mit PHP GET Variable

https://www.domain.com/video-lessons-page.php?item=stocks 

auf diese URL zu gehen:

https://www.domain.com/stocks-video-lessons 

Hier den Code I‘ m arbeitet gerade mit:

RewriteCond %{QUERY_STRING} ^item=([^&]+) 
RewriteRule ^/?video-lessons-page\.php$ https://www.domain.com/%1-video-lessons? [R=301,L] 
RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [NC,L] 

Leider mit dem oben genannten Code habe ich Probleme. Die ersten beiden Zeilen funktionieren von selbst, indem sie /video-lessons-page.php?item=stocks zu /stocks-video-lessons umleiten.

Und die dritte Zeile funktioniert auch gut von selbst, wo die /stocks-video-lessons URL funktioniert ordnungsgemäß mit der Variable GET und der Code der Seite.

Aber sie zusammenzusetzen ist problematisch. Im Moment bekomme ich Fehler wie "www.domain.com hat dich zu oft umgeleitet." usw. Irgendwelche Ideen?

Antwort

1

Nur um zu klären, vermutlich haben Sie schon alle Ihre internen URLs in Form /stocks-video-lessons und der Grund für die externe Umleitung geändert sind, weil der „hässlich“ URLs bereits indiziert wurde und extern verlinkter?


Wie Sie gefunden haben, Sie werden immer eine Umleitung Schleife, weil diese beiden Regeln Konflikt und es wird ständig umgeleitet/von einem zum anderen neu zu schreiben.

Sie müssen umleiten, wenn nur die anfängliche Anforderung die URL enthält /video-lessons-page.php, nicht die umgeschriebene URL (das ist das, was hier geschieht). Sie können die anfängliche Anforderung überprüfen, indem Sie die Servervariable THE_REQUEST überprüfen (die die vollständige HTTP-Anforderung enthält, wie sie vom Browser gesendet wird).

Etwas wie folgt aus:

RewriteCond %{THE_REQUEST} /video-lessons-page\.php?item=(\w+) 
RewriteRule ^video-lessons-page\.php$ https://www.example.com/%1-video-lessons? [R=301,L] 

RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [L] 

Hinweis müssen Sie Ihren Browser-Cache vor dem Test löschen, da 301 (permanent) Umleitungen wird vom Browser zwischengespeichert werden. (Oft einfacher mit 302 Redirects zu testen.) Verwenden Sie nur das NC Flag, wenn Sie speziell brauchen eine Groß-und Kleinschreibung nicht übereinstimmen.

UPDATE: Ich habe die Regex auf dem Query-String-Parameterwert von ([^&]+) an das etwas restriktivere geändert (\w+). \w ist die Kurzzeichen-Zeichenklasse für ein Wortzeichen (was natürlich & und entscheidende Leerzeichen ausschließt). Da THE_REQUEST einen String der Form enthält:

GET /video-lessons-page.php?item=stocks HTTP/1.1 

... müssen wir den Raum erfassen vor stoppen. Das vorherige Muster ([^&]+) hätte alles bis zum Ende der Zeichenkette erfasst, dh. "Bestände HTTP/1.1". So hätte ich erwartet ein 404, da eine ungültige Umleitung aufgetreten wäre, aber die interne Umschreibung wäre fehlgeschlagen. (?)

+0

Ja die hässlichen URLs bereits indiziert wurde. Das alles macht wirklich viel Sinn, danke für Ihre Hilfe. Aus irgendeinem Grund, obwohl mit dem Code, den Sie haben, die tatsächliche Umleitung geschieht nicht von '/video-lesson-page.php? Item = stocks 'zu'/stocks-video-lektionen'. Es bleibt nur auf der hässlichen URL. Ich aktualisiere meinen Cache jedes Mal. – user1610904

+0

Ah ok, ja, in der Tat ... die Regex auf dem Abfrage-String-Parameter Wert muss aktualisiert werden, wenn verwendet, um mit 'THE_REQUEST' übereinzustimmen - Ich habe meine Antwort aktualisiert. Allerdings hätte ich eher eine 404 erwartet, als einen Fehler bei _redirect_? – MrWhite

0

Dank der Anleitung von w3dk, habe ich es herausgefunden, nur eine QUERY_STRING benötigt, um neben der THE_REQUEST zu bleiben.

Schlusscode:

RewriteCond %{THE_REQUEST} video-lessons-page\.php 
RewriteCond %{QUERY_STRING} ^item=([^&]+) 
RewriteRule ^video-lessons-page\.php$ https://www.example.com/%1-video-lessons? [R=301,L] 
RewriteRule ^(stocks|finance|accounting)-video-lessons$ video-lessons-page.php?item=$1 [L]