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

Сценарий
Я полностью переписал старый существующий сайт классической электронной коммерции 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 на своих серверах.

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

Ответы [ 3 ]

1 голос
/ 25 января 2010

Ваш запрос:

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}
0 голосов
/ 29 января 2010

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

.htaccess файл

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

SEO_Redirect.php file

$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 переадресацию.

0 голосов
/ 26 января 2010

У вас должно быть другое имя переменной 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;';
    ...
...