情景
我已经完全重写了一个旧的现有的ASP经典电子商务网站到PHP。
前一个站点的数据库devise有很多关系型ID问题,导致产品数据行与数据库中其他表格的连接麻烦。
为了解决这个问题,我还重新devise了数据库,为产品提供了新的主键,同时仍然在表中保留了一列与旧产品PK的列。
问题
我的问题是当网站重新启动时,我需要所有的search引擎链接,用来指向“Product.asp?ProductID = 29”来查找数据库,匹配产品旧的PK,并redirect到产品新的PK即“Products.php?ID = 53”。
我正在寻找与Mod_ReWrite / ReWriteMap,但是,我可以在网上find的所有文档没有说明如何处理数据库脚本PK查找。
更新
我已经在http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritemap >外部重写程序上进一步阅读了Ignacio Vazquez-Abrams的build议,这似乎是正确的,理想的解决scheme。
但是,在联系我的主机后,他们不会在他们的服务器上启用ReWriteMap
。
我已经提供了自己的,但决不是最好的/正确的解决scheme,实现这个没有ReWriteMap
启用。
您的查询:
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}
你应该为新的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;'; ...
发现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注入安全。
希望谷歌和类似的将接受2×301重定向没有问题。