Чистые адреса страниц (Clean URL) на WordPress
И вновь приветствую своих читателей и подписчиков на страницах Блога Свободного Вебмастера! Если вы остановили свой выбор на WordPress в качестве системы управления контентом, то наверняка знаете, что эта CMS генерирует динамические страницы и зачастую на конце 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 мне впервые удалось столкнуться при знакомстве с 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>
Сразу хочу предупредить, что в зависимости от структуры сайта и ваших настроек возможно потребуется доработка кода. Обязательно выполните резервное копирование перед любыми изменениями, все действия вы выполняете на собственный страх и риск, автор ответственности не несёт.
В 4 строке приведённого выше кода в скобках указаны параметры, которые следует игнорировать в случае их обнаружении в URL-адресе и не производить редирект:
- параметр
s
используется на страницах поиска по сайту; - параметр
p
является основным в адресе страницы; - параметр
srek
используется плагином Subscribe to Comments Reloaded, который создаёт страницу для управления подписками.
Этим список далеко не ограничивается и должен дополняться при обнаружении нарушения работоспособности сайта в каждом конкретном случае. Собственно говоря, последний параметр srek
из примера мне пришлось добавлять после того случая, когда один из комментаторов обратился ко мне с проблемой, что он не имеет возможности отказаться от подписки на новые комментарии к записям.
Привожу цитату его обращения:
Опытным путём я выяснил, что действительно, происходит редирект на главную страницу, вместо показа страницы с управлением подписками. Приношу свои извинения за доставленные неудобства, теперь эта ошибка устранена и вы можете беспрепятственно редактировать свои подписки 😳
Продолжая разбирать код, обращаю ваше внимание на 5 строку, в которой исключается редирект со страниц администрирования, то есть при входе, регистрации и прочих действиях.
Результаты использования Clean URL на сайте
Спустя определённое время ситуация с процентным соотношением количества страниц в основном поиске и страниц под фильтром заметно улучшилась. В панели инструментов Google в течение нескольких дней пропали все упоминания про replytocom
, в том числе и ошибки сканирования страниц с этим параметром, помеченные как исключенные файлом robots.txt.
На скрине видно минимальное число заблокированных страниц файлом robots.txt, в то время как до использования Clean URL их число достигало 500 и более, возрастая по мере появления новых комментариев.
Привожу графические данные, полученные в панели Яндекс Вебмастер, они очень наглядно отражают итоговый результат:
На графике виден период, берущий начало с конца марта или начала апреля и заканчивающийся в августе, за который резко возросло количество страниц, загруженных поисковым роботом, но исключённых из поиска (синий график).
Именно в августе я начал использовать чистые адреса страниц с удалёнными динамическими параметрами WordPress, с этого момента синий график пошёл вниз, тем самым практически выровняв число загруженных и проиндексированных страниц. По-моему, достойный результат 🙂
Тема интересная, но можно вопрос не по теме?) А почему добавил ты свой блог в ЯК в раздел веб дизайн, а не продвижение сайтов? Вот на днях выведу деньги и попробую тоже свой сайт добавить в ЯК и думаю в какой каталог его засунуть.
Ответить
Ahawks, а он у меня в двух рубриках находится: в веб-дизайне и продвижении 😉 Подробнее об этом здесь. Рубрику выбирает сам модератор при рассмотрении заявки, самому выбрать не получится. Удачи!
Ответить
Спасибо! Предыдущий пост не так внимательно читал) Будем надеяться, что возьмут и рубрику выберут нормальную. А пока деньги перечисляются попробую как-нибудь улучшить внешний вид, убрать лишнее, может чего нибудь добавить нового)
Ответить
Вот так статья! Спасибо. Действительно ценная инфа. Хотя сам никогда не сталкивался с такой проблемой. Также хотелось бы почитать статью про то, как вытаскивать из соплей гугла страницы. Благодарю, что отреагировал на мою проблему!
Ответить
san4izl, мне было интересно писать этот пост, ведь на протяжении нескольких месяцев, начиная с лета, отслеживал свое положение. Так получается, что на восстановление в Гугле после неверных действий у меня ушло почти пол года… Теперь отношусь более внимательнее к своим действиям. Спасибо тебе за подсказку, благодаря ей внес некоторые изменения в код. А другие промолчали, возможно также хотели отписаться от новых комментариев к какому-то посту, но не дали знать о проблеме.
Ответить
Еще хотелось бы добавить — очень к месту может подойти специальный плагин WordPress, который добавляет в URL
.html
Он так и называется: html on PAGES
Ответить
Кстати, можно без плагинов задать произвольную структуру адресов страниц в настройках админки, только делать это нужно опять таки в самом начале, чтобы проиндексированные страницы не выпали из поиска.
В админке WordPress найти Настройки >> Постоянные ссылки. Выбрать Произвольно и в текстовое поле вставить:
Ответить
Да, кстати, меня тоже раздражает, когда нельзя отказаться от подписки на комментарии к той теме, которая уже перестала по каким-то причинам интересовать.
Вот иной раз боюсь ставить галочку — уведомлять о новых комментариях. А то потом в почте писем не сыщешь — одни комментарии 😐
Ответить
ladybloger, если такая ситуация возникает, то нужно предупредить автора, возможно он не знает о такой проблеме…
Ответить
Здравствуйте! У меня похожая проблема, но только с фидами. «Replytocom» запретил в robots.txt и они больше не индексируется, а все остальное лезет с каждой публикацией. Посоветуйте?
Ответить
aleksandr, у меня как то тоже вдруг ни с того ни с сего вмиг все фиды вошли в индекс и гугла и яндекса, хотя и были запрещены в роботсе. Ситуацию решил также кардинальным образом.
В файле /wp-includes/feed-rss2-comments.php я удалил все содержимое и вставил вместо него:
<?php header("HTTP/1.0 404 Not Found"); exit; ?>
Таким образом все фиды к каждой странице отдают 404 (основной фид при этом не пострадает) и через пару недель отвалились и из выдачи и из логов Гугла с Яндексом. При этом я убрал из роботса строку
Disallow: /feed/
иначе робот не узнает что страницы не существуют и по-прежнему будет их держать.
Ответить
Спасибо большое! Буду пробовать. В wordpress с этим у многих проблема, после того как я заметил у себя дубли, стал смотреть как у других. Интересно, что блоги разного уровня, а проблема одна и та же. Если знаете решение: как избавится от дублей в WordPress, то многим поможете в этом. Пока в сети правильного решения этой проблемы я не нашел
Ответить
aleksandr, решение есть всегда! В основном это robots.txt, если не помогает, то стоит искать дополнительные решения. Я для избавления от дублей пользуюсь роботсом, Clean URL, инструментами в панели для вебмастеров Гугла (исключение параметров) и путем эксперимента, связанного с редактирование исходников (по аналогии с индексацией фидов).
Ответить
Огромное Человеческое Спасибо Тебе Денис! Ведь как-то начинал читать эту статью, да не дочитал, думал меня не каснется, а оказалось как раз таки наоборот. У меня как раз проблема с урлом на конце
/feed/
. Попробовал сделал по Твоему совету, посмотрим, пропадут лишние дубли страниц.Денис, только у меня возник вопрос: мне нужно только заменить код в файле /wp-includes/feed-rss2-comments.php и из robots.txt убрать Disallow: /feed/, больше ничего делать не нужно? Урлы сами пропадут или еще что-то нужно делать?
Ответить
Дмитрий, в принципе все верно, такие страницы после изменений отдают 404 ошибку и со временем робот ПС удалит их из индекса сам. Но можно ускорить это дело, удаляя вручную каждый лишний проиндексированный УРЛ, а 404 код страницы дает полное право на удаление. Удаление ручным запросом происходит в течение суток, а если ждать, то может и месяц уйти.
Ответить
Спасибо Денис! Теперь стало все понятно 😉
Ответить
Если у тебя отсутствуют древовидные комментарии, то как сделать кнопку — «ответить»?
После того, как прописал в файл .htaccess, при нажатии на рубрику картинки перестали отображаться, не подскажешь, могли ли эти поправки так повлиять?
Ответить
Владислав, о том как сделать кнопку ответить могу предложить почитать здесь, а остальные вопросы мы с Вами уже обсудили по почте.
Для тех, у кого возникают подобные вопросы: внимательно изучайте структуру страниц, как формируются ссылки, куда ведут ссылки на изображения и в случае когда в url присутствует динамическая составляющая, которую не нужно блокировать добавляйте ее в исключения. Пример как это сделать я приводил на плагине Subscribe To Comments, все остальное — по аналогии.
Ответить
Заметил, что после добавления в хатцес кода перестал работать go.php. В чем может быть проблема? Временно пришлось удалить код 🙁
Ответить
Alex, внимательно посмотрите на URL, возможно для ссылок, проходящих через go.php, потребуется добавить какой-то параметр в исключения. Пример как это сделать приведен в статье.
Ответить
Webliberty, я если честно, так и не понял, какой параметр мне присвоить. Ссылка у меня идет следующего вида:
мой_сайт.ru/gо.рhp?url=httр://чужой_сайт.ru/
После установки кода в хатцесс редирект открывался, но в нем не отображалась ссылка для перехода, соответственно посетитель никуда не мог перейти. Грешу на конфликт кода. Можете взглянуть?
Ответить
Alex, никаких конфликтов, просто Вы не прислушались и по аналогии со статьей не добавили параметр в исключение. В такой ссылке параметром после знака вопроса является
url
— добавьте его в строку, тогда такие ссылки должны нормально работать:RewriteCond %{QUERY_STRING} !^(s|p|srek|url)=.*
Ответить
К исключениям нужно еще добавить
page_id
иpreview
. Иначе не будет работать предпросмотр статей.Ответить
Странно, но у меня работает предпросмотр записей. В URL вида
?p=1&preview=true
есть параметрp
, который добавлен в исключения. А для предпросмотра страниц, действительно нужно добавитьpage_id
, спасибо, добавил в статью.Ответить
Добрый вечер. Опять стучусь в надежде на помощь. Решил поставить себе на сайт скрипт анонимайзера для личных нужд. Почему-то конфликтует с кодом (((
Скрипт генерирует следующий урл:
мой_сайт.ru/папка_анонимайзера/browse.php?u=7NNIxDS%2FDhaRY2&b=29
По логике, я должен
u
добавить в исключения. Добавил, но все равно отказывается работать. В чем может быть проблема? Подскажите пожалуйста 😳Ответить
Возможно кэш? По логике вещей Вы сделали правильно и должно работать)
Ответить
Здравствуйте!
Не так давно нашел ваш сайт и уже множество статей перечитал, некоторые очень помогли, спасибо! У меня возник вопрос, в целом не один, который меня уже долгое время заботит.
С недавних пор я решил установить BuddyPress и потом переустановил его, насколько помню… После этого заметил такую вещь: /polzovateli-2/admin/
Эта приставка пользователи-2, должно же быть юзеры или просто пользователи, как поменять этот путь, желательно без ущерба… там больше этих страниц и после удаления bbpress, также остались keymaster, moderator и т.д. Еще и гугл индексирует их, как я понял.
Как избавиться от всего этого мусора и пути почистить? Вообще у меня много бяки на сайте, все в режиме тестирования, но пока это наиболее беспокоящее…
Ответить
Здравствуйте! Не понял, BuddyPress все-таки был переустановлен или удален? Если удален, то ищите в консоли подобные страницы и удаляйте вручную, также почистите базу данных, в категории Ускорение сайта есть несколько статей на эту тему.
Ответить
Webliberty, я установил, потом удалил…что-то мне не понравилось… потом снова установил и сейчас он работает. Мне не нравится «polzovateli-2», можно же без крови, аккуратно заменить в адреса, только где они и как это сделать?
Далее я устанавливал bbpress (форум), но посмотрел и удалил, а в админке остался всякий мусор, соответственно и в БД, типа групп пользователей — keymaster, moderator и т.д. Как это убрать?
Ответить
К сожалению, я не устанавливал BuddyPress, поэтому не могу подсказать где и что конкретно править. Но думаю, что это осуществимо. Попробуйте обратиться на страницу поддержки этого плагина или официальный русскоязычный форум.
Что касается BbPress, то можете смело удалять в админке все, что с ним связано. Затем откройте БД и вручную удалите связанные с ним таблицы. Но обязательно делайте резервную копию. Чтобы не удалить лишнего, посмотрите какие стандартные таблицы содержит база данных WordPress, но имейте в виду, что различные плагины также могут создавать свои таблицы.
Правильным решением было бы восстановить резервную копию после установки и удаления BbPress, тогда БД осталась бы чистой. Но время уже упущено, имейте в виду эту возможность на будущее.
Форум я рекомендую устанавливать в качестве отдельного движка, во вложенную папку или на поддомен, чтобы не было путаницы. На одном из своих сайтов у меня установлен форум на phpBB, могу его рекомендовать.
Ответить
Webliberty, со скрипом нашел в бд код:
Попробовал удалить часть, сразу вылазят ошибки и теряется доступ к админке… Как phpBB интегрировать в ВП? Сильно сложно или там нет интеграции вовсе?
Ответить
В базе наверняка есть зависимости и при неполном удалении происходит сбой.
Выполнить интеграцию можно, на русскоязычном форуме phpBB есть подходящее решение.
Ответить
Денис, здравствуйте. Подскажите пожалуйста, данное решение актуально в последних версиях WP ?
Ответить
Koizy, здравствуйте! Лично не проверял, но на форуме поддержки была тема, что использование этого кода влечёт за собой появление ошибки. Возможно требуется добавить исключения. Обновил статью и добавил предупреждение о несовместимости с WordPress 5.0 и выше.
Для редиректа со страницы с параметром
replytocom
на каноническую для актуальной версии WordPress в настоящее время использую такой сокращённый вариант кода в файле .htaccess:RewriteCond %{QUERY_STRING} replytocom= RewriteRule ^(.*)$ /$1? [R=301,L]
Ответить