Mod_ReWrite / ReWriteMap使用数据库查找脚本的URL

时间:2010-01-25 04:33:05

标签: php apache mod-rewrite rewritemap

情景
我已经完全将旧的现有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>上进一步了解了Ignacio Vazquez-Abrams的建议。外部重写程序,它似乎是正确的,是理想的解决方案。
但是,在与我的主机联系后,他们不会在其服务器上启用ReWriteMap

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

3 个答案:

答案 0 :(得分: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}

答案 1 :(得分:0)

您应该为新ID设置不同的get变量名称。这样,在您的新程序中,您将知道是使用旧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;';
    ...

答案 2 :(得分: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注入不安全。

希望谷歌和类似的人都会接受2x 301重定向而不会出现问题。