gpt4 book ai didi

php - URL 重写数据库 - 需要将所有旧 URL 指向同一个新 URL

转载 作者:行者123 更新时间:2023-11-29 08:30:06 26 4
gpt4 key购买 nike

我的网站数据库(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 之间通常有 5 个或更多重定向,并且有数千个页面以这种方式重定向。

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

REWRITES(Request, Target)

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

显而易见,现在每当请求页面的任何一个旧 URL 时,它只会被定向到当前 URL 一次。

我该如何去做呢?

编辑 - 这是 Gordon 使用 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 的行执行此查询。使用所有行可能会产生意外的行为。

最佳答案

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

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;

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

关于php - URL 重写数据库 - 需要将所有旧 URL 指向同一个新 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16870271/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com