Reindirizza le pagine dal vecchio al nuovo sito, uno per uno
Domanda
Sto cercando di reindirizzare le pagine di diversi vecchi domini su un nuovo dominio da una pagina all'altra, ovvero:
pagina 1: http://www.example.org/default.asp? id = 1 reindirizza a http://www.example2.org/newpage.html pagina 2: http://www.example2.org/default.asp?id=2 reindirizza a http://www.example.org/contact.html
... e così via. Ogni vecchia pagina verrà reindirizzata a una nuova pagina specifica.
Ho provato a scrivere qualcosa in .htaccess seguendo le linee di
Redirect 301 http://www.example.org/default.asp?id=1 h-tp://www.example.org/newpage.html
Redirect 301 http://www.example2.org/default.asp?id=2 h-tp://www.example.org/contact.html
Ma finora niente fortuna. mod_alias è abilitato ...
Ho anche provato a usare RewriteCond e RewriteRule in questo modo:
RewriteCond %{HTTP_HOST} example.org
RewriteRule default.asp?id=1 http://www.example.org/newpage.html [NC,L,R=301]
...
In altre parole: voglio fare un reindirizzamento pagina per pagina da ID-based a alias-based insieme a una fusione di tre siti / domini in un sito.
Spero che ci sia una soluzione utile. Grazie in anticipo!
Soluzione
Il Redirect
la direttiva funziona solo con il percorso URL ma non l'host o la query dell'URL.
Ma è possibile con mod_rewrite :
RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} =id=1
RewriteRule ^default\.asp$ http://www.example.org/newpage.html [NC,L,R=301]
E come già detto nei commenti, puoi usare una riscrivere mappa per la mappatura da ID ad alias:
1 foo-page
2 bar-page
3 baz-page
…
La dichiarazione RewriteMap
(qui un semplice file di testo semplice):
RewriteMap id-to-alias txt:/absolute/file/system/path/to/id-to-alias.txt
E infine l'applicazione:
RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3}&%1%4 ^([^&]+)&(.*)
RewriteRule ^default\.asp$ http://www.example.org/%1.html?%2 [NC,L,R=301]
Ciò dovrebbe anche conservare la query rimanente. Se non lo vuoi:
RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3} .+
RewriteRule ^default\.asp$ http://www.example.org/%0.html? [NC,L,R=301]
Altri suggerimenti
Una buona alternativa a mod_rewrite è usare qualunque linguaggio tu sia a tuo agio e mettere la logica nel tuo script. Punta tutti gli URL che desideri reindirizzare al tuo semplice front controller.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
E poi, in redirect.php:
<?php
if ( Una buona alternativa a mod_rewrite è usare qualunque linguaggio tu sia a tuo agio e mettere la logica nel tuo script. Punta tutti gli URL che desideri reindirizzare al tuo semplice front controller.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
E poi, in redirect.php:
<*>SERVER['SCRIPT_URL'] == '/default.asp'){
$map = array(
1 => '/newpage.html',
2 => '/contact.html'
);
if (isset( Una buona alternativa a mod_rewrite è usare qualunque linguaggio tu sia a tuo agio e mettere la logica nel tuo script. Punta tutti gli URL che desideri reindirizzare al tuo semplice front controller.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
E poi, in redirect.php:
<*>GET['id'])){
$id = Una buona alternativa a mod_rewrite è usare qualunque linguaggio tu sia a tuo agio e mettere la logica nel tuo script. Punta tutti gli URL che desideri reindirizzare al tuo semplice front controller.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
E poi, in redirect.php:
<*>GET['id'];
if (isset($map[$id])){
header('HTTP/1.1 301 Moved Permanently', true, 301);
header('Location: http://'. Una buona alternativa a mod_rewrite è usare qualunque linguaggio tu sia a tuo agio e mettere la logica nel tuo script. Punta tutti gli URL che desideri reindirizzare al tuo semplice front controller.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
E poi, in redirect.php:
<*>SERVER['HTTP_HOST'].$map[$id]);
exit;
}
}
}
// ... handle another/path/to_some_file.ext here, or other domains, or whatever ...
// If we get here, it's an invalid URL
header('HTTP/1.1 404 Not Found', true, 404);
echo '<h1>HTTP/1.1 404 Not Found</h1>';
echo '<p>The page you requested could not be found.</p>';
exit;
?>
Aggiungo solo qualche informazione in più
Le direttive di reindirizzamento del PO sono probabilmente nel formato sbagliato - dal relativo documento apache pagina :
La direttiva Redirect mappa un vecchio URL in uno nuovo chiedendo al cliente di recuperare la risorsa nel nuovo posizione.
Il vecchio percorso URL fa distinzione tra maiuscole e minuscole (% -decodificato) percorso che inizia con a tagliare . Un percorso relativo non lo è permesso. Il nuovo URL dovrebbe essere un URL assoluto che inizia con uno schema e nome host. Esempio:
Redirect /service http://foo2.bar.com/service
In modo da renderlo possibile:
Redirect 301 /default.asp?id=1 http://www.example.org/newpage.html
Spero che aiuti
In httpd.conf:
RedirectPermananent URL1 URL2