Redireccionar páginas del sitio antiguo al nuevo, una por una
Pregunta
Estoy tratando de redirigir páginas de varios dominios antiguos en un dominio nuevo de una página a otra, es decir:
página 1: http://www.example.org/default.asp? id = 1 redirige a http://www.example2.org/newpage.html página 2: http://www.example2.org/default.asp?id=2 redirige a http://www.example.org/contact.html
... y así sucesivamente. Cada página anterior redirigirá a una página nueva específica.
He intentado escribir algo en .htaccess siguiendo las líneas de
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
Pero no hubo suerte hasta ahora. mod_alias está habilitado ...
También intenté usar RewriteCond y RewriteRule de esta manera:
RewriteCond %{HTTP_HOST} example.org
RewriteRule default.asp?id=1 http://www.example.org/newpage.html [NC,L,R=301]
...
En otras palabras: quiero hacer un redireccionamiento página por página de id. a alias junto con una combinación de tres sitios / dominios en un sitio.
Espero que haya una solución útil. Gracias de antemano!
Solución
El Redirect
la directiva solo funciona con la ruta URL pero no el host o consulta de la URL.
Pero es posible 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]
Y como ya se dijo en los comentarios, puede usar una reescribir map para la asignación de ID a alias:
1 foo-page
2 bar-page
3 baz-page
…
La declaración RewriteMap
(aquí un simple archivo de texto sin formato):
RewriteMap id-to-alias txt:/absolute/file/system/path/to/id-to-alias.txt
Y finalmente la aplicación:
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]
Eso también debería preservar la consulta restante. Si no quieres eso:
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]
Otros consejos
Una buena alternativa a mod_rewrite es usar el idioma con el que se sienta más cómodo y poner la lógica en su script. Apunte todas las URL que desea redirigir a su controlador frontal simple.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
Y luego, en redirect.php:
<?php
if ( Una buena alternativa a mod_rewrite es usar el idioma con el que se sienta más cómodo y poner la lógica en su script. Apunte todas las URL que desea redirigir a su controlador frontal simple.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
Y luego, en redirect.php:
<*>SERVER['SCRIPT_URL'] == '/default.asp'){
$map = array(
1 => '/newpage.html',
2 => '/contact.html'
);
if (isset( Una buena alternativa a mod_rewrite es usar el idioma con el que se sienta más cómodo y poner la lógica en su script. Apunte todas las URL que desea redirigir a su controlador frontal simple.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
Y luego, en redirect.php:
<*>GET['id'])){
$id = Una buena alternativa a mod_rewrite es usar el idioma con el que se sienta más cómodo y poner la lógica en su script. Apunte todas las URL que desea redirigir a su controlador frontal simple.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
Y luego, en redirect.php:
<*>GET['id'];
if (isset($map[$id])){
header('HTTP/1.1 301 Moved Permanently', true, 301);
header('Location: http://'. Una buena alternativa a mod_rewrite es usar el idioma con el que se sienta más cómodo y poner la lógica en su script. Apunte todas las URL que desea redirigir a su controlador frontal simple.
RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]
Y luego, en 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;
?>
Simplemente agregue más información
Las directivas de redireccionamiento del OP probablemente estén en un formato incorrecto - del documento relevante de apache página :
La directiva Redirect asigna una URL antigua en uno nuevo pidiéndole al cliente que recuperar el recurso en el nuevo ubicación.
La ruta URL anterior distingue entre mayúsculas y minúsculas (% -decoded) ruta que comienza con un barra oblicua . Una ruta relativa no es permitido. La nueva URL debe ser un URL absoluta que comienza con un esquema y nombre de host. Ejemplo:
Redirect /service http://foo2.bar.com/service
Entonces eso lo haría:
Redirect 301 /default.asp?id=1 http://www.example.org/newpage.html
Espero que ayude
En httpd.conf:
RedirectPermananent URL1 URL2