Jump to content

Убираем слэш(и) в конце url и избавляемся от дублей


Recommended Posts

Многие встречаются с проблемой дублей страниц, что в свою очередь негативно влияет на сайт при индексировании его поисковиками. 

 

Для того чтобы избавится от такой проблемы я использовал следующий код:

 

// Убираем слеш в конце ссылок
$uri = preg_replace("/\?.*/i",'', $_SERVER['REQUEST_URI']);
 
if ((!strpos($uri, 'simpla'))  && (strlen($uri)>1)) {
  if (rtrim($uri,'/')!=$uri) {
    header("HTTP/1.1 301 Moved Permanently");
    header('Location: http://'.$_SERVER['SERVER_NAME'].str_replace($uri, rtrim($uri,'/'), $_SERVER['REQUEST_URI']));
    exit();    
  }
} 

 

Приведенный выше код необходимо поместить в файл index.php который находится в корне сайта. ~12 строка.

 

Если у Вас есть решение по лучше, разместите его в ответах данной темы. 
Методы через .htcaccess мне не помогли и приходилось очень много править и выстраивать правила, что в моем случае было слишком напряжно. 

Edited by Gregar
Link to post
Share on other sites

Если в URL товара встретится 'admin', то работать на такой странице не будет, например

http://site.ru/products/administator-handbook/  

 

И вообще непонятно, зачем нужно условие !strpos($uri, 'admin')  По-моему, его можно безболезненно удалить.

Link to post
Share on other sites

Если в URL товара встретится 'admin', то работать на такой странице не будет, например

http://site.ru/products/administator-handbook/

 

И вообще непонятно, зачем нужно условие !strpos($uri, 'admin')  По-моему, его можно безболезненно удалить.

 

Верное замечание. Скорее всего логичнее изменить на simpla чтобы мы не теряли возможность входа в админку. 

Edited by Gregar
Link to post
Share on other sites

а есть ли смысл? для страницы со слешами выдается канонический юрл без слеша

 

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

Link to post
Share on other sites

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

 

да, я не СЕО-шник и не знаю, просто интересуюсь. тоесть каноникл не решает в полной мере проблему таких дублей?

Link to post
Share on other sites

да, я не СЕО-шник и не знаю, просто интересуюсь. тоесть каноникл не решает в полной мере проблему таких дублей?

 

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

 

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

 

К примеру если мы в каталоге товаров перейдем на вторую страницу, мы увидем в адресной строке такую ссылку: 

http://demo.simplacms.ru/catalog/mobilnye-telefony?page=2

где на конце ссылке присутствует ?page=2 мы должны сообщить поисковику о том, что канонический адрес на этой странице совсем другой. В стандартном шаблоне адрес этот имеется, но нам не зачем индексировать данные страницы. Значит нужно добавить условие которое будет показывать на подобных страницах

 

<meta name="robots" content="noindex, follow" />
<link rel="prev" href="/catalog/mobilnye-telefony"/>    
<link rel="next" href="/catalog/mobilnye-telefony?page=3"/> 

Выходит, что часть каких-то проблем с оптимизацией мы можем решить стандартным набором условий и функций, но чтобы избавиться от дублей придется воспользоваться всеми методами для оптимизации страниц.

 

Страница: http://demo.simplacms.ru/products/samsung-s5570-galaxy-mini и страница: http://demo.simplacms.ru/products/samsung-s5570-galaxy-mini/ для нас выглядят одинаково, но для поисковика это дубли.

Link to post
Share on other sites

Как то делал - убирал конечный слеш в ШопСкрипте. Лет 5 назад. Вроде работало красиво через "ейчтиаксес".

По пагинации. Есть статья на СеоПрофи хорошая.

Я делал сразу по двум вариантам. И next, prec + каноникал на первую страницу(на страницах 2+) - без page-1.

Закрывал в роботсе страницы пагинации. И ещё тоже самое только без prev, next - на page-all.

Link to post
Share on other sites

У меня вот такой редирект стоит и прекрасно работает. Зачем править код?

 

# Редирект на адреса без слеша
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} ^(.+)/$
RewriteRule ^(.+)/$ /$1 [R=301,L]
 

 

Link to post
Share on other sites


 

Дам совет который не даст ни кто здесь по ходу :-). Не
играйтесь с огнём ребята:-) Не знаете, не уверены, не делайте, пусть всё так и
будет с кодом. Ни черта не исправляйте в симпла сами или по совету на форумах тапа
этой темы, которую часть продублирую:



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



ну и некий код даже обсуждаемый.



И вот программисты как правило ни чего не понимающие в сео (не
хочу обидеть ни кого) начинают грызть косточку брошенную. Скажу так НЕТ В
СИМПЛА НИ КАКОЙ ПРОБЛЕМЫ С ДУБЛЕМ СТРАНИЦ! И НЕ МОЖЕТ БЫТЬ! Откройте для себя
Вебмастер гугл хотя б. Главное для вашей оптимизации  сайта уникальный контент и правильные метаданные данные, про которые можете почитать в инете, а вот это нужно предоставить либо профи
либо занимайтесь сами - консультируйтесь и двигайтесь.  Ни в коем случае не исправляйте сео ядро
системы - чревато последствиями. Баловаться  c htaccess или robots.txt это
одно, однако тоже нужно подходить с умом используя рекомендации яндекс и гугл в
вебмастере. Могу здесь много писать про дубли ссылок, хлебные якобы правильные
крошки и пагинацию страниц, простите за русский, фильтр симпла, сортировку,
каноникал, большую карту сайта более 50 000 товаров,  нормальный её вывод якобы нужный на сайте в html
и прочее, но не хочу, ибо это маленькие проблемы симпла и это в целом для раскрутки
сайта не так уж и важно!!!

Edited by shin
Link to post
Share on other sites
  • 3 weeks later...

 

 

Дам совет который не даст ни кто здесь по ходу :-). Не

играйтесь с огнём ребята:-) Не знаете, не уверены, не делайте, пусть всё так и

будет с кодом. Ни черта не исправляйте в симпла сами или по совету на форумах тапа

этой темы, которую часть продублирую:

 

Многие встречаются с проблемой дублей страниц, что в свою

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

того чтобы избавится от такой проблемы я использовал следующий код:

 

ну и некий код даже обсуждаемый.

 

И вот программисты как правило ни чего не понимающие в сео (не

хочу обидеть ни кого) начинают грызть косточку брошенную. Скажу так НЕТ В

СИМПЛА НИ КАКОЙ ПРОБЛЕМЫ С ДУБЛЕМ СТРАНИЦ! И НЕ МОЖЕТ БЫТЬ! Откройте для себя

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

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

системы - чревато последствиями. Баловаться  c htaccess или robots.txt это

одно, однако тоже нужно подходить с умом используя рекомендации яндекс и гугл в

вебмастере. Могу здесь много писать про дубли ссылок, хлебные якобы правильные

крошки и пагинацию страниц, простите за русский, фильтр симпла, сортировку,

каноникал, большую карту сайта более 50 000 товаров,  нормальный её вывод якобы нужный на сайте в html

и прочее, но не хочу, ибо это маленькие проблемы симпла и это в целом для раскрутки

сайта не так уж и важно!!!

 

Как показывает практика, в Simpla CMS все сделано хорошо, но нужно все равно работать и работать над системой для того чтобы достигать результатов. Дубли в Simpla CMS есть как в yandex так и в google. Вы написали выше то, что и так каждый знает, а форум для того и создан чтобы решать проблему. Можно написать редиректы в htcaccess, а можно в php коде. Тут уже дело каждого чем удобнее пользоваться им.

 

С файлом htcaccess могут возникнуть разные проблемы из-за не соблюдения правил. В php логика другая и работать легче. 

 

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

 

Решение которое я выложил выше является подсказкой для тех кому необходимо избавиться от дублей и не как не обязывает ни кого использовать данный метод у себя на сайте без необходимости.

 

http://demo.simplacms.ru/ubiraem-sleshi-v-kontse-url-i-izbavlyaemsya-ot-dublej - скриноты можно по смотреть тут

Link to post
Share on other sites

Используйте .htaccess, метод написан выше здесь

 

И дополню от себя, избавляемся от www.

и www.sitename.ru/index.html (если он имеется)

 

RewriteCond %{HTTP_HOST} ^www.sitename.ru$ [NC]
RewriteRule ^(.*)$ http://sitename.ru/$1 [R=301,L]
RewriteRule ^index.html$ http://sitename.ru/ [R=301,L]
Edited by cernos
Link to post
Share on other sites
  • 2 months later...

Многие встречаются с проблемой дублей страниц, что в свою очередь негативно влияет на сайт при индексировании его поисковиками. 

 

Для того чтобы избавится от такой проблемы я использовал следующий код:

 

// Убираем слеш в конце ссылок
$uri = preg_replace("/\?.*/i",'', $_SERVER['REQUEST_URI']);
 
if ((!strpos($uri, 'simpla'))  && (strlen($uri)>1)) {
  if (rtrim($uri,'/')!=$uri) {
    header("HTTP/1.1 301 Moved Permanently");
    header('Location: http://'.$_SERVER['SERVER_NAME'].str_replace($uri, rtrim($uri,'/'), $_SERVER['REQUEST_URI']));
    exit();    
  }
} 

 

Приведенный выше код необходимо поместить в файл index.php который находится в корне сайта. ~12 строка.

 

Если у Вас есть решение по лучше, разместите его в ответах данной темы. 

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

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

Link to post
Share on other sites
  • 1 year later...
  • 4 weeks later...

 

$serv_uri = $_SERVER["REQUEST_URI"];

$uri = array_filter(explode("/", $serv_uri));

if($serv_uri != "/" && substr($serv_uri, -1) == "/" && !strpos($serv_uri, 'simpla')){

    header("Location: /".implode("/",$uri), true, 301);

    exit();

}

 

мой вариант, без preg_replace и str_replace.

p.s. если у вас сервер работает на https то правильного редиректа не произойдёт т.к. вы привязались к "http".

поэтому лучше ссылаться не указывая сервер и протокол, а если указываете протокол, то указывайте через REQUEST_SCHEME

Edited by a13x
Link to post
Share on other sites

И чем этот вариант лучше? Если встретится адрес site.ru/products/with-simpla-inside/, то и не сработает Ваш метод.

А в реальности админ такое заметит лишь после того, как поисковик дубль уже зафиксирует...

Link to post
Share on other sites

И чем этот вариант лучше? Если встретится адрес site.ru/products/with-simpla-inside/, то и не сработает Ваш метод.

А в реальности админ такое заметит лишь после того, как поисковик дубль уже зафиксирует...

 

if($serv_uri != "/" && substr($serv_uri, -1) == "/" && $ur[0] != 'simpla'))

делов то.

я написал выше чем изначальный вариант плох.

Link to post
Share on other sites

И чем же он плох? Тем, что использует  preg_replace и str_replace? И с каких пор это считается большим недостатком?

 

если у вас сервер работает на https то правильного редиректа не произойдёт т.к. вы привязались к "http".

поэтому лучше ссылаться не указывая сервер и протокол, а если указываете протокол, то указывайте через REQUEST_SCHEME

+ к вышеизложенному, preg_replace также как и preg_match использует больше ресурсов. Да и зачем вобще в этом деле использовать эти функции? Всё что нам надо это узнать есть ли в конце слешь и какая категория идёт первая.

+ считаю что вызов 6-ти функций, дольше чем вызов трёх (с учётом простой array_filter).

Edited by a13x
Link to post
Share on other sites

Лучше обернуть в array_values чтобы сбросить ключи массива:

 

$serv_uri = $_SERVER["REQUEST_URI"];
$uri = array_values(array_filter(explode("/", $serv_uri)));
if($serv_uri != "/" && substr($serv_uri, -1) == "/" && $uri[0] != 'simpla')){
    header("Location: /".implode("/",$uri), true, 301);
    exit();
}
 

 

Link to post
Share on other sites

+ к вышеизложенному, preg_replace также как и preg_match использует больше ресурсов. Да и зачем вобще в этом деле использовать эти функции? Всё что нам надо это узнать есть ли в конце слешь и какая категория идёт первая.

+ считаю что вызов 6-ти функций, дольше чем вызов трёх (с учётом простой array_filter).

 

Формально Вы правы, но собственно экономия тут мизерная.

 

В Вашем последнем варианте из #20 используется 5 функций: array_values, array_filter, explode, substr, implode. если уж наводить экономию, то как-то получше, примерно так:

 

$serv_uri = $_SERVER["REQUEST_URI"];
if($serv_uri && substr($serv_uri, 0,7) !='/simpla'){
	$uri = rtrim($serv_uri, "/");
	if($serv_uri != $uri){
		header("Location: ".$uri);
		exit();
	}
}
Link to post
Share on other sites

Согласен, либо просто не использовать array_filter и array_values и проверять по 1-ом индексу массива, а не по нулевому.

 

$serv_uri = $_SERVER["REQUEST_URI"];
$uri = explode("/", $serv_uri);
if($serv_uri != "/" && substr($serv_uri, -1) == "/" && $uri[1] != 'simpla')){
    header("Location: /".implode("/",$uri), true, 301);
    exit();
}

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

Собственно url rewrite который я пишу будет также работать.

 

 

 

if($serv_uri....

p.s. $serv_uri есть всегда, даже при загрузке индексной страницы он равен "/", поэтому эта проверка всегда будет возвращать true.

Edited by a13x
Link to post
Share on other sites
  • 2 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...