【发布时间】:2012-01-25 10:06:19
【问题描述】:
我们有近十万条路径需要 301 重定向到新结构。比如:
lang.site.com/section/subsection/article
->
lang.site.com/newsection/newsubsection/article
过去,当从 domain.com 迁移到 newdomain.com 时,我们只需放置一个 .htaccess 文件,其中包含 10k+ 脚本生成的行,将旧路径与新路径匹配,并且工作正常。它不会影响新域的性能,因为 .htaccess 仅在用户尝试访问旧域时由 Apache 读取。
现在这行不通,因为域名没有改变,只有路径的结构。更改路径的数量接近 100 000 标记,因此显然 Apache 为每个页面加载读取 100 000 行 .htaccess 的概念是荒谬的。
我很想知道如何以较低的性能成本正确实现这一点。我不是在要求你们提供现成的解决方案,只是在头脑风暴方面提供一些帮助,以便我们的用例中最可行的解决方案。
我们还将在 Apache 前面有一个 Varnish 服务器来提供缓存的内容,但我想下面的解决方案仍然可以工作,因为 Varnish 无法满足的请求会被转发到我们 LAMP 环境中的 Apache。
我的想法:
- Drupal 7 有一个
html.tpl.php文件,其中包含页面的<header>部分 - 在执行
html.tpl.php期间,我们将检查MySQL DB 以查看用户请求的路径是否存在于新的pathalias表中- 如果找不到路径并且找到
old path <-> new path关系:- PHP
header('Location:');To 301 将用户重定向到正确的新位置
- PHP
- 其他:
- 让 Drupal 照常处理请求并继续执行
- 如果找不到路径并且找到
我们还被告知要更新旧的域重定向,以直接将用户带到新站点,而无需任何 301 链接。我想我们可以使用相同的数据库检查来查看最旧路径与通过旧路径的最新路径之间是否存在关系。幸运的是,我们已经存储了所有这些甚至更旧的关系以防万一,现在它们可以派上用场了。
如果您通读,任何如何以最佳方式解决此问题的想法将不胜感激:)
【问题讨论】:
-
你见过Redirect module吗?它与 Drupal 的页面缓存集成以获得最佳性能,我很确定您可以将它用于您的目的。如果它没有做你想要的开箱即用它有一个很好的 API 你可以挂钩。
-
我对它很熟悉,但我不太热衷于在生产环境中使用 beta 阶段的模块。我想如果它是稳定的,我可以用我需要重定向的所有路径填充它的表。然后旧站点应该使用查询参数重定向到新站点,然后由 Redirect 模块转发,导致 301 链接。
-
是的,这就是我要走的路。不知道它是否能减轻您的顾虑,但我已经在许多生产站点中使用该模块几个月了,它从未引起任何问题。
-
虽然 301 链接是不可接受的,但如果我需要创建代码以拥有较长的相关路径,我不妨完全使用那个解决方案。 :)
标签: php drupal redirect url-rewriting seo