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.

Était-ce utile?

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;';
    ...
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top