Bir veritabanı arama script kullanarak Mod_Rewrite / RewriteMap URL

3 Cevap php

The Scenario
I have completely rewritten an old existing ASP classic ecommerce website over to PHP.

Önceki sitenin veritabanı tasarımı veritabanındaki diğer tablolarla ürün veri satırlarının zahmetli bağlanmasına neden ilişkisel kimlik sorunları bir sürü vardı.

Bu almak için ben de hala ürünler eski PK ile tablodaki bir sütun korurken, ürünler yeni birincil anahtarları vererek, veritabanını yeniden tasarlanmış.

The Problem
The problem I have is when the site is relaunched, I need all search engine links that used to point to 'Product.asp?ProductID=29' to lookup the the database, match the products old PK, and redirect to the products new PK i.e. 'Products.php?ID=53'.

Ancak, ben online bulabilirsiniz tüm dokümantasyon veritabanı komut PK arama ile nasıl başa devlet değil, mod_rewrite / RewriteMap ile bunu yapmak için arıyorum.

Update
I've read up further on Ignacio Vazquez-Abrams' suggestion at http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap > External Rewriting Program, and it seems to be correct and the ideal solution.
However, after contacting my host, they do not enable ReWriteMap on their servers.

Ben kendi sağlanan, ancak hiçbir şekilde ReWriteMap etkin olmadan bu ulaşmanın en iyi / doğru çözümü demektir ettik.

3 Cevap

RewriteMap benim ev sahibi tarafından devre dışı bırakılır öğrendikten sonra, ben sadece mod_rewrite ve 2x 301 yönlendirmelerini kullanarak kendi çözüm ulaştınız.

. Htaccess dosyası

RewriteEngine on
RewriteRule ^Product(.*)\.asp SEO_Redirect.php [NC,R=301]

SEO_Redirect.php dosyası

$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']);

Not, bu, her dosyanın bir basitleştirilmiş alıntıdır, ve SQL enjeksiyon karşı güvenli olmaz.

Umarım Google ve benzeri sorunlar olmadan 2x 301 yönlendirmelerini almak kabul edecektir.

Sorgunuz:

SELECT
  ID
FROM
  thetable
WHERE
  ProductID=?

Oradan sadece ID değerini ve satırbaşı ve floş stdout yankı.

Kurallarını yeniden:

RewriteMap dbfixup prg:dbfixup.script
RewriteCond %{QUERY_STRING} ProductID=(\d+)
RewriteRule Product.asp Products.php?ID=${dbfixup:%1}

Sen yeni kimliği için farklı bir get değişken adı olmalıdır. Bu şekilde yeni programın size eski kimliğini veya yeni birini kullanarak ürünü uygun olup olmadığını bilecek.

$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;';
    ...