Назад | Перейти на главную страницу

Apache mod_rewrite - удалить расширение / добавить завершающую косую черту / сохранить структуру каталогов

В настоящее время я использую следующий файл .htaccess, чтобы удалить расширение .php из моих файлов и добавить косую черту в конце ко всем URL-адресам:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/]+)/$ $1.php

# Forces a trailing slash to be added
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]

Однако это отлично работает, когда у меня есть файл php в каталоге, и я хочу обслуживать этот файл из каталога, я получаю ошибку 404. Есть ли способ сделать это с помощью 1 файла .htaccess в корне. Я действительно не хочу помнить о том, чтобы помещать файл .htaccess в каждый каталог.

Сейчас

www.myexample.com/information/

Обслуживает /information.php. Большой! тем не мение

www.myexample.com/categories/category-1/

это вызывает ошибку 404, даже если файл /categories/category-1.php существует. Я хотел бы изменить свой файл .htaccess, чтобы он служил /categories/category-1.php.

Шаблон регулярного выражения для первого правила перезаписи является причиной: ^([^/]+)/$ средства любой символ, ЗА ИСКЛЮЧЕНИЕМ слэша /. Поэтому он отклоняет все, что находится в подпапке.

Вы должны использовать ^(.+)/$ шаблон вместо этого - это будет работать для /information/ так же как /categories/category-1/ так же как /categories/category-1/hello-kitten/.

P.S. Я бы также добавил L флаг, чтобы перестать соответствовать дальнейшим правилам:

# add .php file extension
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*[^/])/?$ $1.php [L]