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

ModX redirect based on query string (Revolution 2.3)

我正在用 ModX 重建一个网站,我想自动将旧的 URL 重定向到新的 ModX 页面。

一个旧的 URL 的形式是 http://www.oldsite.com/?pg=2

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

的映射

如果我在文档根目录中调整主要 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 经验,无法确切知道将这段代码放在哪里。我试过了:

对于打包此代码的最佳位置,或指向我应该使用的 Extra 的指针,我们将不胜感激。


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

<?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;
        }
    }
}

我更喜欢在带有重定向或 url 重写的 .htaccess 文件中执行此操作 - 这样您就可以发送重定向和响应代码 ~before~ modx 必须处理任何东西 [节省一点开销]

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

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

我同意不破解 index.php 文件,只会让你伤心。您要做的是将重定向代码放在 plugin. Check the Modx API docs for the appropriate event for it to fire on - perhaps: OnWebPageInit 中即可。抱歉,我不知道具体哪个好。

然而~重要提示!

并非所有事件实际上都是活动的,它们可能会出现在 modx 管理器中,但实际上不会执行任何操作,您只需要测试或挖掘代码即可找到答案。 [或在社区中提问] 再次抱歉,我不确定哪些有效,哪些无效。