0

场景
我已经将一个旧的现有 ASP 经典电子商务网站完全改写为 PHP。

之前网站的数据库设计有很多关系 ID 问题,导致产品数据行与数据库中其他表的链接很麻烦。

为了解决这个问题,我还重新设计了数据库,为产品提供了新的主键,同时仍然在表中保留了一个包含产品旧 PK 的列。

问题
我遇到的问题是当网站重新启动时,我需要所有指向“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
> External Rewriting Program 中进一步阅读了 Ignacio Vazquez-Abrams 的建议,这似乎是正确和理想的解决方案。 但是,在联系我的主机后,他们没有在他们的服务器上启用。
ReWriteMap

我已经提供了我自己的,但绝不是在没有ReWriteMap启用的情况下实现这一目标的最佳/正确解决方案。

4

3 回答 3

1

您的查询:

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}
于 2010-01-25T04:40:44.660 回答
0

您应该为新 ID 使用不同的获取变量名称。这样,在您的新程序中,您将知道是使用旧 ID 还是新 ID 来匹配产品。

$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;';
    ...
于 2010-01-26T12:00:54.760 回答
0

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 重定向。

于 2010-01-29T07:07:37.250 回答