Ответ 1
Попробуйте отключить параметр engine
в файле .htaccess:
php_flag engine off
Я создаю веб-сайт, который позволяет людям загружать файлы, html-страницы и т.д. Теперь у меня проблема. У меня такая структура каталогов:
-/USERS
-/DEMO1
-/DEMO2
-/DEMO3
-/etc... (every user has his own direcory here)
-index.php
-control_panel.php
-.htaccess
Теперь я хочу отключить PHP, но включить Server-side включает в directories и подкаталоги внутри /USERS
Можно ли это сделать (и как:))? Спасибо заранее.
Кстати, я использую сервер WAMP
Попробуйте отключить параметр 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 как обычный текст.
Edit
Решение Lance Rush о просто отказе в доступе к файлам, вероятно, лучше
Это приведет к отображению исходного кода вместо его выполнения:
<VirtualHost *>
ServerName sourcecode.testserver.me
DocumentRoot /var/www/example
AddType text/plain php
</VirtualHost>
Я использовал его один раз, чтобы другой сотрудник мог читать доступ к исходному коду из локальной сети (просто быстрая и грязная альтернатива).
ПРЕДУПРЕЖДЕНИЕ!:
Как однажды заметил Дэн, этот метод никогда не должен использоваться в производстве. Следуйте принятому ответу, поскольку он блокирует любую попытку выполнить или отобразить php файлы.
Если вы хотите, чтобы пользователи обменивались файлами php (и позволяли другим отображать исходный код), есть лучшие способы сделать это, например git, wiki и т.д.
Этот метод следует избегать! (вы были предупреждены, оставите его здесь для образовательных целей)
<Directory /your/directorypath/>
php_admin_value engine Off
</Directory>
Это может быть излишним - но будьте осторожны, делая все возможное, чтобы расширение 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>