@hoffman7075

Почему wordpress не отдает 404 по определенному url?

Здравствуйте!
Есть страница с url sitename.ru/uslugi/
Если перейти по адресу sitename.ru/uslugi/asdfdsf то 404 отдается правильно
Если же переходить по адресу sitename.ru/uslugi/21341234 то отдает 200 и отображает страницу sitename.ru/uslugi/ , хотя по логике должна быть 404
Это касается не только страницы uslugi, но и всех остальных.
Что нужно прописать чтобы все таки приходила 404?
  • Вопрос задан
  • 1318 просмотров
Пригласить эксперта
Ответы на вопрос 2
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
Внимательно посмотрите на регулярку слева, и на маппинг справа:
(.?.+?)(?:/([0-9]+))?/?$ -> index.php?pagename=$matches[1]&page=$matches[2]


Это - основное правило (rewrite rule) для страниц WordPress. Как оно работает:

- /page-name/ - страница первого уровня
- /page-name/sub-page-name/ - страница второго уровня (дочерняя, вложенная)
- /page-name/sub-page-name/sub-sub-page-name/ - страница третьего уровня (и это не предел)

В этих случае маппинг выдаст, соответственно:
pagename=page-name
page=

pagename=page-name/sub-page-name
page=

pagename=page-name/sub-page-name/sub-sub-page-name
page=


и WP_Query будет запрашивать такие страницы. В вашем случае страница uslugi/asdfdsf, как дочерняя страницы uslugi – не существует. Отсюда и 404, все логично. Вот пример:

5a134b88e6c47515219426.jpeg

Если же ввести число, сработает другая часть регулярки:

- /page-name/123/

будет замаплен в:
pagename=page-name
page=123


Чувствуете разницу? Вторая переменная, $page теперь заполнилась. Это нужно для разбивки контента страницы. WordPress позволяет вам разместить на странице какой-то длинный текст/контент, и разбить его на странички. Именно эта часть регулярки отвечает за постраничный вывод.

Но поскольку в сам WP_Query отправляется запрос на получение контента страницы целиком, а постраничная разбивка происходит уже на лету, то и ответ 200 вполне логичен. Как и вывод одного и того же контента, независимо от номера страницы.

Вот пример такого запроса. Обратите внимание на установленные переменные:

5a134cea181ae872567841.jpeg

Так работают стандартные rewrite rules WordPress. Что делать? Можно хукнуться в один из ранних хуков, например template_redirect, проверить контент на предмет постранички, и сделать редирект на 404. Но, зачем?
Ответ написан
maxxannik
@maxxannik
Сайты на WordPress + Интернет магазины WooCommerce
такое иногда бывает при наличии правил окончания. add_rewrite_rule.
например если сделать add_rewrite_rule('21341234', 'EP_PAGES'); то адрес sitename.ru/uslugi/21341234 - будет отдавать 200 и показывать sitename.ru/uslugi/
такова логика по умолчанию. ее можно привести в порядок, но для этого нужно добавлять механику обработки таких окончаний и все необходимые исключения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы