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

#php #wordpress #redirect

#php #wordpress #перенаправление

Вопрос:

у меня проблема с функцией 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 , также перенаправляются на родительский источник. Спасибо за помощь.

Комментарии:

1. 000000 это строка, а не число. Строки могут начинаться с 0, числа — нет

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

Ответ №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 при проверке if.

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

Комментарии:

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

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

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

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

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