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

Запретить доступ к каталогу, кроме одного подкаталога с .htaccess

У меня есть следующая структура каталога в файловой системе:

/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-адресов), то вы можете удалить вышеуказанные проверки файловой системы, поскольку вы знаете, что каждый запрос нацелен на ресурс файловой системы.