情景
我已经完全将旧的现有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
的情况下实现此目标的最佳/正确解决方案。
答案 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重定向而不会出现问题。