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

Чистые адреса страниц (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
(2 голоса, в среднем: 5 из 5)
Опубликовано 27.11.2011

Комментарии

  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/gо.рhp?url=httр://чужой_сайт.ru/

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

    Ответить

  22. Webliberty:

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

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

    Ответить

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

    Ответить

  24. Webliberty:

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

    Ответить

  25. Alex:

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

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

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

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

    Ответить

  26. Webliberty:

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

    Ответить

  27. Gameportal:

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

    С недавних пор я решил установить 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]

    Ответить

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

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