Как убрать слэш в htaccess? Или склеиваем дубли.

Все знают, что дубли это плохо, при их большом количестве можно сильно пострадать, особенно от Яндекса. Итак, я попробую дать ответ на то, как убрать часть дублей в ЛС. А если кто поможет убрать другую часть дублей — буду премного благодарен!

Убираем дубли типа ваш сайт/blog и ваш сайт/blog/ — как видите, здесь отличие только в слэше в конце. Нужно эти страницы склеить. Я предлагаю сделать так, чтобы в конце всегда был слэш, написать в .htaccess:


RewriteCond %{REQUEST_URI} (.*/[^/.]+)($|\?)
RewriteRule .* %1/ [R=301,L]


Но в таком случае (да и по умолчанию, если код указанный выше не писать), остается еще часть дублей — это сами статьи. Каждая статья доступна по двум адресам:

название статьи.html и название статьи.html/

Как видите, есть в конце слэш, и все статьи со слешем есть в индексе Яндекса. На этом сайте, кстати, тоже. Как решить эту склейку, я не знаю. Поэтому, предлагаю решить ее вместе.

27 комментариев

avatar
Народ, ну неужели никого не волнует склеивание таких дублей? Неужели никто не знает, что поисковые системы за дубли страниц впаивают фильтры, и идет ранжирование хужее намного? Давайте вместе решим вторую проблему, с дублями вида название статьи.html и название статьи.html/
avatar
Погугли, там полно на эту тему.
avatar
В гугле есть это решение
RewriteRule ^(.*\.html)/$ $1 [R=301,L]
но оно не делает склейку, а создает 404 по непонятному адресу.
avatar
Поставь NiceURL убери разширение html, и выйдет всё красиво.

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/photoset/(.*)$
RewriteRule ^(.*[^/])$ $1/ [R=301,L]
avatar
во-первых, «раСширение».
во-вторых, почему нельзя тоже с «html» сделать?
avatar
Я банально опечатался с расширением.

Я не написал, что нельзя. Тоже самое можно сделать и с расширением html. Если /page.html/ в адресе устраивает, то можешь и так оставить. Раширение html на конце, если такого файла на сервере физически не существует, увеличивает на доли секунды время загрузки страницы. Само раширение на конце никаких плюсов не даёт.
avatar
Страницы будут открывать по адреса без слэша, но их будет на точно такой же адрес с добавленным слешем. Поисковик проиндексирует страницу только после 301 редиректа со слешем.

Если он попадёт на страницу без слэша его также перебросит на страницу со слэшем, как и пользователя.

В конфиге NiceURL вот так делай:

$config['url'] = '/%title%/';
$config['url_postfix'] = '';
avatar
я этот вопрос не давно задавал на хабре :) кстати, вот мой вопрос
habrahabr.ru/qa/31079/

не оттуда взяли ?? :)) htaccess это адски сложная задача и подумал сделать на nginx

я вообще решил что для
avatar
Ну вот, интересно как решить и другие пункты которые там вы перечислили. Взял я не оттуда, видимо одна и та же мысли к нам пришла одновременно. Хотя в инете эта проблема поднимается и поднимается, а решено не много из нее. Правда, про пункт 5 я даже не подумал.

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

Вообще, хочу узнать как убрать слеш в конце html ну и ваш пункт 5. Но вы чего-то тут не дописали, что вы решили?
avatar
я тоже не смог реализовать это и сейчас мы думаем может будет лучше сделать через nginx
avatar
Ты хочешь переадресовывать все страницы /page.html/ на page.html?

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

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !^/photoset/(.*)$
RewriteCond %{REQUEST_URI} !^(.*).html$
RewriteRule ^(.*[^/])$ $1/ [R=301,L]
avatar
Не работает.
avatar
Попробуй первую строку с обратным слешэм перед точкой вот так

RewriteCond %{REQUEST_URI} ^(.*)\.html/$
avatar
От куда берутся ссылки на статьи вида «статьи.html/»
Можно подставить любой get параметр и получить произвольный «дубль» топика, например, «статьи.html?blabla»
Достаточно прописать canonical на урл топика
  • ort
  • 0
avatar
В WP такой траблы нет статьи.html?blabla Но как это решить с ЛС, если этих урлов более 200, 300… а 1000? Для каждого прописывать canonical? И где, и как?
avatar
В WP такой траблы нет статьи.html?blabla
подробнее?
avatar
В WP блог у знакомого, и у него там все адреса доступны только по адресу статьи.html, а по статьи.html/ перебрасывает на статьи.html Он нигде ничего не менял в движке, и не правил никаких файлов, потому как просто в этом ничего не понимает.
avatar
я говорю не про "/", а про get параметры "?params=12345"

вот стандартный блог ВП — yourbrainonecon.wordpress.com/2012/12/07/the-debt-bias-or-how-good-reforms-do-bad-things-to-good-people/, а вот «дубль» yourbrainonecon.wordpress.com/2012/12/07/the-debt-bias-or-how-good-reforms-do-bad-things-to-good-people/?params=12345

и это глупо решать через .htaccess или robots.txt
avatar
Для каждого прописывать canonical? И где, и как?
нет, вот решение — github.com/livestreet/livestreet/commit/23f1a21d231b3cfbc8e4e8e48fef1c4fe3eedcef
avatar
При добавлении этой строки выдается при входе в топик:
Fatal error: Uncaught exception 'Exception' with message 'Undefined method module: SetHtmlCanonical' 
и так далее
avatar
Хотя, может дело в версии ЛС, она 0.5.1
avatar
Да, на 1.0.1 все работает, спасибо!
avatar
Это от дублей не спасает по себе знаю
комментарий был удален
комментарий был удален
avatar
Рабочий вариант

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !(.html)$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]
avatar
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !(.*)/$
RewriteCond %{REQUEST_URI} !(.html)$
RewriteRule ^(.*[^/])$ $1/ [L,R=301]

У меня не пошло НО:
RewriteRule tag/(.*[^/])$ http://site.info/tag/$1/? [L,R=301]

— для стрниц тегок какраз оно
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.