Может войдёшь?
Черновики Написать статью Профиль
Lord_Alfred

Lord_Alfred +13

Вступил в наши ряды: 4 апреля 2017

Замечен в последний раз: 5 июля 2017

Оставил на форуме: 31 сообщение и 4 темы

Последнее сообщение: 24 апреля 2017

Сайт: vk.com/lord.alfred

Вы сможете отправить письмо, если войдёте

Статьи (1)

SEOFriendlyPaginator — пагинатор без зеркала первой страницы (?page=1) и несуществующих страниц (?page=999999)

версия 5.4 404 ошибка зеркала версия 5.x пагинатор seo paginator

В стандартном пагинаторе (PHPLengthAwarePaginator) есть пара досадных косяков:

  1. При выводе пагинатора на страницах >= 2 — ссылка на первую страницу идет в виде example.com/?page=1 и это создает «зеркало» страницы для поисковика — тот же самый контент находится и на странице example.com/.
  2. Если зайти на страницу example.com/?page=999999, то мы не увидим 404 страницу ошибки, а просто увидим пустую страницу с пагинатором.

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

Комментарии (5)

Lord_Alfred
  1. Простите, шта ? первый раз об этом слышу.

Всё верно. Гугл зачастую индексирует страницы, которые закрыты в robots.txt, но на них есть ссылки на сайте. Но эти страницы не показывает в результатах поиска, а пишет что-то в духе «содержимое страницы закрыто robots.txt» (это можно встретить при поиске через «site:domain.tld»)

Lord_Alfred

Спасибо за замечания)

  1. но есть два момента, из-за которых вы делаете два запроса вместо одного

и

  1. Нет смысла дополнительно вначале проверять общее число записей в таблице, это можно определить из второго запроса.

Тут тоже на самом деле не всё так просто. Возможно, что у человека, кто потом заберет этот код себе — не будут созданы индексы по фильтрации, которая у меня заложена в методе PHPfiltered(), поэтому sqlSELECT может оказаться в разы медленнее, чем sqlCOUNT. Но это спорно, конечно.

  1. PHPif (count($this->query) > 0) {
  2. Это может вызывать повторный запрос, т.е.

Это из оригинального кода пагинатора) И это не sql query, это get query parameters

  1. внутри paginator будет делаться два запроса (нужно проверить).

Смотрел через debugbar — делается всего 1 count-запрос, не 2.

  1. Здесь вы вначале делаете запрос с COUNT, дальше без, но с LIMIT. А зачем первый запрос вообще нужен?

Первый запрос для того, чтобы выдать 404 ошибку. Как уже выше писал — это из-за скорости (в любом случае COUNT будет быстрее SELECT), поэтому для проверки несуществующих страниц, имхо, лучше использовать его — чтобы не «насиловать» сервер в случае DDOS. Но если переписать код, используя вашу мысль — можно в перспективе сделать кеширование гораздо красивее, чем ещё более сильнее обезопасится от тупого DDOS.

Lord_Alfred

С зеркалами сейчас ситуация такая (сужу по гуглу) — они учитываются, если ссылка стоит с сайта, на который и ссылаются. То есть если на сайте есть ссылки на главную и на первую страницу одновременно (а так и есть в настоящий момент), то это считается зеркалом.

PS: лучше код гляньте, скажите — правильная ли реализация или я что-то не учел или мог бы сделать лучше?

Lord_Alfred

Да, я в курсе, что он на Laravel, поэтому и добавил этот комментарий.

Поисковики учитывают это по-разному, поэтому некоторые плохие люди могут натолкать кучу ссылок со сторонних ресурсов на такие «зеркала» или «пустышки», этим самым пошатнув позиции сайта в серпе.

Lord_Alfred

К слову, эти же огрехи применимы и к текущей версии Habravel:

https://laravel.ru/?page=999999

https://laravel.ru/?page=0

https://laravel.ru/?page=-1000