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?

È stato utile?

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:

    .
  1. In contesto per dir (.htaccess), il prefisso per-dir viene spogliato, quindi non è possibile avviare il modello RewriteRule con ^/.

  2. È necessario utilizzare RewriteCond in modo che corrisponda alla stringa di query.

  3. 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ò.

  4. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top