Ответ 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 - магия худшего вида, но там логика.