WordPress wp_redirect 在我阅读之前清除 $_SERVER['REQUEST_URI']

WordPress wp_redirect clearing $_SERVER['REQUEST_URI'] before I can read it

如果 AJAX 没有请求,我需要将我的 WordPress 网站上的所有流量重定向到主页,但我需要在重定向后使用请求的路径。

我通过 wp_redirect php 和 template_redirect 挂钩进行重定向,但是我无法读取 REQUEST_URI 以通过 cookie 或 [=48 保存它=] 或任何东西。

一旦 wp_redirect 被调用,它似乎阻止我阅读请求的详细信息,预重定向。注释掉 wp_redirect,它看起来很好。

有没有我遗漏的东西,或者更好的方法?我有一个通过 AJAX.

加载内容的单页网站
add_action('template_redirect', 'pass_along_request_uri', 1);

function pass_along_request_uri() {
    // $_SERVER['REQUEST_URI'] is the path as expected only if the future wp_redirect is not called...
}
add_action('template_redirect', 'redirect_to_homepage', 10);

function redirect_to_homepage() {
    if (!is_front_page() && (strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest')) {                                                                 
        wp_redirect(home_url(), 301); 
        exit;
    }
}

编辑; 只有 2 个函数用于测试,因为记录 $_SERVER['REQUEST_URI'] 对我来说没有意义。考虑如果我将日志置于优先级 1,则应该在使用优先级 10 函数进行重定向之前记录它。

然而事实并非如此。不管何时何地看起来,调用wp_redirect似乎清除了原始请求数据。

function console_log($output, $with_script_tags = true) {
    $js_code = 'console.log(' . json_encode($output, JSON_HEX_TAG) . 
');';
    if ($with_script_tags) {
        $js_code = '<script>' . $js_code . '</script>';
    }
    echo $js_code;
}
console_log($_SERVER['REQUEST_URI']);

日志在不调用 wp_redirect 时显示“/path/to/page”,一旦 wp_redirect 在链中,它只会吐出“/”(重定向路径)。

我认为这与 add_action 的操作排队方式有关?不幸的是,我不太了解 WordPress。

谢谢!

你这里的错误是你实际记录的方式。

console.log(...) 在客户端执行 - 但它 无法 在您在其他地方进行重定向时记录(您无法为浏览器发送输出像您的脚本元素一样解释 同时重定向。)
您看到的是相同日志记录代码的结果,在重定向后通过请求执行。

实现您想要的最简单方法可能是将 REQUEST_URI 值粘贴到会话中。为此,您可能必须启动一个,因为默认情况下 WP 不使用“传统”会话。