Mod_rewrite / RewriteMap une URL à l'aide d'un script de recherche de base de données
-
22-09-2019 - |
Question
Le scénario Je suis complètement réécrite un ancien site ASP de commerce électronique classique existant sur PHP.
La conception de base de données du site précédent avait beaucoup de problèmes d'identité relationnelle provoquant la liaison gênante de lignes de données produit à d'autres tables dans la base de données.
Pour contourner cela, j'a également repensé la base de données, ce qui donne des produits nouvelles clés primaires, tout en gardant une colonne dans la table avec les produits anciens PK.
Le problème Le problème, c'est lorsque le site est relancée, j'ai besoin tous les liens du moteur de recherche qui ont utilisé pour pointer vers « Product.asp? ProductID = 29 » pour rechercher la base de données, correspondent aux produits anciens PK, et redirigent aux produits nouveaux PK à-dire 'products.php? ID = 53'.
Je cherche à faire avec mod_rewrite / RewriteMap, cependant, tous les documents que je peux trouver en ligne ne précise pas comment traiter avec le script de base de données PK recherche.
Mise à jour
J'ai lu jusqu'à plus loin la suggestion de Ignacio Vazquez-Abrams http: //httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap > externe Programme Rewriting, et il semble être correct et la solution idéale.
Cependant, après avoir contacté mon hôte, ils ne permettent pas ReWriteMap
sur leurs serveurs.
J'ai fourni mon propre, mais certainement pas la meilleure / bonne solution d'y parvenir sans ReWriteMap
activée.
La solution 3
Après avoir découvert RewriteMap
est désactivé par mon hôte, je suis arrivé à ma propre solution simplement en utilisant mod_rewrite
et 2x 301 réoriente.
fichier .htaccess
RewriteEngine on
RewriteRule ^Product(.*)\.asp SEO_Redirect.php [NC,R=301]
fichier 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']);
Notez que ceci est un extrait simplifié de chaque fichier, et ne serait pas protégé contre l'injection SQL.
Espérons que Google et accepte aussi bien obtenir 2x 301 réoriente sans problème.
Autres conseils
Votre requête:
SELECT
ID
FROM
thetable
WHERE
ProductID=?
À partir de là écho juste la valeur de ID
et une nouvelle ligne, et flush stdout.
Réécrire les règles:
RewriteMap dbfixup prg:dbfixup.script
RewriteCond %{QUERY_STRING} ProductID=(\d+)
RewriteRule Product.asp Products.php?ID=${dbfixup:%1}
Vous devriez avoir un autre nom de variable pour obtenir le nouvel ID. De cette façon, dans votre nouveau programme, vous saurez si le produit correspond à l'aide de l'ancien ID ou le nouveau.
$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;';
...