Я хочу запретить прямой доступ ко всем файлам .php
кроме одного: index.php
Единственный доступ к другим .php
файлам должен быть через php include
.
Если возможно, я хочу, чтобы все файлы находились в одной папке.
ОБНОВИТЬ:
Общее правило было бы приятным, поэтому мне не нужно проходить через все файлы. Риск в том, что я забыл файл или строку.
ОБНОВЛЕНИЕ 2:
www.myadress.com/myfolder/index.php
находится в папке www.myadress.com/myfolder/index.php
Я хочу запретить доступ ко всем файлам .php
в myfolder
и подпапках в эту папку.
В index.php добавьте значение доступа, подобное этому:
$access = 'my_value';
В любом другом файле включите эту проверку, прежде чем даже один байт будет эхом отозван php:
if(empty($access)) { header("location:index.php"); die(); }
Таким образом, другие php-файлы будут доступны только через require / include, а не через URL-адрес.
Вы уверены, что хотите это сделать? Даже css и js файлы и изображения и …?
ОК, сначала проверьте, установлен ли mod_access в apache, затем добавьте следующее к вашему .htaccess:
Order Deny,Allow Deny from all Allow from 127.0.0.1 <Files /index.php> Order Allow,Deny Allow from all </Files>
Первая директива запрещает доступ к любым файлам, кроме как из localhost, из-за того, что параметр « Order Deny,Allow
, «Разрешить» применяется позже, вторая директива влияет только на index.php.
Предостережение: нет пробела после запятой в строке заказа.
Чтобы разрешить доступ к файлам, соответствующим * .css или * .js, используйте эту директиву:
<FilesMatch ".*\.(css|js)$"> Order Allow,Deny Allow from all </FilesMatch>
Однако вы не можете использовать директивы для <Location>
или <Directory>
внутри файлов .htaccess.
Ваш вариант будет состоять в том, чтобы использовать <FilesMatch ".*\.php$">
вокруг первой разрешить, запретить группу, а затем явно разрешить доступ к index.php.
Обновление для Apache 2.4: этот ответ правильный для Apache 2.2. В Apache 2.4 парадигма управления доступом изменилась, и правильный синтаксис – использовать Require all denied
.
Фактически, я пришел сюда с тем же вопросом, что и создатель темы, но ни одно из решений не было полным ответом на мою проблему. Зачем добавлять код ко всем файлам на вашем сервере, когда вы могли бы просто настроить его один раз? Самый близкий из них был Residuum, но все же он исключал ВСЕ файлы, когда я хотел исключить только файлы php, которые не были названы index.php.
Поэтому я придумал .htaccess, содержащий это:
<Files *.php> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Files> <Files index.php> Order Allow,Deny Allow from all </Files>
(Помните, что файлы htaccess работают рекурсивно, поэтому он идеально подходит для предпосылки вопроса.)
И здесь мы идем. Единственными файлами php, которые будут доступны для пользователя, будут те, которые называются index.php. Но вы все равно можете получить доступ к каждому изображению, стилю CSS, js-скрипту и т. Д.
Наклонный ответ на вопрос заключается в том, чтобы написать весь код как классы, кроме файлов index.php, которые являются тогда единственными точками ввода. Файлы PHP, содержащие классы, не вызовут ничего, даже если они вызываются непосредственно через Apache.
Прямым ответом является включение следующего в .htaccess:
<FilesMatch "\.php$"> Order Allow,Deny Deny from all </FilesMatch> <FilesMatch "index[0-9]?\.php$"> Order Allow,Deny Allow from all </FilesMatch>
Это позволит получить доступ к любому файлу, например index.php, index2.php и т. Д., Но откажется от доступа любого вида к другим .php-файлам. Это не повлияет на другие типы файлов.
Вы можете попробовать определить константу в index.php
и добавить что-то вроде
if (!defined("YOUR_CONSTANT")) die('No direct access');
к началу других файлов.
ИЛИ, вы можете использовать mod_rewrite
и перенаправлять запросы на index.php, редактируя .htaccess
следующим образом:
RewriteEngine on RewriteCond $1 !^(index\.php) RewriteRule ^(.*)$ /index.php/$1 [L,R=301]
Затем вы сможете анализировать все входящие запросы в index.php и принимать соответствующие действия.
Например, если вы хотите оставить все файлы * .jpg, * .gif, * .css и * .png, вы должны отредактировать вторую строку следующим образом:
RewriteCond $1 !^(index\.php|*\.jpg|*\.gif|*\.css|*\.png)
Как сохранить все .php-файлы, за исключением index.php над корнем веб-сайта? Нет необходимости в каких-либо правилах перезаписи или программных kludges.
Добавление папки include в ваш путь включения поможет вам упростить задачу, не нужно использовать абсолютные пути и т. Д.
Редактирование URL-адресов можно использовать для сопоставления URL-адресов .php-файлам. Следующие правила могут определять, был ли задан запрос .php напрямую или он был переписан. Он запрещает запрос в первом случае:
RewriteEngine On RewriteCond %{THE_REQUEST} ^.+?\ [^?]+\.php[?\ ] RewriteRule \.php$ - [F] RewriteRule test index.php
Эти правила запрещают все запросы, заканчивающиеся на .php
. Тем не менее, URL-адреса, такие как /
(который запускает index.php), /test
(который переписывает index.php) и /test?f=index.php
(который содержит index.php в querystring), все еще разрешены.
THE_REQUEST
содержит полную строку HTTP-запроса, отправленную браузером на сервер (например, GET /index.php?foo=bar HTTP/1.1
)
Вместо того, чтобы передавать переменную вокруг, я делаю это, что самодостаточно в верхней части любой страницы, к которой вы не хотите прямого доступа, это все равно должно быть сопряжено с правилами .htaccess, но я чувствую себя более уверенно, что существует отказоустойчивость, если htaccess когда-либо запутывается.
<?php // Security check: Deny direct file access; must be loaded through index if (count(get_included_files()) == 1) { header("Location: index.php"); // Send to index die("403"); // Must include to stop PHP from continuing } ?>
Простое решение – переименовать все файлы non-index.php в .inc, а затем запретить доступ к файлам * .inc. Я использую это во многих своих проектах, и он отлично работает.
поместите все файлы в одну папку. поместите файл .htaccess в эту папку и дайте ему значение deny all. то в index.php, который размещен за пределами папки, он отображает правильные страницы на основе ввода или события пользователя
С Apache 2.4 синтаксис управления доступом изменился. Если вы используете такие директивы, как:
Order deny,allow Deny from all
не работает, вы, вероятно, используете Apache 2.4.
Здесь представлены документы Apache 2.4 .
Вам необходимо использовать параметр « Require all denied
одним из следующих способов:
# you can do it this way (with "not match") <FilesMatch ^((?!index\.php).)*$> Require all denied </FilesMatch> # or Require all denied <Files index.php> Require all granted </Files>
Разрешить только 2 ip, все остальные блокируют
Order Deny,Allow Deny from all Allow from 173.11.227.73 108.222.245.179
<Files ~ "^.*\.([Pp][Hh][Pp])"> Order allow,deny Deny from all Satisfy All </Files>