Сценарий
Я полностью переписал старый существующий веб-сайт ASP classic для электронной коммерции на PHP.
В конструкции базы данных предыдущего сайта было много проблем с реляционными идентификаторами, что вызывало затруднительное связывание строк данных продукта с другими таблицами в базе данных.
Чтобы обойти это, я также переработал базу данных, предоставив продукты новым Первичным ключам, сохраняя при этом столбец в таблице с продуктами старого ПК.
Проблема
Проблема в том, что когда сайт перезагружен, мне нужны все ссылки в поисковых системах, которые указывали на «Product.asp? ProductID = 29» для поиска базы данных, соответствия продукции старого ПК и перенаправления на продукты new PK т.е. «Products.php? ID = 53».
Я хочу сделать это с помощью Mod_ReWrite / ReWriteMap, однако вся документация, которую я могу найти в Интернете, не указывает, как обращаться с поиском PK базы данных.
Обновить
Я читал далее предложение Игнасио Васкеса-Абрамса по адресу http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap > Внешняя программа перезаписи, и это кажется правильным и идеальным решением ,
Однако после обращения к моему хосту они не активируют ReWriteMap
на своих серверах.
Я поставил свои собственные, но отнюдь не лучшее / правильное решение для достижения этой цели без использования ReWriteMap
.
Ваш запрос:
SELECT ID FROM thetable WHERE ProductID=?
Оттуда только эхо значение ID
и новой строки, и flush stdout.
Переписать правила:
RewriteMap dbfixup prg:dbfixup.script RewriteCond %{QUERY_STRING} ProductID=(\d+) RewriteRule Product.asp Products.php?ID=${dbfixup:%1}
У вас должно быть другое имя переменной для нового идентификатора. Таким образом, в вашей новой программе вы узнаете, следует ли сопоставлять продукт с использованием старого идентификатора или нового.
$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;'; ...
Узнав, что 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 и так же согласится на получение 2х 301 переадресаций без проблем.