0

我的站点数据库中有一个表(Magento,但这无关紧要,因为我将在 Magento 之外处理我的数据),其中充满了 URL 重写。这张表已经存在了很长一段时间,我的 URL 在那段时间里改变了不止一次。对于每个 URL,我现在都有如下内容:

REWRITES(Request, Target)

really-old-url, old-url
old-url, recent-url
recent-url, current-url

这按预期工作,really-old-url被重定向到,current-url但仅在really-old-url被重定向到之后old-url,被重定向到recent-url,然后被重定向到current-url。不是一个非常有效的设置:比需要更多的 301 重定向和每页更多的数据库请求。在最旧的 URL 和当前 URL 之间通常有五个或更多重定向,并且有数千个页面以这种方式重定向。

我想使用 PHP+MySQL 来循环这个表,最终得到以下结果:

REWRITES(Request, Target)

really-old-url, current-url
old-url, current-url
recent-url, current-url

应该很明显,现在每当请求页面的任何旧 URL 时,它只会被定向到当前 URL 一次。

我该怎么做呢?

编辑 - 这是戈登使用 Magento 的字段名称的正确答案,以防其他人想做完全相同的事情:

update core_url_rewrite r join (select r.request_path, r.target_path from core_url_rewrite r left outer join core_url_rewrite r1 on r.target_path = r1.request_path where r1.request_path is null) r2 on r.target_path = r2.request_path set r.target_path = r2.target_path;

编辑 #2 - 我只对is_system = 0. 使用所有行可能会产生意外行为。

4

1 回答 1

2

首先,考虑一组正确的目标。这些是正确的,因为没有重定向:

select target
from rewrites r left outer join
     rewrites r1
     on r.target = r1.request
where r1.request is null

现在,以下更新将通过更新目标是上述查询中的源的任何记录来更新链中的“一个链接”:

update rewrites r join
       (select r.source, r.target
        from rewrites r left outer join
             rewrites r1
             on r.target = r1.request
        where r1.request is null
       ) r2
       on r.target = r2.source
    set r.target = r2.target;

您可以不断重复这些更新,直到没有记录被更新。

于 2013-06-01T07:40:23.513 回答