我的网站数据库中有一个表(Magento,但这与我在Magento以外的数据处理工作无关)充满了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
被重定向到REWRITES(Request, Target)
really-old-url, current-url
old-url, current-url
recent-url, current-url
然后重定向到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;
。不是一个非常有效的设置:301重定向超过需要&每页更多数据库请求。最旧和当前URL之间通常有五个或更多重定向,并且有数千个页面以这种方式重定向。
我想使用PHP + MySQL来循环使用此表,最终得到以下内容:
is_system = 0
很明显,现在每当请求页面的任何一个旧URL时,它只会被定向到当前URL。
我将如何做到这一点?
编辑 - 这是戈登使用Magento的字段名称的正确答案,以防其他人想要做同样的事情:
{{1}}
编辑#2 - 我只在{{1}}的行上执行了此查询。使用所有行可能会产生意外行为。
答案 0 :(得分: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;
您可以继续重复这些更新,直到没有更新记录。