Редирект на добавить или убрать слэш в конце URL

Редирект на добавить или убрать слэш в конце URL

Добавляем / в конце URL-адреса

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !\..+$
RewriteCond %{REQUEST_URI} !/$
RewriteRule (.*) https://www.site.ru/$1/ [R=301,L]

Еще вариант добавить слеш в конце урла

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

И еще вариант

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

Еще один вариант

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

И еще один вариант

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

Еще один вариант

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

Когда несколько сайтов на одном хосте/CMS и нет возможности вставить адрес сайта

RewriteEngine On
RewriteCond %{REQUEST_URI} !\?
RewriteCond %{REQUEST_URI} !\&
RewriteCond %{REQUEST_URI} !\=
RewriteCond %{REQUEST_URI} !\.
RewriteCond %{REQUEST_URI} !\/$
RewriteRule ^(.*[^\/])$ /$1/ [R=301,L]

Костыль для Битрикса

Если ничего не помогает на Битриксе (На других не пробовал), то добавьте php код в самом начале вашего шаблона, header.php (на Битриксе)

<?php
if (substr($_SERVER['REQUEST_URI'], -1) !== '/') {
    header('Location: ' . $_SERVER['REQUEST_URI'] . '/', true, 301);
    exit;
}

Добавил исключение для некоторых разделов в Битриксе, а также исключил урлы с гет-параметрами

if (substr($_SERVER['REQUEST_URI'], -1) !== '/' && empty($_GET) && strpos($_SERVER['REQUEST_URI'], '/personal/') === false && strpos($_SERVER['REQUEST_URI'], '/bitrix/') === false) {
    header('Location: ' . $_SERVER['REQUEST_URI'] . '/', true, 301);
    exit;
}

Убрать / в конце URL

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

В джумле 3 возможен такой вариант, что перестанет заходить в админку после убирания слэша. Для этого убираем редирект из htaccess и в шаблоне в файле (как правило) index.php после строки

defined( '_JEXEC' ) or die( 'Restricted access' );

прописать такой код:

$uri = preg_replace("/\?.*/i",'', $_SERVER['REQUEST_URI']);

if ((!strpos($uri, 'administrator')) && (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();
}
}

Еще варианты убрать слеш в конце

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

Еще варианты

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

После удаления слешей при входе в админку иногда возникает ошибка: «На этой странице обнаружена циклическая переадресация ERR_TOO_MANY_REDIRECTS». Это из-за того, что ее адрес должен быть со слешем. Тогда нужно добавить еще строчку, исключающую удаление слеша из адреса админки:

RewriteCond %{REQUEST_URI} !^/admin(/(.*)|$)

(вместо admin прописывается адрес к админке, например, в WordPress это wp-admin, в modx — manager).

Целиком правила получаются вот такие:

RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteCond %{REQUEST_URI} !^/manager(/(.*)|$)
RewriteRule ^(.*)(/)$ $1 [L,R=301]

Или такой вариант с исключением:

RewriteBase /
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /$ [NC]
RewriteCond %{REQUEST_URI} !^/admin/
RewriteRule ^(.*)(/)$ $1 [L,R=301]

Описание

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

На мой взгляд довольно-таки важный редирект, особенно часто встречаю такую проблему у Битрикса (Bitrix). Но и другие CMS этим грешат. Когда подставляя или убирая последний слеш, страница все равно отдает 200 ответ сервера и по сути является дублем, со всеми вытекающими негативными последствиями для поискового ранжирования.

Вообще нет единого мнения, оставлять или убирать слеш в конце URL-адреса. Даже я сам лично на каких-то проектах убираю, на каких-то оставляю. Стараюсь убирать слеш в конце там, где плоская структура URL’ов, например: https://site.ru/something-product-or-article. На мой взгляд так выглядит чисто визуальней более эстетично, если можно применить это в WEB’e 🙂

Ну, а в глубокой структуре стараюсь добавить слеш в конец URL’а, чтобы выглядело более симметрично что ли, например https://site.ru/catalog/category/tovar/, где каждый участок урла закрывается слешем.

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

Опубликовал(а)Teh
Предыдущая запись
Редирект множественные слеши
Следующая запись
Убрать index.php и index.html из URL
Добавить комментарий
Ваш электронный адрес не будет опубликован. Обязательные поля помечены *

  1. Sych

    Спасибо большое, перепробовал кучу редиректов, чтобы добавить слеш в конце, но ничего не помогало, а код PHP для битрикса помог!