Запретить прямой доступ к папке и файлу с помощью htaccess

Вот сценарий:

  • В корневой папке есть файл index.php
  • некоторые файлы включены в index.php, которые находятся в папке includes.
  • 1 другой файл (submit.php) находится в корневой папке для действия отправки формы.

Я хочу ограничить прямой доступ пользователей к файлам в папке includes htaccess. также для submit.php. Но include будет работать для файла index.php. Например, если пользователь вводит www.domain.com/includes/somepage.php, он будет ограничивать его (может быть перенаправлен на страницу с ошибкой).

Ответ 1

Я бы просто переместил папку includes из веб-корня, но если вы хотите заблокировать прямой доступ ко всей папке includes, вы можете поместить файл .htaccess в эту папку, которая содержит:

deny from all

Таким образом, вы не можете открыть какой-либо файл из этой папки, но вы можете включить их в php без каких-либо проблем.

Ответ 2

Это чистое решение mod_rewrite:

RewriteRule ^(includes/|submit\.php) - [F,L,NC]

Это покажет запретную ошибку, если URI содержит либо /includes/, либо /submit.php

Ответ 3

Можно использовать директиву Files и запретить доступ ко всем файлам, а затем использовать его еще раз для установки доступных файлов:

<Files ~ "^.*">
  Deny from all
</Files>

<Files ~ "^index\.php|css|js|.*\.png|.*\.jpg|.*\.gif">
  Allow from all
</Files>

Ответ 4

1 решение на основе линейки mod_alias:

RedirectMatch 403 ^/folder/file.php$

Это покажет запрещенную ошибку для/folder/file.php

Ответ 5

Если я правильно понял, вы просто хотите запретить доступ к папке include?

..htaccess с директивой "DENY FROM ALL", помещенной в папку include, сделает трюк.

Ответ 6

Ваш Q поставляется в двух частях: и jeroen, и anubhava решения работают для части я - отрицания доступа к /include. анубхава также работает для части II. Я предпочитаю последнее, потому что я все равно использую DOCROOT/.htaccess, и это сохраняет все такое управление в одном файле.

Однако то, что я хотел обсудить, - это понятие "отказ в доступе к submit.php". Если вы не хотите использовать submit.php, то зачем вообще это делать в DOCROOT? Я подозреваю, что ответ здесь заключается в том, что вы используете его как цель действия в некоторых формах и только хотите, чтобы он был запущен, когда форма была отправлена, а не напрямую, например. от спамбота.

Если это так, вы не можете использовать anubhava part II, так как это приведет к сбою вашей формы. Здесь вы можете: (i) проверить .htaccess, чтобы ссылка была вашей собственной индексной страницей:

RewriteCond %{HTTP_REFERRER} !=HTTP://www.domain.com/index.php   [NC]
RewriteRule ^submit\.php$    -                                   [F]

И (ii) в генераторе формы PHP index.php есть некоторые скрытые поля для отметки времени и проверки. Валидацией могут быть, скажем, первые 10 символов MD5 временной метки и некоторый внутренний секрет. При обработке submit вы можете (i) проверить соответствие метки времени и валидации и (ii) отметка времени находится, скажем, в течение 15 минут текущего времени.

Это позволяет предотвратить спам как единственный практический способ, с помощью которого спамер мог бы получить действительную пару временной отметки/проверки, состоял бы в том, чтобы разобрать форму, но эта царапина имела бы только 15-минутную жизнь.

Ответ 7

В зависимости от возможных других параметров, установленных на более высоком уровне, вам может потребоваться поместить следующее в ваш файл .htaccess в каталог include:

Satisfy all
Order deny,allow
Deny from all

Я столкнулся с этим, когда верхний каталог определил базовую аутентификацию, включая строку:

Satisfy any

Это мешало моему отказу от всех вступить в силу, потому что пользователи прошли аутентификацию.

Ответ 8

Вы можете добавить приведенную ниже команду в файл .htaccess

Deny from all
ErrorDocument 403 "nothing is here"

В случае несанкционированного доступа будет отображаться сообщение "здесь ничего нет".

Если вы хотите перенаправить с помощью кода ошибки на определенную страницу, вы можете определить команду следующим образом:

ErrorDocument 404 "/errors/404.html"

Он будет перенаправлен на /errors/404.html и покажет пользовательскую страницу, не найденную.