2016-10-24 4 views
3

Ich versuche, eine alte Site in eine neue Site zu migrieren, die mit concrete5 erstellt wurde. Die alte Seite benutzt Query Strings, von denen ich in concrete5 nicht umleiten kann.Umleiten von URLs mit Abfragezeichenfolgen in .htaccess

  1. Es gibt mehrere Kategorien, wie kann ich nur den Abfrageteil umleiten?

    • Alte URL: example.com/portfolio/category?cat=hifi
    • Neue URL: example.com/projecten/hifi
  2. Weitere habe ich URLs mit einer anderen Abfrage auch benötigen Umleitungen:

    • Alte URL: example.com/portfolio/post.php?s=pagename-xxx-xxx
    • New URL: example.com/projecten/pagename-xxx-xxx

Hilfe sehr geschätzt!

+0

Was hast du bisher versucht? – darrylyeo

Antwort

1

Sie müssen mod_rewrite verwenden und eine Bedingung (RewriteCond), die das QUERY_STRING Server-Variable übereinstimmt gegen.

Versuchen Sie Folgendes in Ihrem Stamm .htaccess Datei über alle vorhandenen mod_rewrite-Anweisungen.

RewriteEngine On 

# PART 1 : Redirect old category URLs 
RewriteCond %{QUERY_STRING} ^cat=(\w+) 
RewriteRule ^portfolio/category$ /projecten/%1? [R=302,L] 

# PART 2 : Redirect other old URLs 
RewriteCond %{QUERY_STRING} ^s=(pagename-\w{3}-\w{3}) 
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L] 

Dies setzt voraus, dass die in xxxpagename-xxx-xxx sind 3 literal Wort-Zeichen (dh. a-z, A-Z, 0-9 oder _).

UPDATE # 1: Die? auf der RewriteRule Substitution nachlauf ist notwendig, um die Abfragezeichenfolge von dem Ziel zu entfernen. Oder verwenden Sie das Flag QSD auf Apache 2.4+.

Ändern Sie die 302 (vorübergehende) Umleitung zu 301 (permanent), wenn Sie sicher sind, dass es OK funktioniert. 301 Redirects werden vom Browser zwischengespeichert, was das Testen problematisch machen kann.

UPDATE # 2: In Bezug auf die aktualisierte URL in "Teil 2", versuchen Sie Folgendes statt:

# PART 2 : Redirect other old URLs 
# To essentially remove the date prefix, eg. "YYYY-MM-DD-" 
RewriteCond %{QUERY_STRING} ^s=/d{4}-/d{2}-/d{2}-(.+) 
RewriteRule ^portfolio/post\.php$ /projecten/%1? [R=302,L] 

^s=[0-9{4}]+-(.+?)/?[0-9{2}]+-(.+?)/?[0-9{2}]+-(.+?)/?(.*)$

Dies ist ein bisschen wie ein Mash, aber sieht auch zu komplex für das, was Sie erreichen wollen? Zum Beispiel, warum müssen Sie einen optionalen Schrägstrich (dh /?) übereinstimmen? Ihre Beispiel-URL enthält keine Schrägstriche?

Ein Regex-Muster wie [0-9{4}]+ tut nicht, was Sie denken, dass es tut.Dies würde 1 oder mehrmals mit den Zeichen {} übereinstimmen. Was Sie scheinbar zu tun versuchen, ist genau 4 Stellen zu entsprechen. z.B. [0-9]{4} (das ist das gleiche wie /d{4}, mit einer Kurzzeichen-Klasse).

+0

Der erste Teil funktioniert, aber der zweite Teil ist nicht. Ich habe den richtigen URL nicht erklärt. Ich werde darunter posten. – buurvrouw

+0

Ich habe meine Antwort in Bezug auf Ihre überarbeitete URL-Struktur aktualisiert. Ich habe auch das '?' Für die Ersetzung hinzugefügt, die ich früher verpasst habe (ich sehe, dass Sie stattdessen das QSD-Flag verwendet haben - das ist eine Alternative für Apache 2.4+). – MrWhite

+1

Ja, ich habe versucht, einigen Beispielen zu folgen, die ich gefunden habe, um Zahlen und Bindestriche zu entfernen. Aber offensichtlich wusste ich nicht, was ich tat ... Dein Nwe Code funktioniert perfekt, danke eine Million !!! – buurvrouw

Verwandte Themen