Эта «ошибка» дала мне много часов работы сверхурочных! Но я начинаю видеть его потенциальное использование (но мне хотелось бы, чтобы это было во время выполнения, все еще)
Я дам вам то, что я вижу в качестве полезного примера.
def example(errors=[]):
# statements
# Something went wrong
mistake = True
if mistake:
tryToFixIt(errors)
# Didn't work.. let's try again
tryToFixItAnotherway(errors)
# This time it worked
return errors
def tryToFixIt(err):
err.append('Attempt to fix it')
def tryToFixItAnotherway(err):
err.append('Attempt to fix it by another way')
def main():
for item in range(2):
errors = example()
print '\n'.join(errors)
main()
печатает следующие
Attempt to fix it
Attempt to fix it by another way
Attempt to fix it
Attempt to fix it by another way
Ответ Форпассака почти прав. Это
order allow,deny
<Files ~ "\.(js|sql)$">
allow from all
</Files>
Вам нужна директива order сверху (и вам больше ничего не нужно).
Интересно, кажется, мы не можем просто отрицайте регулярное выражение в FilesMatch, что ... странно, тем более, что "!" не вызывает ошибок сервера или чего-либо еще. Ну, duh.
и немного объяснения:
Причина заказа сообщает серверу о его ожидаемом поведении по умолчанию.
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 и еще одна вещь: директивы в секции (т. е. & lt; Files> и & lt; Directory>) всегда выкапываются после основной файл .htaccess, перезаписывая его. Вот почему решение Vorapsak не работало так, как предполагалось: основной .htaccess отклонил запрос, затем & lt; Файлы> заказ был обработан, и он разрешил запрос.
Htaccess - магия худшего типа, но есть логика.
Вы можете изменить разрешение файла на «600», поэтому вы можете просто получить к нему доступ через свой скрипт, и он будет лишать прямого доступа.
<?php
// Read and write for owner, nothing for everybody else
chmod("/somedir/somefile", 0600);
?>
Попробовал ли вы установить
deny from all
вне (перед) тег, а затем изменил
deny from all
на
allow from all
внутри ? Что-то вроде
deny from all
<Files ~ "\.(js|sql)$">
order allow,deny
allow from all
</Files>
deny from all
), все запросы в этот каталог будут лишены, включая POST-данные, поэтому в этом смысле да, оно делает. Но к каталогу все еще можно получить доступ к серверным языкам, FTP и другим средствам. – SáT 7 December 2013 в 01:43