【问题标题】:How can i fetch numbered URLs that contain zero in PHP?如何在 PHP 中获取包含零的编号 URL?
【发布时间】:2019-08-28 14:36:42
【问题描述】:

我有一个关于 Wordpress 网站的 PHP 函数的问题。截至本文https://perishablepress.com/wordpress-infinite-duplicate-content/Wordpress 存在无限分页问题。所以我需要通过捕获编号的 URL 并将它们重定向到其父 URL 来解决这个问题。

我在网上找到了这段代码,但我根据自己的需要对其进行了一些修改。它按预期工作,但它不会捕获包含零的 URL,也不会直接重定向到带有斜杠的 URL(如果获取的 URL 中没有斜杠)。

从我的测试来看,PHP 似乎没有使用参数is_numeric 捕获包含0 的URL(可能是因为0 被认为是int,但我不确定)。我对PHP不熟悉,所以我把这个分享给你。

对于其余部分,它可以完美运行,捕获编号 URL 并重定向到其父 URL。当然,我已经将代码关闭到一个函数中并加载到一个钩子中。但为了更好的说明,我只分享代码本身:

global $posts, $numpages;

    $request_uri = $_SERVER['REQUEST_URI'];

    $result = preg_match('%\/(\d)+(\/)?$%', $request_uri, $matches);

    $ordinal = $result ? intval($matches[1]) : FALSE;

    if(is_numeric($ordinal)) {

        // a numbered page was requested: validate it
        // look-ahead: initialises the global $numpages

        setup_postdata($posts[0]); // yes, hack

        $redirect_to = ($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);

        if(is_string($redirect_to)) {

            // we got us a phantom
            $redirect_url = get_option('home') . preg_replace('%'.$matches[0].'%', $redirect_to, $request_uri);

            // if page = 0 or 1, redirect permanently
            if($ordinal) {
                header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
            }

            header("Location: $redirect_url");
            exit();

        }
    }

我希望编号 URL(也包含 00000001234)也被重定向到其父源。感谢您的帮助。

【问题讨论】:

  • 000000 是一个字符串,而不是一个数字。字符串可以以 0 开头,数字不能
  • 好的,感谢您的回复,那么我该如何修改代码以满足 URL 中的 0 字符串?

标签: php wordpress redirect


【解决方案1】:

is_numeric() 调用 '0000' 和 '0123' 之类的值将在 php 中返回 true,这些值将通过 intval() 解析为 0 和 123。

我注意到您已将博文中的原始代码从

// if page = 0 or 1, redirect permanently
($ordinal < 2) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
} else {
    header($_SERVER['SERVER_PROTOCOL'] . ' 302 Found');
}

// if page = 0 or 1, redirect permanently
if($ordinal) {
    header($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
}

评论不再与功能匹配,可能是因为您总是希望使用该 301 功能?

我相信您的代码会以不同的方式处理 0000 序数,因为如果检查,它将评估为 false。

如果我对您想要的内容的理解是正确的,您可以尝试将其删除,如果完全检查,看看它是否能解决您的问题。如果不能,您能否提供一些显示问题的完整 URL?

【讨论】:

  • 嗨帕特里克,是的,你说的是真的。我想为所有 URL 设置 301,因为我将条件标签应用于某些帖子类型,所以我不需要重定向 302。在此控件中,可能存在问题。那么您是否建议删除 if ($ordinal) { 或伪造验证控件如下: if ($ordinal
  • 我会完全删除if ($ordinal
  • 我在没有if ($ordinal 的情况下对其进行了测试,但没有运气。如果我为https://www.example.com/how-to-do-that/111 之类的 URL 开火,则按预期工作,但如果我为https://www.example.com/how-to-do-that/000 开火,则会被忽略。
  • 哦,等等,我想您还需要一个我错过的更改。尝试将执行类似 if ($ordinal) 检查的这一行:$redirect_to = ($ordinal) ? '/': (($ordinal &gt; $numpages) ? "/$numpages/" : FALSE); 更改为 $redirect_to = isset($ordinal) ? '/': (($ordinal &gt; $numpages) ? "/$numpages/" : FALSE);
  • 是的,帕特里克,成功了。我会将此作为最佳答案进行检查,但如果可以的话,您能否告诉我,我如何将非尾随斜杠 URL 直接重定向到尾随斜杠 URL?所以如果我触发https://www.example.com/how-to-do-that/111,输出将是https://www.example.com/how-to-do-that,然后是https://www.example.com/how-to-do-that/。相反,如果我这样做https://www.example.com/how-to-do-that/111/,输出将立即为https://www.example.com/how-to-do-that/。如果不调用 htaccess 中强制 / 的规则,我该如何实现这一点?非常感谢
猜你喜欢
  • 2012-01-11
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多