mod_rewrite的/ RewriteMap指令使用数据库查询脚本中的URL
-
22-09-2019 - |
题
<强>方案强>结果 我已经完全改写一个旧现有的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 >外部重写程序,这似乎是正确的,理想的解决方案。点击
然而,联系我的主人后,他们没有自己的服务器上启用ReWriteMap
。
我提供我自己的,但绝不是实现这一目标没有ReWriteMap
最好/正确的解决方案启用。
解决方案 3
找出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重定向没有问题。
其他提示
您查询:
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不同的GET变量名。这样,在新的程序,你会知道是否该产品使用旧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;';
...