迁移到新域名

时间:2010-07-27 08:20:30

标签: drupal path dns migrate

我正在mydomain.com/drupalsite上的drupal 6网站上工作,设计师已在其中放置了大量硬编码图像路径,例如mydomain.com/drupalsite/img中的自定义img文件夹。所以很多网站都使用链接到/drupalsite/img/myimg1.png。

问题在于 - 该网站最终通过将finaldomain.com指向mydomain.com/drupalsite移至finaldomain.com。所以现在像/drupalsite/img/myimg1.png这样的路径会解析为finaldomain.com/drupalsite/img/myimg1.png,而不是应该是finaldomain.com/img/myimg1.png。 finaldomain.com网站必须指向该子目录,因此它会命中index.php。

我的第一直觉是使用.htaccess文件将/ drupalsite替换为“”,但我尝试了十几种不同的解决方案而且它们没有用。我的解决方案是使用一些ln -s链接,但我真的不喜欢它:) tia

安德鲁

3 个答案:

答案 0 :(得分:2)

事后看来,最好的方法是确保人们使用Drupal函数来创建所有链接:

  • l(这是字母L)
  • drupal_get_path()
  • base_path()

l()函数负责基本路径的担忧,并提供了一种定义URL的系统方法。使用诸如theme_image()l()功能之类的东西肯定会赢。如果您必须编写自己的<a>标记并在theme_image()等主题函数中使用,请使用上面的第二个和第三个函数。

但是对于你目前的情况:

关于Andy的解决方案,如果您可以将更改限制在您知道链接所在的某些数据库字段中会更好。

所以写一个查询来选择所有这些字段(例如所有正文字段):

$my_query = db_query("SELECT vid, body FROM {node_revisions}");

例如,这会在body表格中为您提供每个node_revisions字段,因此即使您的旧版本也会有正确的链接。

然后运行这些结果,对每个结果执行str_replace(),然后将更改写回:

while($node = db_fetch_object($my_query)) {
  $new_body = str_replace('what you have', 'what you want', $node->body);
  db_query("UPDATE {node_revisions} SET body = '%s' WHERE vid = %d", $new_body, $node->vid);
}

我显然首先在一条记录上尝试,以确保您的代码按预期运行(例如,添加WHERE vid = 5以将其缩小到一个修订版)。此外,我没有利用node_loadnode_save,它们更适合正确加载和保存节点,以便提供更通用的解决方案(让您替换块中的文本等。 )。

对于你的文件,我建议你通过在“sites”文件夹中运行以下内容来建议一个好的sed命令:

find ./ -type f -exec sed -i ’s/string1/string2/’ {} \;

抓住from here,所以请查看该网站以获取更多解释。如果您要使用路径,则需要转义/命令版本中路径的sed,或使用其他sed分隔符(即你可以写s#string1#string2#而不是s/string1/string2/,所以你可以写s#/drupalsite/img/#/img#而不是s/\/drupalsite\/img\//\/img/ :-)。另请参阅Drupal手册页面以获取快速sed命令:http://drupal.org/node/128513

有点混乱,这就是为什么我尝试在前面强制使用适当的功能。但是如果你想让这些人创建Drupal内容但是你不想让他们访问“PHP Filter”输入格式,或者他们根本不懂PHP,那就太难了。正确的Drupal主题,在任何过去基本的HTML / CSS工作之后,需要PHP和Drupal的主题相关功能的知识。

答案 1 :(得分:0)

我之前已经完成了这项工作,通过完整的数据库转储,在文本编辑器中打开它,并在路径上进行全局搜索和替换。然后在新主机上加载修改后的转储文件,它将具有正确的路径。

答案 2 :(得分:0)

您可以尝试Pathologic,它应该能够纠正这样的路径。