.htaccess: редирект на скрипт, если файл не существует

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
GHopper
Сообщения: 75
Зарегистрирован: 2017.06.05, 10:53

.htaccess: редирект на скрипт, если файл не существует

Сообщение GHopper » 2018.07.30, 17:32

Приветствую.

Веб-сервер Apache2 со включенными prettyUrl.
Yii2 фреймворк рекомендует следующий .htaccess-файл:

Код: Выделить всё

RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
Я хочу добавить в этот файл правило, согласно которому все файлы из поддиректории /docs будут отдаваться броузеру, если они сущестуют, и генерироваться скриптом, если запрашиваемый файл не сущестует.

Вот что наколхозил:

Код: Выделить всё

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} ^/docs
RewriteRule ^docs/([\w-_.]+) http://kz_proj.test/docs-generator/create?file=$1 [L]

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php
Что здесь происходит по моим догадкам - если запрашиваемый файл не существует и URL начинается с /docs, то отправляем броузер на скрипт, который генерирует нужный документ http://kz_proj.test/docs-generator/create?file=$1 и передаем имя запрашиваемого документа в качестве параметра.

Есть некоторые впросы:
1. Почему-то редирект работает только с полным адресом, т.к. если опустить тестовый домен http://kz_proj.test/, то правило не работает
2. В RewriteCond '^/docs', а в RewriteRule '^docs' уже без начального слеша. Мне не понятно, почему они в обоих случаях не должны начинаться со слеша (если добавить, то правиль перестает работать).

Мне кажется что я здесь понакрутил все не правильно. Кто понимает логику работы .htaccess, поправьте пожалуйста?

Ответить