Помогите разобраться в mode_rewrite, плииз

ShiskinA

Новичок
Помогите разобраться в mode_rewrite, плииз

Не совсем разбираюсь в данном вопросе, поэтому делал методом «копипаста и тыка». Вот что получилось:

RewriteCond %{REQUEST_URI} !/$
RewriteCOND %{REQUEST_URI} ![^/]*\.[^/]*$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ http://%{HTTP_HOST}/$1/ [NS,L,R=301]

RewriteRule ^index.php - [L]
RewriteRule ^robots.txt - [L]
RewriteRule ^_[^/]+/ - [L]
RewriteRule /_[^/]+/ - [L]
RewriteRule ^.+ ./index.php [L]

Требования ко всему этому чуду такие:

Если адрес ссылается на директорию, но не имеет закрывающего слэша, то идет перенаправление на этот же адрес, но со слэшом на конце. Если адрес ссылается на файл (имеющий расширение) то все ОК, перенаправления нет.

Дальше если это не robots.txt, а так же цель не находится в корневой директории, имеющей префикс «_», то запрос переадресовывается в index.php, если цель лежит в директории /_{dir_name}/ то обрабатывается самой целью.

В принципе эта конструкция работает, но сдается мне там много лишнего. Как бы улучшить ее????

И еще один вопрос, в пунктах

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

что означают буквы на конце -f и -d ?

Спасибо заранее.
 

Духовность™

Продвинутый новичок
тебе не кажется, что что-то улучшать надо тогда, когда в этом есть необходимость? У тебя эта необходимость есть?
 

akxxiv

Новичок
Сам не супер как силен в данном вопросе, но ради практики постараюсь разобрать данные правила. Поправьте меня если я в чем-то буду не прав.

И такс начнем:

PHP:
// применить правило если адрес заканчивается без слеша
RewriteCond %{REQUEST_URI} !/$  

// и если это это не файл (т.е. не имеет расширения)
RewriteCOND %{REQUEST_URI} ![^/]*\.[^/]*$

// И если это не реально существующий файл (это условие, по моему, лишнее, т.к. предыдущее его захватывает)
RewriteCond %{REQUEST_FILENAME} !-f

// и если это не реальная директория (тоже лишнее, т.к. перенаправление не помешает)
RewriteCond %{REQUEST_FILENAME} !-d

// Перенаправляем на путь со слэшем.
RewriteRule ^(.*)$ http ://%{HTTP_HOST}/$1/ [NS,L,R=301]

// Если это индексный файл - то исполняем его
RewriteRule ^index.php - [L]

// Если это роботс оттдаем его
RewriteRule ^robots.txt - [L]

// Если 1-я директория начинается с подчеркивания то заканчиваем правила
RewriteRule ^_[^/]+/ - [L]

// Если это вообще любая директория начинающаяся с _ , заканчамвем
RewriteRule /_[^/]+/ - [L]

// все остальные файлы перекидываем на index.php
RewriteRule ^.+ ./index.php [L]
Хм. Если у вас файлы лежащие в директориях типа /_name/ - просто файлы, то можно записать по другому. Может такая запись будет правильней...

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

RewriteRule ^index.php - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+ ./index.php [L]

Пните меня, если я ошибаюсь.
 

ShiskinA

Новичок
Да это тоже работает. И вроде как компактней выглядит. )))
Спасибо.
 
Сверху