У меня проблема с функцией 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
, также будут перенаправлены на родительский источник. Спасибо за помощь.
хорошо, спасибо за ответ, так как я могу изменить код, чтобы он соответствовал строке 0 в URL-адресах?
Вызовы 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) {
Я бы просто удалил if ($ordinal
полностью
я тестировал его без if ($ordinal
, но не повезло. Если я запускаю URL-адрес, например https://www.example.com/how-to-do-that/111
, он работает, как и ожидалось, но если я запускаю https://www.example.com/how-to-do-that/000
, он игнорируется.
О, подождите, я думаю, вам понадобится еще одно изменение, которое я пропустил. Попробуйте изменить эту строку, которая выполняет аналогичную проверку if ($ ordinal): $redirect_to = ($ordinal) ? '/': (($ordinal > $numpages) ? "/$numpages/" : FALSE);
на эту $redirect_to = isset($ordinal) ? '/': (($ordinal > $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, которое вызывает /
? Большое спасибо.
Вы можете добавить галочку после строки, где для этого установлено $redirect_url
. Проверьте, что я пишу здесь, не будет правильно обрабатывать запросы с параметрами запроса, но, возможно, это не проблема: if (substr($redirect_url, -1) != '/') { $redirect_url .= '/'; }
К сожалению, это не работает, я пытался поставить его после $redirect_url = get_option('home') . preg_replace('%'.$matches[0].'%', $redirect_to, $request_uri);
, но ничего не изменилось, управление игнорируется. В этом случае нет проблем с параметрами запроса. В любом случае большое спасибо!
Я открыл еще один вопрос, потому что это другая проблема, и она должна помочь другим пользователям. Если хотите, можете проверить это здесь stackoverflow.com/questions/55558409/…
000000
— это строка, а не число. Строки могут начинаться с 0, числа не могут