У меня есть следующая структура каталога в файловой системе:
/users/[uid1]/
/users/[uid2]/
и т. д. (часть UID является динамической в URL-адресе, например /users/abc123/
или /users/def456/
)
Внутри uid-dirs у меня также есть несколько подкаталогов и файлов, например: images-dir
another-dir
file1
file2
Еще у меня есть файл .htaccess:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]
Поэтому я переписываю каждый запрос в index.php для маршрутизации, только если запрошенный файл не существует в файловой системе.
Можно как-то запретить доступ к /users/[uid]/*
Кроме images-dir
?
Например, разрешите:
/users/123abc/images-dir/some-image.jpg
и отрицать:
/users/123abc/another-dir
/users/123abc/file1
Мне нужно запретить прямой доступ к этим подкаталогам И если кто-то пытается получить содержимое запрещенных файлов, я хочу отправить запрос на index.php
Можно ли сделать с .htaccess?
Спасибо
Я полагаю, у вас есть сингл .htaccess
файл в корне документа.
Вы можете сделать что-то вроде следующего перед существующими директивами:
# If the request maps to a file or directory in the /users/<uid> space
# But is not the "images-dir" then forbid access
RewriteCond %{REQUEST_URI} !^/users/\w+/images-dir/
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^users/\w+/ - [F]
\w+
соответствует <uid>
и включает буквенно-цифровые символы и символы подчеркивания. Если <uid>
следует определенному формату, тогда вы могли бы быть более конкретным здесь.
Если вы ссылаетесь только на статические ресурсы в /users/<uid>/...
пробел (т.е. без виртуальных URL-адресов), то вы можете удалить вышеуказанные проверки файловой системы, поскольку вы знаете, что каждый запрос нацелен на ресурс файловой системы.