Utilizzo di mod_rewrite e mod_alias (reindirizzare 301) insieme in .htaccess?
-
27-10-2019 - |
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.
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