基于查询字符串的ModX重定向(Revolution 2.3)

时间:2015-01-21 16:00:06

标签: modx modx-revolution

我正在ModX中重建网站,我想自动将旧网址重定向到新的ModX页面。

旧网址的格式为http://www.oldsite.com/?pg=2

每个页面都是这样的,所以我需要手动将旧页面ID映射到新的ModX资源ID。例如,pg = 2是联系页面,现在是资源ID 11,因此我最终得到的地图如[2 => 11,3 => 15等]

如果我在docroot中调整主index.php,这正是我想要的:

/* execute the request handler */
if (!MODX_API_MODE) {
    if (isset($_GET["pg"])) {
        if ($_GET["pg"] == 2) {
            $url = $url = $modx->makeUrl(11);
            $modx->sendRedirect($url);
        }
        else {
            // Page is set, but we don't have a redirect for it.
            $modx->handleRequest();
        }
    }
    else {
        $modx->handleRequest();
    }
}

但是,我对直接攻击index.php不满意。我有点缺乏ModX经验,无法确切地知道放置此代码的位置。我试过了:

  • 一个片段,然后我在任何HTML之前从我的HTML标头调用,但重定向停止了工作
  • 重定向器额外,但这不适用于QUERY_STRING,我不认为

对于打包此代码的最佳位置,或者指向Extra应该使用的指针,我们非常感谢。


根据Sean的见解,对我有用的解决方案是一个插件。插件代码如下。对于像我这样的其他插件新手,请确保您访问"系统事件"选项卡可为您尝试访问的活动启用插件。

<?php

if ($modx->event->name == 'OnWebPageInit') {
    // Look to see if the GET params include a pg. If they do, we have a request
    // for one of the old pages.
    if (isset($_GET["pg"])) {

        // Map the old pg IDs to the new resource IDs.
        if ($_GET["pg"] == 2) {
            $url = $modx->makeUrl(11);
        }
        // Add more here...

        // When done trying to match, redirect.
        // But only do the redirect if we found a URL.
        if (isset($url)) {
            $modx->sendRedirect($url, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
            exit;
        }
    }
}

1 个答案:

答案 0 :(得分:1)

我喜欢这样做是在带有重定向或网址重写的.htaccess文件中 - 这样你就可以在~modx处理之前发送重定向和响应代码〜[节省一些开销]

如果您仍想在modx中执行此操作,请查看sendRedirect docs&amp;发送正确的响应代码[所以google得到页面实际移动的提示]注意:$ responseCode选项已弃用,您应该在options数组中使用它:

$modx->sendRedirect('http://modx.com',array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));

我同意不攻击index.php文件,只会让你感到悲伤。您要做的是将重定向代码放在plugin中。检查appropriate event的Modx API文档是否可以启动它 - 也许:OnWebPageInit可以解决问题。对不起,我不确切知道哪一个会起作用。

但是〜重要提示!

并非所有事件都是实际活动的,它们可能会出现在modx管理器中,但实际上并没有做任何事情,您只需要测试或挖掘代码即可找到答案。 [或在社区中询问]再次,对不起,我不知道哪些有效,哪些无效。