Я делаю сайт, который позволяет людям загружать файлы, 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
Попробуйте отключить опцию 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>