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

标签 php mysql magento loops

我的网站数据库(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/

相关文章:

php - div的onclick需要删除一条mysql数据库记录

php - $con->用PHP查询MySQL错误

Php/MySql 数组搜索 ã, š, é, ë, ú, ü, í, ž

php - Magento 系统配置 : What's the use of frontend_type for section and groups?

php - 在 PHP 中合并两个数组

php - .htaccess 删除单个文件的扩展名

php - 无法调用数据,第一次写数据库连接

php - 如何按分类术语从自定义 WordPress MySQL 查询中排除结果

magento - 如何找出我的商店 ID 是什么?

css - Magento:自定义菜单扩展 - CSS 到中心菜单