2011-07-24 61 views
1

我们正在从旧的osCommerce安装迁移到WordPress。 90%的流量来自有机结果,并有4000多个索引产品页面,重定向到新网站是必不可少的。301重定向旧的osCommerce链接的最佳方式

旧网站的网址结构:

/product_info.php?cPath=1&products_id=4 

其中cPath =>自从类别和​​就是这样。这两种都包含在DB自从

新网站:因为我们是从标识移动到永久链接

/categoryname/product-title 

什么是最好的方式来动态301所有这些URL到正确的位置?我想可能是一个PHP脚本来生成.htaccess文件,有没有人有经验呢?我可以将类别ID映射到正确的WordPress类别slug,并刮掉旧网站以将旧产品网址与产品标题进行匹配。这是最好的方式/甚至可能吗?在这里把我的头撞在墙上。

我看了这一点,但它并不适用,因为我想要动态地重定向所有的旧产品,或者至少动态生成的重定向(就像我说的,约5000产品) Rewrite htaccess old oscommerce links


编辑:我的想法:

1.创建.htaccess文件。

RewriteCond %{REQUEST_URI} ^/product_info\.php$ 
RewriteCond %{QUERY_STRING} ^cPath=([0-9]+)&products_id=([0-9]+) 
RewriteRule ^(.*)$ http://www.domain.com/redirect.php?cat=%1&product=%2? [R=301,L] 

2.将所有匹配的请求到一个自定义的PHP 301重定向脚本

3.脚本包含的category_names => id pairs已经映射到正确的数据库值(没有数据库调用)的阵列,和一个单独的阵列的products_names => product_ids

4.匹配的类别和产品信息后,该脚本推你到正确的地方:

$yourNewLocation = $cat . '/' . $product . '/'; 
function return_301($yourNewLocation){ 
    header ('HTTP/1.1 301 Moved Permanently'); 
    header ('Location: '. $yourNewLocation); 
} 

可能的瓶颈:5000+的关联数组?是一个主要的瓶颈vs mysql加入获取所需的信息?

+0

我会在** PHP **中执行此操作。如果通过Apache的mod_rewrite完成,每个重定向规则将需要2行('RewriteRule'用于实际重定向,'RewriteCond'用于匹配特定的查询字符串)。 – LazyOne

+1

我不知道是否真的是好主意,使用PHP数组(这将是相当大的阵列..和PHP阵列是非常低效的内存消耗)。速度应该没问题(或者至少类似于MySQL,但需要测试,因为每个服务器都不相同),但内存消耗肯定会很高..如果您在共享主机上并且有大量重定向,则这可能会成为瓶颈时间。我会去MySQL存储重定向对。 – LazyOne

+1

1)不需要第一个RewriteCond - 该模式可以很容易地移入RewriteRule本身(这也会减少匹配的数量 - 不是一个大的收益,但为什么有这额外的,如果它可以**轻松**避免)。 2)我不知道所有的细节......但我认为不需要重写规则AT ALL - 只需使用'product_info.php'而不是'redirect.php'(首先将所有重定向代码放在那里)。 – LazyOne

回答

1

“我在想,也许一个PHP脚本来生成.htaccess文件”

如果你要做到这一点,我建议把你的重定向在的httpd包括而非htaccess的,有使用.htaccess时性能会受到影响 - 在这方面,include可能会更好。

此外,如果你打算使用PHP来映射ID,以永久链接:

header ('HTTP/1.1 301 Moved Permanently'); 
header ('Location: '.$yourNewLocation); 

我不是100%肯定,如果你的计划是“最好的办法”,但它的确听起来合理。(中当使用php +数据库调用动态重定向时,会比使用.htaccess或包含方法的命中更具活力!)

+0

谢谢!那两者的组合呢? .htaccess可以将'/product_info.php?cPath = 1&products_id = 4'发送到'/my301generator.php?cPath = 1&products_id = 4',然后使用预映射数组(已经匹配到DB,''cPath 1' >'CategoryName'')吐出正确的'$ yourNewLocation'。这意味着在映射到数据库之后,我不需要进行任何数据库调用,并且所有内容都是花花公子,不是吗?现在看看'RewriteCond'规则 – timelf123

+0

我在原始帖子 – timelf123

+0

中刺探了我的意图。我认为有效的书写查询将比解析'映射'文件更有效率。 –