mod_rewrite loop hide php extension and trailing slash

Челябинская область

Автор:Dmitriy Altuhov

mod_rewrite loop hide php extension and trailing slash

Задача: сделать так, чтобы

  1. при обращении напрямую к PHP-файлу появлялась ошибка 403 (запрет доступа)
  2. при обращении к адресу без последнего слеша (http://altuhov.su/contacts) происходил редирект 301 на страницу со слешем (http://altuhov.su/contacts/)
  3. при открытии страницы со слешем выполнялся скрипт $1.php (contacts.php)

Основная проблема в том что mod_rewrite при каждом запросе переписывает REQUEST_URI и можем попасть в бесконечный цикл, если будем делать сравнение:
RewriteCond %{REQUEST_URI} .*\.php$ [NC]
RewriteRule ^(.*).php$ /$1 [L,R]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/$ /$1.php
Так первое выражение перепишет REQUEST_URI на /$1 (/contacts), а второе выражение перепишет обратно на /$1.php (/contacts.php) и вернёт обратно в mod_rewrite и снова перепишем на /$1 (/contacts)

Правильный и рабочий вариант:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/$
RewriteRule . %{REQUEST_URI}/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)/$ /$1.php

RewriteCond %{THE_REQUEST} \.php[\ /?].*HTTP/ [NC]
RewriteRule ^.*$ — [F,L]

Comments Are Closed!!!