Einfache mod_rewrite-RewriteRule für chaotische Legacy-URLs
-
12-11-2019 - |
Frage
Starten einer neuen Website für einen neuen Kunden.Ihre alte Website enthält ungefähr 50 Produkte und leider stimmen die alten Produktnamen nicht mit dem neuen URL-Muster überein
Alte URL-Beispiele:
example.com/products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription
example.com/products.aspx?category=Foo&product=ProductNameDescription&var1=1293.123
example.com/products.aspx?category=Bar&product=ProductCategoryProdNameRandomNumbers
(Die alten URLs treffen manchmal mehr als 150 Zeichen.)
Neue URL's:
example.com/products/category/actual-product-name
Es gibt kein festes, erkennbares Muster, um vom alten zum neuen Produktnamen zu gelangen.Es gibt für die Kategorie.
Ich habe einfache mod_alias-Weiterleitungen ausprobiert, verstehe aber, dass ich stattdessen eine RewriteRule benötige.Aber ich habe Probleme.Alles was ich brauche ist eine 1-zu-1-Weiterleitung für jede dieser 50 URLs.Ich dachte, ich könnte so etwas tun:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Aber das funktioniert nicht.Ich weiß, das sollte einfach sein, aber ich stecke fest.Irgendwelche Ideen?
Lösung
Verwenden Sie das folgende Muster für den Rest Ihrer Weiterleitungs-URLs.Beachten Sie, dass Sie Sonderzeichen, z. ?
, .
und Raum durch Hinzufügen eines
\
vor ihnen
RewriteEngine on
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /products\.aspx\?category=Foo&product=SuperLongNoBreakProductNameIDDescription [NC]
RewriteRule ^ /products/category/new-product-name/ [R=301,NC]
Andere Tipps
Werfen Sie einen Blick auf die RewriteMap
richtlinie von mod_rewrite
.
Sie können in einer Textdatei etwas wie angeben:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
Und in deinem httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Tipp:Wenn es sich um eine permanente Weiterleitung handelt, stellen Sie sicher, dass Sie eine entsprechende Weiterleitung festlegen Cache-Control
und Expires
header, um Browser anzuweisen, den 301 zwischenzuspeichern.
Sie können so etwas ausprobieren:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
Notes:
In per-dir (.htaccess) Kontext, das Pro-dir-Präfix wird entfernt, sodass Sie das nicht starten können
RewriteRule
muster mit^/
.Sie müssen verwenden
RewriteCond
mit der Abfragezeichenfolge übereinstimmen.Wie in einer anderen Antwort angegeben, a
RewriteMap
die Lösung könnte für diese Situation geeignet sein, wenn Sie Zugriff auf httpd haben.conf / die vhost-Definition für diese Site.Ich bin mir jedoch nicht sicher, wie das mit Abfragezeichenfolgen funktioniert.Für so etwas könnte es eine bessere Lösung sein, alle diese URLs in ein serverseitiges Skript umzuschreiben und das Skript zu verwenden, um die HTTP-Umleitung für jede URL durchzuführen.