Подтвердить что ты не робот

Отключить 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

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

Кстати, я использую сервер WAMP

4b9b3361

Ответ 1

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

php_flag engine off

Ответ 2

Чтобы отключить весь доступ к 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>

Ответ 3

Если вы используете 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 о просто отказе в доступе к файлам, вероятно, лучше

Ответ 4

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

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

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

ПРЕДУПРЕЖДЕНИЕ!:

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

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

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

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

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

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

Ответ 8

Попробуйте следующее:

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