Я хочу, чтобы отключить парсинг PHP файлов в определенном каталоге, и выяснил, как сделать это здесь. Проблема в том, что мой сервер использует PHP-FPM, и я получаю Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration
когда я пытаюсь использовать php_flag
в файле httpd.conf.
Как я могу отключить синтаксический анализ файлов PHP в заданном веб-каталоге с файлом htaccess/httpd.conf, который расположен над веб-корнем на сервере с использованием PHP-FPM?
Поскольку Fedora 27 недавно переключился на php-fpm, я тоже столкнулся с этой проблемой. К сожалению, старые способы делать вещи с mod_php не относятся к php-fpm.
Я нашел здесь еще один вопрос, который определенно казался более актуальным:
Apache: отключить php в каталоге
Суть его состояла в том, чтобы использовать блок <directory>
и <filesmatch>
в вашем файле конфигурации и использовать SetHandler !
для каждого каталога, который вам не нужен, чтобы интерпретировать PHP-код.
например:
<Directory "/path/to/no/phpfiles">
<Files "*.*">
SetHandler !
</Files>
</Directory>
Это проверено и работает на Fedora 27, PHP-FPM 7.1.12.
В отличие от непосредственного использования конфигураций fpm, этот метод работает рекурсивно, поэтому размещая его на верхнем уровне дерева вещей, которое вам не нужно, PHP-интерпретация работает так, как ожидалось.
Я отключил файлы.htaccess в своих конфигурациях, но этот метод все равно должен работать. Однако <directory>
недействителен внутри файла .htaccess
. Надеюсь, просто удалим его и уйдем:
<Files "*.*">
SetHandler !
</Files>
Должно быть достаточно.
Как я могу отключить синтаксический анализ файлов PHP в заданном веб-каталоге с файлом htaccess/httpd.conf, который расположен над веб-корнем на сервере с использованием PHP-FPM?
Вы не можете сдерживать то, как вы его пытаетесь, без mod_php (чего вы не хотите), поэтому вы получаете эту ошибку. PHP-FPM не является модулем Apache. Он работает независимо от Apache. То, что на самом деле оно предназначено для использования на сильно загруженных сайтах и может управлять всеми процессами PHP.
Один из способов, которым вы могли бы достичь этого, - указать точный путь, по которому вы хотите запустить PHP, в вашем файле virtualhost с директивой Directory
. Вместо того, чтобы просто иметь материал обработчика PHP, заключите его с директивой Directory
с фактическим путем, которым вы хотите его запустить. Вот пример.
<VirtualHost *:80>
ServerAdmin [email protected]
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com/public_html/
ErrorLog /var/www/example.com/error.log
CustomLog /var/www/example.com/access.log combined
<Directory /path/to/php/only/folder/>
#then you PHP handler stuff
<IfModule mod_fastcgi.c>
AddType application/x-httpd-fastphp5 .php
Action application/x-httpd-fastphp5 /php5-fcgi
Alias /php5-fcgi /usr/lib/cgi-bin/php5-fcgi_example.com
FastCgiExternalServer /usr/lib/cgi-bin/php5-fcgi_example.com -socket /var/run/php5-fpm_example.com.sock -pass-header Authorization
</IfModule>
</Directory>
</VirtualHost>
Затем перезапустите Apache. Это должно ограничивать это каталогом. Возможно, вам придется удалить информацию обработчика php из другой конфигурации, чтобы она не была перезаписана.
Примечание. Я не тестировал это решение.