Эмуляция узлов / экспресс-маршрутов в .htaccess

Я пытался подражать, как nodejs / express работают с их маршрутами. Я пересылаю весь трафик на index.php обрабатывать маршруты (используя AltoRouter).

Мой файл struture выглядит примерно так:

-/
--public/
|- assets
|- ...
--routes/
|- route.php
|- ...
--index.php

Возьмем, к примеру, эти URL (все должны возвращать / перенаправлять 404):

http://testsite.com/routes

http://testsite.com/routes/route.php

http://testsite.com/somefile.php

Однако только активы должны быть доступны напрямую, как это (я не хочу включать /public/:

http://testsite.com/assets/image.png

http://testsite.com/assets/styles/style.css

Это то, что я до сих пор:

# Make sure mod_rewrite is on
<IfModule mod_rewrite.c>
RewriteEngine on

# This should allow us to get our assets and keep them public
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)\.(gif|jpg|png|jpeg|css|js|swf)$ /public/$1.$2 [L,NC]

# Forward other traffic to index.php
RewriteRule ^.+$ index.php [L]
</IfModule>

Одна проблема, с которой я столкнулся, идет: http://testsite.com/routesпроизводит:
введите описание изображения здесь

Думаю, мой главный вопрос: все, что не публикуется, не должно быть доступным (не уверен, что .htacces — это путь или нет)

0

Решение

Вам не нужно хоронить свои файлы выше веб-корня, если вы используете правильные правила. Личные файлы можно легко сделать недоступными.

<IfModule mod_rewrite.c>
RewriteEngine on
# transform assets URLs to correct path, and proceed to next rule
# checking existence in RewriteConds is useless here since public URLs are not 1:1 physical paths
RewriteRule ^assets/.+ public/$0 [NS,DPI]
# send *all* URLs to index.php except those that point to an asset file that exists
RewriteCond $1 !=public/assets/ [OR]
# change the slash in next condition to your sub-directory if not serving from the web root, e.g. %{DOCUMENT_ROOT}/project/root/$0
RewriteCond %{DOCUMENT_ROOT}/$0 !-f
RewriteRule ^((?:[^/]+/){2})?.+ index.php [NS,END]
</IfModule>
1

Другие решения

Других решений пока нет …