Mod_rewrite / RewriteMap una URL utilizando un script de búsqueda de base de datos
-
22-09-2019 - |
Pregunta
El Escenario
He reescrito por completo un viejo sitio de comercio electrónico ASP clásico existente a lo largo de PHP.
El diseño de la base de datos del sitio anterior tenía un montón de problemas que causan ID relacional que une problemático de filas de datos de productos a otras tablas en la base de datos.
Para evitar esto yo también rediseñó la base de datos, dando nuevos productos claves principales, mientras que todavía mantiene una columna en la tabla con los productos de edad PK.
El problema
El problema que tengo es cuando el sitio se relanza, necesito todos los enlaces del motor de búsqueda que se usa para apuntar a 'Product.asp? ProductID = 29' para buscar la base de datos, haga coincidir los productos viejo, PK y redirigir a los nuevos productos de PK es decir, 'products.php? ID = 53'.
Estoy buscando hacer esto con Mod_rewrite / RewriteMap, sin embargo, toda la documentación que puedo encontrar en línea no indica cómo hacer frente a la consulta de base de datos de secuencia de comandos PK.
Actualizar
He leído hasta más adelante sugerencia Ignacio Vazquez-Abrams en http: Programa de reescritura //httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap > externo, y parece ser correcta y la solución ideal.
Sin embargo, después de contactar con mi anfitrión, que no permiten ReWriteMap
en sus servidores.
He suministra la mía, pero de ninguna manera la solución mejor / correcta de lograr esto sin ReWriteMap
habilitado.
Solución 3
Después de descubrir RewriteMap
está deshabilitado de mi anfitrión, he llegado a mi propia solución simple uso de mod_rewrite
y 2x 301 redirecciones.
.htaccess
RewriteEngine on
RewriteRule ^Product(.*)\.asp SEO_Redirect.php [NC,R=301]
archivo SEO_Redirect.php
$ID = $_GET['ID'];
$query_rsNewID = "SELECT NewProductID FROM Products WHERE OldProductID = '$ID'";
$rsNewID = mysql_query($query_rsNewID, $Database);
$row_rsNewID = mysql_fetch_assoc($rsNewID);
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: Product.php?ID='.$row_rsNewID['NewProductID']);
Tenga en cuenta, este es un extracto simplificado de cada archivo, y no sería seguro contra la inyección de SQL.
Esperamos que Google y por igual aceptará conseguir 2x 301 redirecciones sin problemas.
Otros consejos
Su consulta:
SELECT
ID
FROM
thetable
WHERE
ProductID=?
A partir de ahí simplemente eco del valor de ID
y una nueva línea, y la salida estándar de color.
reglas de reescritura:
RewriteMap dbfixup prg:dbfixup.script
RewriteCond %{QUERY_STRING} ProductID=(\d+)
RewriteRule Product.asp Products.php?ID=${dbfixup:%1}
Se debe tener un nombre de variable obtener diferentes para el nuevo ID. De esa manera en su nuevo programa va a saber si coincide con el producto utilizando el identificador antiguo o el nuevo.
$old = isset($_GET['id']) && is_numeric($_GET['id']) && $_GET['id'] > 0 ? $_GET['id'] : 0;
$new = isset($_GET['new']) && is_numeric($_GET['new']) && $_GET['new'] > 0 ? $_GET['new'] : 0;
if ($old + $new > 0) {
$query = 'SELECT * FROM `ProductDetails` WHERE '.($old > 0 ? '`OrigPrdID`='.$old : '`PrdDetID`='.$new).' LIMIT 1;';
...