【问题标题】:Capitalized external links to new Drupal site get a 404指向新 Drupal 站点的大写外部链接获得 404
【发布时间】:2012-01-25 10:28:00
【问题描述】:

我有一个相当大的网站,网站建设者将所有内部路径自动设置为小写(在页面本身、菜单等中)。目前,在新的 D7 版本站点中,我们有其他站点链接到数百到可能 1,000 多个节点的旧(大写)版本。

所以指向http://www.example.com/alzheimers 的链接可以正常工作,但是如果我手动输入http://www.example.com/Alzheimers,我会被带到我们的自定义404(我们的Drupal 主题显示该消息)。这是一个问题,因为它是一个高可见度的站点,有很多指向旧 URL 的外部链接。

网站建设者还尝试手动输入/Alzheimers/alzheimers 的重定向,当然,这会造成无限重定向循环、黑洞、僵尸战争等。

我尝试使用 apache“mod_speling”来处理这个问题,但没有成功,尽管我对这个 mod 没有丰富的经验。我想知道我是否可能遗漏了什么/是否需要特定的大写更改规则?我遵循的说明让我启用了 mod 并重新启动 Apache。它没有帮助。

所以我想知道我是否需要连接到主题 (hook_init?) 以获取请求的 URL 并输入一点 PHP 来将字符串设置为更低。有任何想法吗?我对它进行编码没有任何问题,但如果有更简单的方法来处理它,任何帮助将不胜感激。

因为这对于任何为 Windows 编写并通常转移到 Drupal 或 LAMP 的网站来说都是一个典型问题,所以我不可能是第一个需要解决这个问题的人。

如果需要自定义 Drupal 代码,最好把它挂在哪里?

【问题讨论】:

    标签: php apache mod-rewrite drupal-7 mod-speling


    【解决方案1】:

    我认为hook_init() 在这个过程中被调用得太晚了(引导程序已经完成并且路径到那时解决了)。您可能想改用hook_boot()

    function mymodule_boot() {
      $_GET['q'] = strtolower($_GET['q']);
    }
    

    安装模块后,弹出system 表并将模块的weight 列设置为-1,以确保在任何其他模块的钩子之前调用您的钩子。然后刷新 Drupal 的缓存,你就可以开始了。

    但请注意,搜索引擎会将http://www.example.com/alzheimershttp://www.example.com/Alzheimers 视为具有重复内容的两个单独页面。理想情况下,您希望执行从旧页面到新页面的 301 重定向,但这会复杂得多,并且(我认为)将涉及实现 hook_url_inbound_alter

    【讨论】:

    • 出色的答案。我也在考虑使用 hook_boot,但我想我在某处读到两者之一没有在缓存页面或其他东西上运行,因此我认为 hook_init 会是一个更好的选择。
    • 呃。对不起,我是这种格式的新手。丢失的编辑。我喜欢将模块重新排序到顶部 + 1 的方法。我希望我有足够的 repz 来支持你的答案。\n 所以我有一个请求应该通过 apache 进入我的服务器,但它显然在此之前被 Drupal 拦截了,这是不可能的,因为 drupal 在内部运行在apache内部运行的php(可以这么说)。我无法理解 drupal 如何覆盖我的服务器设置。 (续)
    • 具有讽刺意味的是,当一个站点构建者尝试使用 drupal 的 mod 系统添加从 /Alz 页面到 /alz 页面的重定向时,他得到了很好的旧无限重定向循环错误业务。
    猜你喜欢
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多