Чистые адреса страниц (Clean URL) на WordPress

И вновь приветствую своих читателей и подписчиков на страницах Блога Свободного Вебмастера! Если вы остановили свой выбор на WordPress в качестве системы управления контентом, то наверняка знаете, что эта CMS генерирует динамические страницы и зачастую на конце URL некоторые страницы содержат различные параметры.

Чистые адреса страниц на WordPress (Clean URL)

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

Поиски практического решения для удаления параметров из URL у меня начались весной текущего года, когда в результате включения древовидных комментариев мне пришлось столкнуться с некоторыми трудностями, а именно с появлением в индексе поисковых систем страниц с параметром replytocom. Проблема была решена, но последствия продолжали настораживать и сейчас постараюсь разъяснить ситуацию.

Что такое Clean URL и почему это важно

Многие вебмастера знают о таком факторе, как количество страниц сайта, находящихся под фильтром поисковой системы Google — это страницы, которые проиндексированы, но не участвуют в основном поиске.

Не будем спорить о существовании основного и дополнительного индекса поисковой системы, речь пойдёт о другом. Давайте проверим количество страниц сайта, проиндексированных в Google, путём ввода поискового запроса с параметром &:

site:https://webliberty.ru/&

А теперь тот же самый запрос с параметром *:

site:https://webliberty.ru/*

Поисковые результаты первого и второго запросов, как правило, отличаются друг от друга. После моих приключений с replytocom процент страниц под фильтром заметно увеличился, достигнув практически 90%, в то время как процент страниц в основном индексе стремительно сократился.

У меня, естественно, паника и возмущение. Да что же такое происходит! Чтобы исключить лишние страницы из поиска добавил правила индексации в robots.txt, но изменений не происходило. В панели инструментов для вебмастеров Google на вкладке с ошибками сканирования появлялись страницы с replytocom, которых в принципе быть не должно, ведь на тот момент я отключил древовидные комментарии.

Тогда мне пришло в голову жёстко ограничить возможность появления динамических параметров в адресах страниц и сделать «чистые» URL. Прошерстил исходники CMS, определил файл где формируется данный параметр и вырезал всё «ненужное». Эксперимент с треском провалился, так как при обновлении WordPress откатывались все изменения и повторять процедуру каждый раз после обновления — это не выход из сложившейся ситуации.

Чистые ссылки (Clean URL) — это ссылки, которые не содержат в своём адресе параметров запроса к базе данных, а вместо этого содержат только путь к документу (странице). Используются в целях поисковой оптимизации (SEO), а также для создания человеко-понятной структуры постоянных ссылок.

С термином Clean URL мне впервые удалось столкнуться при знакомстве с Drupal, где эта функция встроена в движок и может включаться/выключаться одним щелчком кнопки мыши, в то время как на WordPress подобного решения «из коробки» не существует. Чуть больше года назад передо мной стояла задача выбора CMS для блога и тогда мне довелось оценить это преимущество Drupal перед другими системами.

Как удалить параметры из URL на WordPress

Единственным правильным решением в моём случае оказалось использование 301 редиректа. Для того, чтобы исключить динамические параметры из адресов страниц на WordPress, необходимо добавить несколько строк в файл .htaccess на сервере:

<ifmodule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} .
RewriteCond %{QUERY_STRING} !^(s|p|wp-subscription-manager)=.*
RewriteCond %{REQUEST_URI} !.*wp-admin.*
RewriteRule ^(.*)$ /$1? [R=301,L]
</ifmodule>
Внимание! Данный код не работает на WordPress 5.0 и выше, решение предназначено для более ранних версий! Дополнительные сведения опубликованы ниже по тексту.

Сразу хочу предупредить, что в зависимости от структуры сайта и ваших настроек возможно потребуется доработка кода. Обязательно выполните резервное копирование перед любыми изменениями, все действия вы выполняете на собственный страх и риск, автор ответственности не несёт.

В 4 строке приведённого выше кода в скобках указаны параметры, которые следует игнорировать в случае их обнаружении в URL-адресе и не производить редирект:

  • параметр s используется на страницах поиска по сайту;
  • параметр p является основным в адресе страницы;
  • параметр srek используется плагином Subscribe to Comments Reloaded, который создаёт страницу для управления подписками.

Этим список далеко не ограничивается и должен дополняться при обнаружении нарушения работоспособности сайта в каждом конкретном случае. Собственно говоря, последний параметр srek из примера мне пришлось добавлять после того случая, когда один из комментаторов обратился ко мне с проблемой, что он не имеет возможности отказаться от подписки на новые комментарии к записям.

Привожу цитату его обращения:

Как удалить подписку на комментарии? Удали мою почту из базы! Я перехожу по ссылке для редактирования подписки, однако перекидывает на главную страницу, а письма продолжают приходить. Достало уже!

Опытным путём я выяснил, что действительно, происходит редирект на главную страницу, вместо показа страницы с управлением подписками. Приношу свои извинения за доставленные неудобства, теперь эта ошибка устранена и вы можете беспрепятственно редактировать свои подписки 😳

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

Результаты использования Clean URL на сайте

Спустя определённое время ситуация с процентным соотношением количества страниц в основном поиске и страниц под фильтром заметно улучшилась. В панели инструментов Google в течение нескольких дней пропали все упоминания про replytocom, в том числе и ошибки сканирования страниц с этим параметром, помеченные как исключенные файлом robots.txt.

Чистые адреса страниц сократили число ошибок сканирования роботом Google

На скрине видно минимальное число заблокированных страниц файлом robots.txt, в то время как до использования Clean URL их число достигало 500 и более, возрастая по мере появления новых комментариев.

Привожу графические данные, полученные в панели Яндекс Вебмастер, они очень наглядно отражают итоговый результат:

Число страниц, исключённых роботом

На графике виден период, берущий начало с конца марта или начала апреля и заканчивающийся в августе, за который резко возросло количество страниц, загруженных поисковым роботом, но исключённых из поиска (синий график).

Именно в августе я начал использовать чистые адреса страниц с удалёнными динамическими параметрами WordPress, с этого момента синий график пошёл вниз, тем самым практически выровняв число загруженных и проиндексированных страниц. По-моему, достойный результат 🙂

  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
(1 голос, в среднем: 5 из 5)
  1. Ahawks

    Тема интересная, но можно вопрос не по теме?) А почему добавил ты свой блог в ЯК в раздел веб дизайн, а не продвижение сайтов? Вот на днях выведу деньги и попробую тоже свой сайт добавить в ЯК и думаю в какой каталог его засунуть.

    Ответить

  2. Webliberty

    Ahawks, а он у меня в двух рубриках находится: в веб-дизайне и продвижении 😉 Подробнее об этом здесь. Рубрику выбирает сам модератор при рассмотрении заявки, самому выбрать не получится. Удачи!

    Ответить

  3. Ahawks

    Спасибо! Предыдущий пост не так внимательно читал) Будем надеяться, что возьмут и рубрику выберут нормальную. А пока деньги перечисляются попробую как-нибудь улучшить внешний вид, убрать лишнее, может чего нибудь добавить нового)

    Ответить

  4. san4izl

    Вот так статья! Спасибо. Действительно ценная инфа. Хотя сам никогда не сталкивался с такой проблемой. Также хотелось бы почитать статью про то, как вытаскивать из соплей гугла страницы. Благодарю, что отреагировал на мою проблему!

    Ответить

  5. Webliberty

    san4izl, мне было интересно писать этот пост, ведь на протяжении нескольких месяцев, начиная с лета, отслеживал свое положение. Так получается, что на восстановление в Гугле после неверных действий у меня ушло почти пол года… Теперь отношусь более внимательнее к своим действиям. Спасибо тебе за подсказку, благодаря ей внес некоторые изменения в код. А другие промолчали, возможно также хотели отписаться от новых комментариев к какому-то посту, но не дали знать о проблеме.

    Ответить

  6. swede1987

    Еще хотелось бы добавить — очень к месту может подойти специальный плагин WordPress, который добавляет в URL .html
    Он так и называется: html on PAGES

    Ответить

  7. Webliberty

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

    В админке WordPress найти Настройки >> Постоянные ссылки. Выбрать Произвольно и в текстовое поле вставить:

    /%postname%.html

    Ответить

  8. ladybloger

    Да, кстати, меня тоже раздражает, когда нельзя отказаться от подписки на комментарии к той теме, которая уже перестала по каким-то причинам интересовать.

    Вот иной раз боюсь ставить галочку — уведомлять о новых комментариях. А то потом в почте писем не сыщешь — одни комментарии 😐

    Ответить

  9. Webliberty

    ladybloger, если такая ситуация возникает, то нужно предупредить автора, возможно он не знает о такой проблеме…

    Ответить

  10. aleksandr

    Здравствуйте! У меня похожая проблема, но только с фидами. «Replytocom» запретил в robots.txt и они больше не индексируется, а все остальное лезет с каждой публикацией. Посоветуйте?

    Ответить

  11. Webliberty

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

    В файле /wp-includes/feed-rss2-comments.php я удалил все содержимое и вставил вместо него:

    <?php
    header("HTTP/1.0 404 Not Found");
    exit;
    ?>

    Таким образом все фиды к каждой странице отдают 404 (основной фид при этом не пострадает) и через пару недель отвалились и из выдачи и из логов Гугла с Яндексом. При этом я убрал из роботса строку

    Disallow: /feed/

    иначе робот не узнает что страницы не существуют и по-прежнему будет их держать.

    Ответить

  12. aleksandr

    Спасибо большое! Буду пробовать. В wordpress с этим у многих проблема, после того как я заметил у себя дубли, стал смотреть как у других. Интересно, что блоги разного уровня, а проблема одна и та же. Если знаете решение: как избавится от дублей в WordPress, то многим поможете в этом. Пока в сети правильного решения этой проблемы я не нашел

    Ответить

  13. Webliberty

    aleksandr, решение есть всегда! В основном это robots.txt, если не помогает, то стоит искать дополнительные решения. Я для избавления от дублей пользуюсь роботсом, Clean URL, инструментами в панели для вебмастеров Гугла (исключение параметров) и путем эксперимента, связанного с редактирование исходников (по аналогии с индексацией фидов).

    Ответить

  14. Дмитрий

    Огромное Человеческое Спасибо Тебе Денис! Ведь как-то начинал читать эту статью, да не дочитал, думал меня не каснется, а оказалось как раз таки наоборот. У меня как раз проблема с урлом на конце /feed/. Попробовал сделал по Твоему совету, посмотрим, пропадут лишние дубли страниц.

    Денис, только у меня возник вопрос: мне нужно только заменить код в файле /wp-includes/feed-rss2-comments.php и из robots.txt убрать Disallow: /feed/, больше ничего делать не нужно? Урлы сами пропадут или еще что-то нужно делать?

    Ответить

  15. Webliberty

    Дмитрий, в принципе все верно, такие страницы после изменений отдают 404 ошибку и со временем робот ПС удалит их из индекса сам. Но можно ускорить это дело, удаляя вручную каждый лишний проиндексированный УРЛ, а 404 код страницы дает полное право на удаление. Удаление ручным запросом происходит в течение суток, а если ждать, то может и месяц уйти.

    Ответить

  16. Дмитрий

    Спасибо Денис! Теперь стало все понятно 😉

    Ответить

  17. Владислав

    Если у тебя отсутствуют древовидные комментарии, то как сделать кнопку — «ответить»?

    После того, как прописал в файл .htaccess, при нажатии на рубрику картинки перестали отображаться, не подскажешь, могли ли эти поправки так повлиять?

    Ответить

  18. Webliberty

    Владислав, о том как сделать кнопку ответить могу предложить почитать здесь, а остальные вопросы мы с Вами уже обсудили по почте.

    Для тех, у кого возникают подобные вопросы: внимательно изучайте структуру страниц, как формируются ссылки, куда ведут ссылки на изображения и в случае когда в url присутствует динамическая составляющая, которую не нужно блокировать добавляйте ее в исключения. Пример как это сделать я приводил на плагине Subscribe To Comments, все остальное — по аналогии.

    Ответить

  19. Alex

    Заметил, что после добавления в хатцес кода перестал работать go.php. В чем может быть проблема? Временно пришлось удалить код 🙁

    Ответить

  20. Webliberty

    Alex, внимательно посмотрите на URL, возможно для ссылок, проходящих через go.php, потребуется добавить какой-то параметр в исключения. Пример как это сделать приведен в статье.

    Ответить

  21. Alex

    Webliberty, я если честно, так и не понял, какой параметр мне присвоить. Ссылка у меня идет следующего вида:

    мой_сайт//чужой_сайт.ru/

    После установки кода в хатцесс редирект открывался, но в нем не отображалась ссылка для перехода, соответственно посетитель никуда не мог перейти. Грешу на конфликт кода. Можете взглянуть?

    Ответить

  22. Webliberty

    Alex, никаких конфликтов, просто Вы не прислушались и по аналогии со статьей не добавили параметр в исключение. В такой ссылке параметром после знака вопроса является url — добавьте его в строку, тогда такие ссылки должны нормально работать:

    RewriteCond %{QUERY_STRING} !^(s|p|srek|url)=.*

    Ответить

  23. Aleks

    К исключениям нужно еще добавить page_id и preview. Иначе не будет работать предпросмотр статей.

    Ответить

  24. Webliberty

    Странно, но у меня работает предпросмотр записей. В URL вида ?p=1&preview=true есть параметр p, который добавлен в исключения. А для предпросмотра страниц, действительно нужно добавить page_id, спасибо, добавил в статью.

    Ответить

  25. Alex

    Добрый вечер. Опять стучусь в надежде на помощь. Решил поставить себе на сайт скрипт анонимайзера для личных нужд. Почему-то конфликтует с кодом (((

    Скрипт генерирует следующий урл:

    мой_сайт.ru/папка_анонимайзера%2FDhaRY2&b=29

    По логике, я должен u добавить в исключения. Добавил, но все равно отказывается работать. В чем может быть проблема? Подскажите пожалуйста 😳

    Ответить

  26. Webliberty

    Возможно кэш? По логике вещей Вы сделали правильно и должно работать)

    Ответить

  27. Gameportal.co

    Здравствуйте!
    Не так давно нашел ваш сайт и уже множество статей перечитал, некоторые очень помогли, спасибо! У меня возник вопрос, в целом не один, который меня уже долгое время заботит.

    С недавних пор я решил установить BuddyPress и потом переустановил его, насколько помню… После этого заметил такую вещь: /polzovateli-2/admin/

    Эта приставка пользователи-2, должно же быть юзеры или просто пользователи, как поменять этот путь, желательно без ущерба… там больше этих страниц и после удаления bbpress, также остались keymaster, moderator и т.д. Еще и гугл индексирует их, как я понял.

    Как избавиться от всего этого мусора и пути почистить? Вообще у меня много бяки на сайте, все в режиме тестирования, но пока это наиболее беспокоящее…

    Ответить

  28. Webliberty

    Здравствуйте! Не понял, BuddyPress все-таки был переустановлен или удален? Если удален, то ищите в консоли подобные страницы и удаляйте вручную, также почистите базу данных, в категории Ускорение сайта есть несколько статей на эту тему.

    Ответить

  29. Gameportal

    Webliberty, я установил, потом удалил…что-то мне не понравилось… потом снова установил и сейчас он работает. Мне не нравится «polzovateli-2», можно же без крови, аккуратно заменить в адреса, только где они и как это сделать?

    Далее я устанавливал bbpress (форум), но посмотрел и удалил, а в админке остался всякий мусор, соответственно и в БД, типа групп пользователей — keymaster, moderator и т.д. Как это убрать?

    Ответить

  30. Webliberty

    К сожалению, я не устанавливал BuddyPress, поэтому не могу подсказать где и что конкретно править. Но думаю, что это осуществимо. Попробуйте обратиться на страницу поддержки этого плагина или официальный русскоязычный форум.

    Что касается BbPress, то можете смело удалять в админке все, что с ним связано. Затем откройте БД и вручную удалите связанные с ним таблицы. Но обязательно делайте резервную копию. Чтобы не удалить лишнего, посмотрите какие стандартные таблицы содержит база данных WordPress, но имейте в виду, что различные плагины также могут создавать свои таблицы.

    Правильным решением было бы восстановить резервную копию после установки и удаления BbPress, тогда БД осталась бы чистой. Но время уже упущено, имейте в виду эту возможность на будущее.

    Форум я рекомендую устанавливать в качестве отдельного движка, во вложенную папку или на поддомен, чтобы не было путаницы. На одном из своих сайтов у меня установлен форум на phpBB, могу его рекомендовать.

    Ответить

  31. Gameportal

    Webliberty, со скрипом нашел в бд код:

    lvrs_usermeta` SET `meta_value` = ‘a:2:{s:13:\»administrator\»;s:1:\»1\»;s:13:\»bbp_keymaster\»;b:1;}’ WHERE `lvrs_usermeta`.`umeta_id` = 12;

    Попробовал удалить часть, сразу вылазят ошибки и теряется доступ к админке… Как phpBB интегрировать в ВП? Сильно сложно или там нет интеграции вовсе?

    Ответить

  32. Webliberty

    В базе наверняка есть зависимости и при неполном удалении происходит сбой.

    Выполнить интеграцию можно, на русскоязычном форуме phpBB есть подходящее решение.

    Ответить

  33. Koizy

    Денис, здравствуйте. Подскажите пожалуйста, данное решение актуально в последних версиях WP ?

    Ответить

  34. Webliberty

    Koizy, здравствуйте! Лично не проверял, но на форуме поддержки была тема, что использование этого кода влечёт за собой появление ошибки. Возможно требуется добавить исключения. Обновил статью и добавил предупреждение о несовместимости с WordPress 5.0 и выше.

    Для редиректа со страницы с параметром replytocom на каноническую для актуальной версии WordPress в настоящее время использую такой сокращённый вариант кода в файле .htaccess:

    RewriteCond %{QUERY_STRING} replytocom=
    RewriteRule ^(.*)$ /$1? [R=301,L]

    Ответить

:) ;) :D :( :cry: :| :o :P 8-) :oops: :roll: :idea:

Отправляя комментарий, вы соглашаетесь с политикой конфиденциальности.