Отключить PHP в каталоге (включая все подкаталоги) с помощью .htaccess

Я делаю сайт, который позволяет людям загружать файлы, html-страницы и т. Д. Теперь у меня проблема. У меня такая структура каталогов:

-/USERS -/DEMO1 -/DEMO2 -/DEMO3 -/etc... (every user has his own direcory here) -index.php -control_panel.php -.htaccess 

Теперь я хочу отключить PHP, но включить Server-side включает в directories и подкаталоги внутри / USERS

Можно ли это сделать (и как :))? Заранее спасибо.

BTW, я использую сервер WAMP

Solutions Collecting From Web of "Отключить PHP в каталоге (включая все подкаталоги) с помощью .htaccess"

Попробуйте отключить опцию engine в файле .htaccess:

 php_flag engine off 

Чтобы отключить весь доступ к sub dirs (безопасный), используйте:

 <Directory full-path-to/USERS> Order Deny,Allow Deny from All </Directory> 

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

1 – Убедитесь, что вы знаете, какие расширения файлов сервер распознает как PHP (и не разрешает людям переопределять htaccess). На одном из моих серверов установлено:

 # Example of existing recognized extenstions: AddType application/x-httpd-php .php .phtml .php3 

2 – На основе расширений добавьте регулярное выражение в FilesMatch (или LocationMatch)

  <Directory full-path-to/USERS> <FilesMatch "(?i)\.(php|php3?|phtml)$"> Order Deny,Allow Deny from All </FilesMatch> </Directory> 

Или используйте Location для соответствия php-файлам (я предпочитаю подход, описанный выше)

 <LocationMatch "/USERS/.*(?i)\.(php3?|phtml)$"> Order Deny,Allow Deny from All </LocationMatch> 

Если вы используете mod_php, вы можете поставить (либо в .htaccess в / USERS, либо в свой httpd.conf для каталога USERS)

 RemoveHandler .php 

или

 RemoveType .php 

(в зависимости от того, включен ли PHP с помощью AddHandler или AddType)

Файлы PHP, запущенные из другого каталога, все еще могут включать файлы в / USERS (при условии, что ограничение open_basedir отсутствует), потому что это не проходит через Apache. Если к файлу php обращаются с помощью apache, он будет serverd как обычный текст.

редактировать

Решение Лэнса Рашинга просто отрицать доступ к файлам, вероятно, лучше

 <Directory /your/directorypath/> php_admin_value engine Off </Directory> 

Это приведет к отображению исходного кода вместо его выполнения:

 <VirtualHost *> ServerName sourcecode.testserver.me DocumentRoot /var/www/example AddType text/plain php </VirtualHost> 

Я использовал его один раз, чтобы позволить другому сотруднику иметь доступ на чтение к исходному коду из локальной сети (просто быстрая и грязная альтернатива).

ВНИМАНИЕ! :

Как однажды заметил Дэн, этот метод никогда не должен использоваться в производстве. Следуйте принятому ответу, поскольку он блокирует любую попытку выполнить или отобразить php-файлы.

Если вы хотите, чтобы пользователи делились файлами php (и позволяли другим отображать исходный код), есть лучшие способы сделать это, например git, wiki и т. Д.

Этот метод следует избегать! (вы были предупреждены, оставите его здесь для образовательных целей)

Это может быть излишним – но будьте осторожны, делая все возможное, чтобы расширение PHP-файлов было .php – что, если кто-то приходит позже и добавляет обработчики для .php4 или даже .html чтобы они обрабатывались PHP. Возможно, вам будет лучше обслуживать файлы из этих каталогов из другого экземпляра Apache или чего-то еще, который обслуживает только статический контент.

Ни один из этих ответов не работает для меня (генерирует ошибку 500 или ничего не делает). Вероятно, это связано с тем, что я работаю на размещенном сервере, где я не могу получить доступ к конфигурации Apache.

Но это сработало для меня:

RewriteRule ^.*\.php$ - [F,L]

Эта строка создаст 403 Forbidden ошибку для любого URL-адреса, который заканчивается на .php и попадает в этот подкаталог.

@Oussama привел меня в правильное направление здесь , благодаря ему.

Попробуй это:

  <FilesMatch "\.((php[0-9]?)|p?html?|pl|sh|java|cpp|c|h|js|rc)$"> SetHandler None </FilesMatch>