Отключить прямой доступ для файлов подкаталогов из root htaccess [duplicate]

Я думаю, что ответ на этот вопрос заключается в том, как python передает данные в параметр (передать по значению или по ссылке), а не изменчивость или как питон обрабатывает инструкцию «def».

Краткое введение. Во-первых, в питоне есть два типа типов данных: один простой элементарный тип данных, например числа, а другой тип данных - объекты. Во-вторых, при передаче данных в параметры python передает элементарный тип данных по значению, т. Е. Делает локальную копию значения локальной переменной, но передает объект по ссылке, т. Е. Указывает на объект.

Признавая вышеуказанные два момента, давайте объясним, что произошло с кодом python. Это происходит только из-за передачи по ссылке для объектов, но не имеет ничего общего с mutable / immutable или, возможно, факта, что оператор «def» выполняется только один раз, когда он определен.

[] является объектом , поэтому python передает ссылку [] на a, т. е. a является только указателем на [], который лежит в памяти как объект. Существует только одна копия [] с, однако, многими ссылками на нее. Для первого foo () список [] изменен на 1 методом добавления. Но учтите, что существует только одна копия объекта списка, и этот объект теперь становится 1 . При запуске второго foo (), какая веб-страница effbot говорит (элементы больше не оцениваются) неверна. a оценивается как объект списка, хотя теперь содержимое объекта 1 . Это эффект прохождения по ссылке! Результат foo (3) может быть легко получен таким же образом.

Чтобы еще раз подтвердить мой ответ, давайте рассмотрим два дополнительных кода.

===== = № 2 ========

def foo(x, items=None):
    if items is None:
        items = []
    items.append(x)
    return items

foo(1)  #return [1]
foo(2)  #return [2]
foo(3)  #return [3]

[] - это объект, поэтому None (первый является изменяемым, в то время как последний является неизменным, но изменчивость не имеет ничего что касается вопроса). Никто не находится где-то в пространстве, но мы знаем, что он есть, и там есть только одна копия «Нет». Таким образом, каждый раз, когда вызывается foo, элементы оцениваются (в отличие от некоторого ответа, который оценивается только один раз) равны None, чтобы быть ясным, ссылка (или адрес) None. Затем в foo элемент изменяется на [], т. Е. Указывает на другой объект, который имеет другой адрес.

====== № 3 =======

def foo(x, items=[]):
    items.append(x)
    return items

foo(1)    # returns [1]
foo(2,[]) # returns [2]
foo(3)    # returns [1,3]

Вызов элемента foo (1) указывает на объект списка [] с адрес, скажем, 11111111. содержимое списка будет изменено на 1 в функции foo в дальнейшем, но адрес не изменится, еще 11111111. Тогда foo (2, []) является приходит. Хотя [] в foo (2, []) имеет тот же контент, что и параметр по умолчанию [] при вызове foo (1), их адрес отличается! Поскольку мы предоставляем параметр явно, items должен принять адрес этого нового [], скажем 2222222, и вернуть его после внесения некоторых изменений. Выполняется foo (3). поскольку предоставляется только x, элементы должны снова принимать значение по умолчанию. Что такое значение по умолчанию? Он задается при определении функции foo: объект списка, расположенный в 11111111. Таким образом, элементы оцениваются как адрес 11111111, имеющий элемент 1. Список, расположенный в 2222222, также содержит один элемент 2, но он не указывается элементами any Больше. Следовательно, добавление 3 сделает items [1,3].

Из приведенных выше объяснений видно, что веб-страница effbot , рекомендованная в принятом ответе, не дала соответствующего ответа на этот вопрос. Более того, я думаю, что точка на веб-странице effbot неверна. Я думаю, что код UI.Button верен:

for i in range(10):
    def callback():
        print "clicked button", i
    UI.Button("button %s" % i, callback)

Каждая кнопка может содержать определенную функцию обратного вызова, которая будет отображать различное значение i. Я могу привести пример, чтобы показать это:

x=[]
for i in range(10):
    def callback():
        print(i)
    x.append(callback) 

Если мы выполним x[7](), мы получим 7, как ожидалось, и x[9]() даст 9, другое значение i.

12
задан Halcyon 10 January 2012 в 13:06
поделиться

4 ответа

Я думаю, что самое простое правило:

RedirectMatch 403 ^.*/sub/folder/index\.php$

RedirectMatch находится в модуле mod_alias, который вы, безусловно, имеете. Это не означает двигатель mod_rewrite. Здесь мы просто говорим apache, что любой доступ к sub / folder / index.php будет генерировать «403 запрещенный» ответ.

Вы можете поместить это в httpd.conf или в корневой .htaccess (но действительно считаю, что удалить все .htaccess, это плохо, это медленно, грустно, что у вас нет доступа к реальным файлам конфигурации).

23
ответ дан Halcyon 20 August 2018 в 15:35
поделиться
  • 1
    Это работает! По-видимому, RedirectMatch обрабатывается отдельно от RewriteRule – Halcyon 10 January 2012 в 18:41
  • 2
    Если вы хотите отключить доступ к каждому файлу в каждой подпапке, выполните следующие действия: RedirectMatch 403 ^. * / * / * \. * $ – Miha Eržen 12 September 2012 в 09:59
  • 3
    Miha, я думаю, что лучшим правилом для всех файлов будет просто / * $ в конце, таким образом, файлы, которые не имеют точек, также будут применяться к этому правилу – Arruda 24 July 2013 в 01:16
  • 4
    Я использую это правило на всех моих сайтах Wordpress htaccess. В журналах сервера было показано множество попыток напрямую обратиться к теме index.php. RedirectMatch 403 ^.*/wp-content/themes/(.*)/index\.php$ – squarecandy 10 June 2014 в 18:47

Я пытаюсь создать еще один .htaccess в этой суб / папке /, чтобы заблокировать доступ к этому index.php.

«Если вы поместите файл .htaccess в подпапку, его директивы будут отменять те, которые у вас есть в основной папке вашего сайта. "

На этой странице есть дополнительная информация: http://www.besthostratings.com/articles/htaccess.html

2
ответ дан AKFourSeven 20 August 2018 в 15:35
поделиться
  • 1
    Связанная с вами статья полезна, если вы впервые услышали о концепции файлов .htacess. Здесь не так полезно. – Halcyon 10 January 2012 в 18:47
  • 2
    Ваш вопрос в то время не указывал, есть ли у вас новые возможности, которые у вас были с htaccess, поэтому я дал вам такую ​​ссылку. – AKFourSeven 10 January 2012 в 19:38

Вы можете использовать имена файлов только в разделах <Файлы>>, а не пути.

Есть три варианта, которые я могу видеть:

  • Поместите файл .htaccess в ту же папку, что и файл.
  • Поместите конфигурацию в apache .conf с помощью директивы & lt; Directory> и директивы & lt; Files>. & lt; Directory> не работает в файлах .htaccess, только apache.conf
  • Создайте правило перезаписи с помощью mod_rewrite a'la;

-

RewriteEngine on
RewriteRule ^sub/folder/index.php$ http://yoursite/index.locked

Дает 404 файла, если вы хотите, чтобы разрешение было отклонено, создайте защищенный файл для чтения в указанном местоположении.

0
ответ дан Joachim Isaksson 20 August 2018 в 15:35
поделиться
  • 1
    Второй тоже небезопасен;) – Halcyon 10 January 2012 в 13:00
  • 2
    Хорошо, добавил третий :) – Joachim Isaksson 10 January 2012 в 13:40
  • 3
    Я играл с этим, и это сработает, только подкаталог содержит файл .htaccess, а также RewrieRules. Поэтому мне нужно RewriteOptions inherit и RewriteBase объявление родителя, но я не могу предоставить это, потому что моя среда динамична. Мне всегда кажется удивительным, как совершенно бесполезный .htaccess - это когда у вас есть модульные структуры. – Halcyon 10 January 2012 в 17:36
  • 4
    Hm, я просто сделал это без .htaccess в подкаталоге. Имеется ли в подкаталоге отдельный раздел в вашем apache.conf или аналогичный, который сделает apache не доверенным файлу верхнего уровня? – Joachim Isaksson 10 January 2012 в 17:42
  • 5
    По-видимому, это поведение по умолчанию. RewriteRule s в родительском файле .htaccess не применяются, если вы не добавите RewriteOptions inherit. Но тогда правило не запускается, потому что RewriteBase установлен в дочерний каталог. Я не могу сбросить RewriteBase, потому что я этого не знаю (из-за модульности). Решение будет заключаться в генерации .htaccess файлов при развертывании приложения, но я считаю, что это скорее недостаток дизайна, чем что-либо еще, он существует уже довольно долгое время. – Halcyon 10 January 2012 в 18:37

Как создать файл .htaccess в определенной папке, содержащей файлы, которые вы хотите защитить?

Изменить:

Будьте осторожны, это фактически не работает в простой .htaccess, см. комментарии ниже. Это будет работать только в файле apache.conf.

Это должно сделать трюк для вас без другого файла .htaccess:

<Directory sub/folder>
   <Files index.php>
     Order allow,deny
     Deny from all
   </Files>
</Directory>
1
ответ дан William 20 August 2018 в 15:35
поделиться
  • 1
    Я не хочу этого делать, конечно, по причинам, выходящим за рамки этого вопроса. – Halcyon 10 January 2012 в 12:53
  • 2
    Тогда да, вам нужно будет применять правила каталога. Я отредактирую ответ :) – bardiir 10 January 2012 в 12:57
  • 3
    О, просто наткнулся на то, что это работает только в файлах apache.conf, а не сами файлы .htaccess ... см. httpd.apache.org/docs/1.3/howto/htaccess.html – bardiir 10 January 2012 в 13:01
  • 4
    Я пробовал это (прежде чем публиковать вопрос, конечно), и он просто дает ошибку Вечного сервера. – Halcyon 10 January 2012 в 13:01
  • 5
    У вас есть mod_rewrite? Если это так, вы можете рассмотреть возможность перезаписи этого URL-адреса, если он соответствует sub / folder / index.php – bardiir 10 January 2012 в 13:04
Другие вопросы по тегам:

Похожие вопросы: