iamjack
@iamjack
PHP, JS developer

Как правильно составить условие для rewritecond?

Всем привет
Вообщем htaccess всегда всегда для меня был громадной попоболью - конченые доки и какие-то странные правила regex

Стоит задача - при наличии "/" в конце урлов, которые приходят в виде без чпу, сделать редирект на такой же урл, только без слеша. Как я бы пытался это сделать:
RewriteCond %{REQUEST_URI} ^\/index\.php.*\/$
RewriteRule ^(.*)\/$ $1 [L,R=301,QSA]


Но конечно это не работает, хотя регулярка валидная и вообще не сказал бы, что я их плохо знаю =(

То есть сперва я смотрю в урл - rewritecond проверяет, соответствует ли request_uri условию. Если да, то в rewriterule я делаю редирект, мб напутал там флаги, но это уже мелочи.
  • Вопрос задан
  • 2494 просмотра
Решения вопроса 1
shambler81
@shambler81 Куратор тега htaccess
Вообще правильно наоборот добавлять слеш, однако надо не забывать что есть места исключения когда его нужно убирать.
В общем кидаю тебе правило уже расписаное
! - отрицание остальное там прокоментированно.
Уж из этого сможешь переработать под себя
############################################################################
#### Убираем повторяющиеся слеши (/) в URL                              ####
############################################################################
RewriteCond %{THE_REQUEST} //
   # Проверяем, повторяется ли слеш (//) более двух раз.
RewriteRule .* /$0 [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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы