Подтвердить что ты не робот

Htaccess позволяет доступ к файлам по расширению?

Я видел несколько примеров htaccess, отключающих некоторые файлы для доступа:

<Files ~ "\.(js|sql)$">
   order deny,allow
   deny from all
</Files>

например, это предотвращает доступ ко всем файлам .JS и .SQL, остальные включены. Я хочу наоборот! Я хочу, чтобы эти файлы были включены, и все остальные были предотвращены. Как достичь этого?

4b9b3361

Ответ 1

Ответ Vorapsak почти прав. Это на самом деле

order allow,deny
<Files ~ "\.(js|sql)$">
   allow from all
</Files>

Вам нужна директива order сверху (и вам больше ничего не нужно).

Интересно, кажется, мы не можем просто отрицать регулярное выражение в FilesMatch, что... странно, тем более, что "!" не вызывает ошибок сервера или чего-либо еще. Ну, дух.


и немного объяснений:

Причина заказа указывает серверу о его ожидаемом поведении по умолчанию.

 order allow,deny

сообщает серверу сначала обрабатывать директивы "allow": если запрос соответствует любой разрешающей директиве, он помечен как нормально. Затем действуют директивы "deny": если запрос соответствует любым директивам deny, он отрицает (не имеет значения, разрешено ли ему на первом проходе). Если совпадений не найдено, файл отказывается.

Директива

 order deny,allow

работает обратным образом: сначала сервер обрабатывает директивы "deny": если запрос совпадает, он помечен как отрицаемый. Затем директивы "allow" вызывают эвакуацию: если запрос соответствует директиве allow, это разрешено, даже если оно соответствует директиве deny ранее. Если запрос ничего не соответствует, файл разрешен.

В этом конкретном случае сервер сначала пытается сопоставить директивы allow: он видит, что файлы js и sql разрешены, поэтому выполняется запрос к foo.js; запрос bar.php не соответствует директивам, поэтому он отрицает.

Если мы заменим директиву на "запретить порядок, разрешить", то foo.js будет проходить (для js), а bar.php также будет проходить, поскольку он не соответствует шаблонам.


oh и еще одна вещь: директивы в разделе (т.е. < Файлы > и <Directory> ) всегда подвергаются сомнению после основного содержимого файла .htaccess, перезаписывая его. То почему решение Vorapsak не работало как inteded: главный .htaccess отказал запрос, тогда < Файлы > заказ был обработан, и он разрешил запрос.

Htaccess - магия худшего вида, но там логика.

Ответ 2

Попробовал ли вы установить

deny from all

вне (до) тега, затем изменив

deny from all

to

allow from all

внутри? Что-то вроде

deny from all
<Files ~ "\.(js|sql)$">
   order allow,deny
   allow from all
</Files>

Ответ 3

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

<?php
   // Read and write for owner, nothing for everybody else
   chmod("/somedir/somefile", 0600);
?>

http://php.net/manual/en/function.chmod.php