在Apache服务器中,我在FPM模式下安装了几个PHP版本。一切正常,这个conf:
<Directory /var/www>
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Require all granted
SetHandler php7
</Directory>
<IfModule mod_fastcgi.c>
#PHP 5
Action php5 /php5
Alias /php5 /usr/lib/cgi-bin/php5
FastCgiExternalServer /usr/lib/cgi-bin/php5 -socket /var/run/php/php5.6-fpm.sock -pass-header Authorization
#PHP 7
Action php7 /php7
Alias /php7 /usr/lib/cgi-bin/php7
FastCgiExternalServer /usr/lib/cgi-bin/php7 -socket /var/run/php/php7.2-fpm.sock -pass-header Authorization
</IfModule>
当我在.htaccess文件中使用SetHandler时,它也有效:
SetHandler php5
但是,如果用户在.htaccess中犯了一些错误,就像这里:
SetHandler php5.6
浏览器返回PHP代码(安全中断):
<?php phpinfo(); ?>
如何在安全性方面正确管理apache.conf,如果htaccess文件中存在用户错误,则只加载PHP默认版本?
我尝试这个配置,但默认只生成PHP7版本。在这里,用户无法更改.htaccess文件中的任何内容:
<FilesMatch ".+\.ph(p[345]?|t|tml)$">
SetHandler php7
</FilesMatch>
感谢帮助。
现在我在默认的PHP配置中找到SetEnv
设置的解决方案。需要Apache 2.4 mod:CGI代理和宏
a2enmod proxy_fcgi
a2enmod macro
Ubuntu Server 16.04的工作配置(例如phpfpm.conf文件):
SetEnv PHP_VER 5
<IfModule proxy_fcgi_module>
ProxyErrorOverride on
<FilesMatch "\.ph(p[2-6]?|tml)$">
<Macro PHPver $ver $cgipath>
<If "env('PHP_VER') == '$ver'">
SetHandler '$cgipath'
</If>
</Macro>
#PHP VERSIONS WITH SOCKET OR HOST :
Use PHPver 7 'proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost'
Use PHPver 5 'proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost'
Use PHPver 5.4 'proxy:fcgi://localhost:9054'
Use PHPver 5.5 'proxy:fcgi://localhost:9055'
Use PHPver 5.6 'proxy:unix:/var/run/php/php5.6-fpm.sock|fcgi://localhost'
Use PHPver 7.0 'proxy:unix:/var/run/php/php7.0-fpm.sock|fcgi://localhost'
Use PHPver 7.1 'proxy:unix:/var/run/php/php7.1-fpm.sock|fcgi://localhost'
Use PHPver 7.2 'proxy:unix:/var/run/php/php7.2-fpm.sock|fcgi://localhost'
#ELSE IF (default version) :
SetHandler 'proxy:fcgi://localhost:9054'
</FilesMatch>
</IfModule>
现在我们可以通过以下方式正确调用.htaccess文件中的PHP版本:
SetEnv PHP_VER 7.0