Как я могу получить пронумерованные URL-адреса, которые содержат ноль в PHP?

У меня проблема с функцией PHP для сайта Wordpress. На момент написания этой статьи https://perishablepress.com/wordpress-infinite-duplicate-content/ Wordpress имеет проблему с бесконечной нумерацией страниц. Поэтому мне нужно исправить это, перехватив пронумерованные URL-адреса и перенаправив их на родительский URL-адрес.

Я нашел этот код в Интернете, но немного изменил его для своих нужд. Он работает, как и ожидалось, но не перехватывает URL-адреса, содержащие ноль, а также не перенаправляет напрямую на URL-адрес с косой чертой (если в извлеченном URL-адресе его нет).

Из моих тестов видно, что PHP не перехватывает URL-адреса, содержащие 0 с параметром is_numeric (вероятно, потому что 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-адреса, также содержащие 000000 или 01234, также будут перенаправлены на родительский источник. Спасибо за помощь.

000000 — это строка, а не число. Строки могут начинаться с 0, числа не могут
Andreas 07.04.2019 09:48

хорошо, спасибо за ответ, так как я могу изменить код, чтобы он соответствовал строке 0 в URL-адресах?

wrls 07.04.2019 11:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вызовы is_numeric() для таких значений, как «0000» и «0123», вернут true в php, и они будут проанализированы на 0 и 123, как и следовало ожидать, через intval().

Я заметил, что вы изменили исходный код в сообщении блога с

// 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-адресов, которые демонстрируют проблему?

Привет, Патрик, да, это правда, что ты говоришь. Я бы хотел 301 для всех URL-адресов, потому что я применяю условные теги к некоторому типу сообщений, поэтому мне не нужно перенаправление 302. И в этом элементе управления, возможно, есть проблема. Итак, вы предлагаете удалить if ($ ordinal) { или подделать проверку элемента управления следующим образом: if ($ ordinal <= 9) {

wrls 07.04.2019 10:06

Я бы просто удалил if ($ordinal полностью

Patrick Fay 07.04.2019 10:07

я тестировал его без if ($ordinal, но не повезло. Если я запускаю URL-адрес, например https://www.example.com/how-to-do-that/111, он работает, как и ожидалось, но если я запускаю https://www.example.com/how-to-do-that/000, он игнорируется.

wrls 07.04.2019 11:11

О, подождите, я думаю, вам понадобится еще одно изменение, которое я пропустил. Попробуйте изменить эту строку, которая выполняет аналогичную проверку if ($ ordinal): $redirect_to = ($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE); на эту $redirect_to = isset($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);

Patrick Fay 07.04.2019 11:26

да, Патрик, это помогло. Я проверю это как лучший ответ, но не могли бы вы также сказать мне, если можете, как я могу перенаправить 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, которое вызывает /? Большое спасибо.

wrls 07.04.2019 11:40

Вы можете добавить галочку после строки, где для этого установлено $redirect_url. Проверьте, что я пишу здесь, не будет правильно обрабатывать запросы с параметрами запроса, но, возможно, это не проблема: if (substr($redirect_url, -1) != '/') { $redirect_url .= '/'; }

Patrick Fay 07.04.2019 12:06

К сожалению, это не работает, я пытался поставить его после $redirect_url = get_option('home') . preg_replace('%'.$matches[0].'%', $redirect_to, $request_uri);, но ничего не изменилось, управление игнорируется. В этом случае нет проблем с параметрами запроса. В любом случае большое спасибо!

wrls 07.04.2019 12:41

Я открыл еще один вопрос, потому что это другая проблема, и она должна помочь другим пользователям. Если хотите, можете проверить это здесь stackoverflow.com/questions/55558409/…

wrls 07.04.2019 13:19

Другие вопросы по теме