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

У меня проблема с функцией 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 Ответ

1 голос
/ 07 апреля 2019

is_numeric () вызывает значения, такие как '0000' и '0123', возвращает php в true, и они будут разбиты на 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-адреса, указывающие на проблему?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...