Для размещения в .htaccess в корневой папке. Если вы собираетесь поместить его в конфигурационный файл (например, внутри <VirtualHost>
), его нужно немного изменить.
RewriteEngine On
RewriteBase /
# 1) do not do anything for existing file or folder
RewriteCond %{ENV:REDIRECT_STATUS} !^$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
# 2) real file (in application folder) -- rewrite path
RewriteCond %{DOCUMENT_ROOT}/application%{REQUEST_URI} -f
RewriteRule (.*) /application/$1 [L]
# 3) nope, no such file -- serve via index.php
RewriteRule ^(.*)$ /core/index.php?f=%{DOCUMENT_ROOT}/application%{REQUEST_URI} [QSA,L]
Важным моментом, о котором многие забывают, является тот факт, что после перезаписи URL он переходит к следующей итерации. И на такой следующей итерации URL уже отличается от первоначально запрошенного. Эти правила должны позаботиться об этом моменте.
Вот как это будет работать для /test.html
:
- Правило № 1 будет пропущено, так как его нет
/test.html
- Правило # 2 будет работать, так как существует файл
/application/test.html
. Перезапись переходит к следующей итерации (флаг [L]
).
- Правило # 1 будет работать, так как URL теперь равен
/application/test.html
, и такой файл существует. Это правило предписывает Apache прекратить переписывать дальше - работа выполнена.
Вот как это будет работать для /meow.html
:
- Правило # 1 будет пропущено, так как его нет
/meow.html
- Правило # 2 будет пропущено, так как нет файла
/application/meow.html
.
- Правило № 3 будет работать - URL переписан на
core/index.php?f=%{DOCUMENT_ROOT}/application/meow.html
. Перезапись переходит к следующей итерации (флаг [L]
).
- Правило # 1 будет работать, так как URL сейчас
/core/index.php
, и такой файл существует. Это правило предписывает Apache прекратить переписывать дальше - работа выполнена.
EDIT:
Вы можете добавить начальную косую черту /
перед целевой частью RewriteRule (не должно быть никакой разницы ... но ваша установка может немного отличаться от моей).