Mod_ReWrite / ReWriteMap URL с использованием сценария поиска в базе данных

Сценарий
Я полностью переписал старый существующий ASP классический веб-сайт электронной коммерции на PHP.

При проектировании базы данных на предыдущем сайте было много проблем с реляционными идентификаторами, что приводило к сложным связям строк данных о продуктах с другими таблицами в базе данных.

Чтобы обойти это, я также перепроектировал базу данных, дав продуктам новые первичные ключи, сохранив при этом колонку в таблице со списком продуктов старого ПК.

Эта проблема
У меня проблема в том, что когда сайт перезапускается, мне нужны все ссылки поисковых систем, которые раньше указывали на "Product.asp?ProductID=29", чтобы искать в базе данных, сопоставлять старый продукт PK и перенаправлять на новый продукт PK. то есть "Products.php?ID=53".

Я пытаюсь сделать это с помощью Mod_ReWrite/ReWriteMap, однако во всей документации, которую я могу найти в Интернете, не указано, как обращаться с поиском PK сценария базы данных.

Обновить
Далее я прочитал предложение Игнасио Васкеса-Абрамса по адресу http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html > Программа внешней перезаписи, и оно кажется правильным и идеальным решением.,
Однако после обращения к моему хосту они не включаются ReWriteMap на своих серверах.

Я поставил свой, но ни в коем случае не лучшее и правильное решение для достижения этой цели без ReWriteMap включен.

3 ответа

Решение

После выяснения RewriteMap мой хост отключен, я нашел собственное решение, просто используя mod_rewrite и 2x 301 перенаправляет.

файл.htaccess

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

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

Обратите внимание, что это упрощенная выдержка из каждого файла, и она не будет защищена от внедрения SQL.

Надеемся, что Google и другие без проблем примут 2x 301 переадресацию.

Ваш запрос:

SELECT
  ID
FROM
  thetable
WHERE
  ProductID=?

Оттуда просто повторить значение ID и перевод строки, и стандартный поток.

Перепишите правила:

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

У вас должно быть другое имя переменной get для нового идентификатора. Таким образом, в вашей новой программе вы будете знать, соответствует ли продукт, используя старый идентификатор или новый.

$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;';
    ...
Другие вопросы по тегам