Domanda

Ho un sito con una serie di vecchie pagine .html e .php che sono state messe in un CMS.

Attualmente nel file .htaccess ci sono circa 30 reindirizzamenti mod_alias nel seguente modulo:

redirect 301 /oldpage1.html http://www.example.com/newpage1.php
redirect 301 /oldpage2.php http://www.example.com/newpage2.php
redirect 301 /oldpage3.php http://www.example.com/newpage3.php

Ma vogliamo usare mod_rewrite per avere bei URL nei nostri CM, che prenderà la forma http://www.example.com/pagename.php, quindi anche quanto segue:

RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1

Al momento vengono applicati entrambi insieme, il che si traduce in:

http://www.example.com/newpage1.php?page=oldpage1.html

Come posso applicare la regola di riscrittura solo quando non è stata fatta alcuna corrispondenza dalle istruzioni di reindirizzamento 301 mod_alias, in modo che si verifichi quanto segue:

http://www.example.com/oldpage1.html -> reindirizza a ->http://www.example.com/newpage1.php -> che è trattato come ->http://www.example.com/index.php?page=/newpage1.php

Qualche suggerimento sarebbe molto apprezzato? Grazie.

È stato utile?

Soluzione

Ho trovato la risposta in un file Grande spiegazione di mod_rewrite e mod_alias

Il problema è che mod_rewrite si verifica sempre prima di mod_alias, indipendentemente dall'ordine effettuato in .htaccess. Questo è il contrario dell'ordine richiesto per questa situazione.

Il trucco è usare RewriteRule [R=301] invece di redirect 301, e quindi usa mod_rewrite per tutto invece di mescolarlo con mod_alias.

La soluzione completa è la seguente:

RewriteEngine on
RewriteBase /

RewriteRule ^oldpage1.html /newpage1.php [R=301,L]
RewriteRule ^oldpage2.php /newpage2.php [R=301,L]
RewriteRule ^oldpage3.php /newpage3.php [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?page=$1
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top