php - 迁移 MediaWiki 后如何更新所有外部链接

标签 php mysql preg-replace mediawiki

我已将 MediaWiki 从一个环境迁移到另一个环境。一切工作正常,除了一些用户有硬编码的外部链接(实际上链接到同一维基中的其他页面)。例如,旧 wiki 位于 ://foo/wiki,新 wiki 位于 ://foo.com。在迁移的 wiki 页面上,页面文本上有外部链接,例如 ://foo/wiki/somepage。因此,当他们点击迁移后的 wiki 上的链接时,他们会被带回到旧的 wiki 并被定向到 ://foo/wiki/somepage ——这不是正确的行为(应该转到://foo.com/somepage)。在 MySQL 的“externallinks”表中,我在单个链接上运行了两个语句,以查看更改是否会更新链接:

UPDATE `foowiki`.`externallinks`
SET el_to = REPLACE(el_to, '://foo/wiki', '://www.foo.com')
WHERE el_to LIKE '%://foo/wiki/somepage%';

UPDATE `foowiki`.`externallinks`
SET el_index = REPLACE(el_index, '://foo./wiki', '://com.foo.www.')
WHERE el_index LIKE '%://foo./wiki/somepage%';

当我重新启动网站并转到包含我尝试更新的示例链接的页面时,该链接仍然相同(即,它链接到旧的 wiki 环境)。

是否有一种快速简便的方法可以用正确的前缀替换所有外部链接(文本中)(即从 ://foo/wiki/somerandompage://foo.com/somerandompage)?也许有一种更干净的方法来做到这一点,而不是更新 MySQL 表中的所有记录,例如拦截 LocalSettings.php 中的 HTTP 请求并在那里进行单个子字符串替换?

最佳答案

解决方案 A(无代码):

  1. 转储表:
    mysqldump -u user -p database table > dump.sql
  2. 使用 notepad++ 打开它
  3. 进行搜索并替换:
    ctrl+h
  4. 重新导入表:
    mysqlimport -u user -p database table < dump.sql
<小时/>

解决方案 B,使用 sed :

  1. 转储表:
    mysqldump -u user -p database table > dump.sql
  2. 使用 sed 查找和替换:
    find /path/to/dump.sql -type f -exec sed -i 's/:\/\/foo\/wiki\//:\/\/foo.com\//g' {} \;
  3. 重新导入表:
    mysqlimport -u user -p database table < dump.sql
<小时/>

PS:始终备份

关于php - 迁移 MediaWiki 后如何更新所有外部链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29659394/

相关文章:

php - Symfony2 日期时间查询生成器

php - 检查字符串和用户代理

C# 和 MySql 集成

php - 类似对话的消息系统

mysql - sql查找具有不同列值的行

php - 如何用 PHP 将每个单词包装在 span 中?

php - 避免在 php 的 preg_replace 中进行反向引用替换

php - 从 PDO Callable 语句获取 out 参数的正确方法

php - 尝试将正则表达式匹配传递给函数时出错

php - 仅显示数据库表中的选定结果