Semplice mod_rewrite RewriteRule per URL legacy disordinati
-
12-11-2019 - |
Domanda
Lancio di un nuovo sito web per un nuovo cliente.Il loro vecchio sito ha circa 50 prodotti e sfortunatamente i vecchi nomi dei prodotti non corrispondono al nuovo modello URL
Vecchi esempi di URL:
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
(I vecchi URL a volte raggiungono più di 150 caratteri.)
Nuovi URL:
example.com/products/category/actual-product-name
Non esiste uno schema definito e riconoscibile per passare dal vecchio nome del prodotto a quello nuovo.C'è per la categoria.
Ho provato semplici reindirizzamenti mod_alias, ma capisco che invece ho bisogno di una RewriteRule.Ma ho dei problemi.Tutto ciò di cui ho bisogno è un reindirizzamento 1 a 1 per ciascuno di questi 50 URL.Pensavo di poter fare qualcosa del tipo:
RewriteRule ^/products.aspx?category=Foo&product=ProductName
/products/category/new-product-name/ [R=301,NC]
Ma non funziona.So che dovrebbe essere semplice, ma sono bloccato.Qualche idea?
Soluzione
Utilizzare il modello qui sotto per il resto degli URL di reindirizzamento.Nota che si sfugge a caratteri speciali ad es.?
, .
e Space aggiungendo un
\
davanti a loro
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]
. Altri suggerimenti
Dai un'occhiata a RewriteMap
direttiva di mod_rewrite
.
Puoi specificare in un file di testo qualcosa come:
products.aspx?category=Foo&product=SuperLongNoBreakProductNameIDDescription /products/category/new-product-name
E nel tuo httpd.conf
RewriteMap productmap /path/to/map/file.txt
RewriteRule ^(.*) ${productmap:$1} [R=301,NC]
Mancia:Se desideri un reindirizzamento permanente, assicurati di impostare un indirizzo appropriato Cache-Control
E Expires
intestazione per indicare ai browser di memorizzare nella cache 301.
Puoi provare qualcosa del genere:
RewriteEngine On
RewriteCond %{QUERY_STRING} ^category=Foo&product=ProductName$
RewriteRule ^products\.aspx$ /products/category/new-product-name/? [R=301,L]
.
Note:
- .
-
In contesto per dir (.htaccess), il prefisso per-dir viene spogliato, quindi non è possibile avviare il modello
RewriteRule
con^/
. -
È necessario utilizzare
RewriteCond
in modo che corrisponda alla stringa di query. -
Come indicato in un'altra risposta, una soluzione
RewriteMap
potrebbe essere adatta a questa situazione, se si ha accesso a httpd.conf / la definizione Vhost per questo sito.Non sono sicuro di come funziona con le corde della query però. -
Per qualcosa di simile, potrebbe essere una soluzione migliore per riscrivere tutti questi URL su uno script laterale server e utilizzare lo script per eseguire il reindirizzamento HTTP per ciascun URL.