ermolaevalexey
@ermolaevalexey
frontend веб-разработчик

Как убрать повторяющиеся слэши в .htaccess?

Главная страница sovasz.ru дублируется по адресам с произвольным количеством слэшей на конце, например:
http://sovasz.ru///////////////////
Как убрать один слэш на конце, понятно. А как можно убрать много повторяющихся символов?
  • Вопрос задан
  • 37290 просмотров
Решения вопроса 3
@ShamblerR
Дааю сразу все поскольку в свое время задолбало для каждого проекта делать все заново, по этому сейчас просто вставляю кусок и все.
############################################################################
#### Cтандартный .htaccess для проектов студии Клондайк, версия 2.3     ####
############################################################################
RewriteEngine On
   #  Директива включает редиректы.
RewriteBase / 
   # Без директивы (.*) = /$1 будет /var/wwww/site/web/$1  с директивой  = /$1
Options +FollowSymLinks
   # Разрешает переход по символическим ссылкам.

############################################################################
#### Перенаправляем протокол https на http                              ####
############################################################################
RewriteCond %{HTTPS} on
   # Проверяем наличие https в URL.
RewriteRule ^.*$ http://%{SERVER_NAME}%{REQUEST_URI}
   # Перенаправляем протокол на http.

############################################################################
#### Выбор основного зеркала (или с www или без www)                    ####
############################################################################
   # 1. Редирект с www на без www. (раскоментировать директивы пункта 1)
#RewriteCond %{HTTP_HOST} ^www\.(.*) [NC]
   # Проверяем, содержит ли домен www (в начале URL).
#RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
   # Перенаправляем URL на домен без www.
####
   # 2. Редирект без www на www. (раскоментировать директивы пункта 2)
#RewriteCond %{HTTP_HOST} !^www\.(.*) [NC]
   # Проверяем, не содержит ли домен www (в начале URL).
#RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
   # Перенаправляем URL на домен c www.

############################################################################
#### Убираем повторяющиеся слеши (/) в URL                              ####
############################################################################
RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteRule . %1/%2 [R=301,L]
   # Исключаем все лишние слеши.

############################################################################
#### Убираем слеши в конце URL для статических файлов (содержит точку)  ####
############################################################################
RewriteCond %{REQUEST_URI} \..+$  
   # Если файл содержит точку.
RewriteCond %{REQUEST_FILENAME} !-d   
   # И это не директория.
RewriteCond %{REQUEST_FILENAME} -f
   # Является файлом.
RewriteCond %{REQUEST_URI} ^(.+)/$      
   # И в конце URL есть слеш.
RewriteRule ^(.+)/$ /$1 [R=301,L]     
   # Исключить слеш.

############################################################################
#### Добавляем слеш(/), если его нет, и это не файл.                    ####
############################################################################
RewriteCond %{REQUEST_URI} !(.*)/$
   # Если слеша в конце нет.
RewriteCond %{REQUEST_FILENAME} !-f
   # Не является файлом.
RewriteCond %{REQUEST_URI} !\..+$
   # В URL нет точки (файл).
RewriteRule ^(.*)$ $1/ [L,R=301]
   # Добавляем слеш в конце.

############################################################################
#### Убираем index.php, если он есть в конце URL                        ####
############################################################################
RewriteCond %{REQUEST_METHOD} =GET
   # Выявляем GET запрос в URL (не POST).
RewriteCond %{REQUEST_URI} ^(.*)/index\.php$
   # URL cодержит index.php в конце.
RewriteRule ^(.*)$ %1/ [R=301,L]
   # Удалить index.php из URL.

############################################################################
#### Конец общей части, далее следует собственные директивы .htaccess   ####
############################################################################
Ответ написан
Два коммента выше про:

RewriteCond %{REQUEST_URI} ^(.*)/{2,}(.*)$
и про
RewriteCond %{THE_REQUEST} ([^\s]*)\/{2,}(\?[^\s]*)?

Вы вообще сами проверяли как будет происходить редирект? А я отвечу, что станицы вида site.ru/page//// будут редиректиться сначала на site.ru/page/// потом на site.ru/page// потом только на site.ru/page/

Потому как что (.*), что ([^\s]*) - жадные! Нужно указывать (.*?) и ([^\s]*?)

Господа, проверяйте свой код прежде, чем рекомендовать кому то.
Ответ написан
Комментировать
@AlexBurma
Попробуй это:

RewriteCond %{THE_REQUEST} ([^\s]*)\/{2,}(\?[^\s]*)?
RewriteRule (.*) %1 [R=301,L]
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@ZardoZAntony
программист, сис. админ
#убираем лишние слеши
    RewriteCond %{REQUEST_URI} ^(.*?)\/{2,}(.*?)$
    RewriteRule . %1/%2 [L,R=301]
    RewriteCond %{THE_REQUEST} //
    RewriteRule .* /$0 [R=301,L]
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы