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