我如何让Apache的.htaccess
文件检查PHP是否已启用?我尝试了<IfModule !mod_php7.0.c>
和<IfModule !mod_php7.c>
之类的东西,但是当我启用/禁用模块时它似乎没有做任何事情。
我希望在我的.htaccess
中有一个后备,当PHP被禁用时,它会拒绝所有人的访问。为了防止纯文本PHP代码泄露。
我想做这样的事情:
# If PHP is not installed, deny all access to .php files to prevent PHP code leakage
<IfModule !mod_php7.c>
<FilesMatch \.php$>
order deny,allow
deny from all
</FilesMatch>
</IfModule>
最终会检查if php7 AND php5 AND php4 are disabled, deny access
之类的内容。有什么想法吗?
此外,当AllowOverride为None时,.htaccess
文件没有执行任何操作。有什么选择可以防止PHP代码以明文泄漏?
答案 0 :(得分:5)
<IfModule !mod_php5.c>
<FilesMatch ".+\.php$">
Order Deny,Allow
Deny from all
</FilesMatch>
</IfModule>
在Apache 2.4中
<IfModule !mod_php5.c>
<FilesMatch ".+\.php$">
Require all denied
</FilesMatch>
</IfModule>
在Apache 2.4中,有几个新的有用功能:define,ifdefine和if, else, ifelse。
在下文中,我们可以默认拒绝,只有在定义了PHP_IS_ENABLED
时才启用。
<IfModule mod_php5.c>
Define PHP_IS_ENABLED
</IfModule>
<IfModule mod_php7.c>
Define PHP_IS_ENABLED
</IfModule>
# ...
<IfDefine !PHP_IS_ENABLED>
<FilesMatch ".+\.php$">
Require all denied
</FilesMatch>
</IfDefine>
答案 1 :(得分:2)
这是一个检查PHP的多个版本的解决方案(例如“如果php 5 OR php 7已启用”),确实可以在.htaccess
中使用。
它需要带有mod_env
模块的Apache 2.4(在主机上启用了99%)。
<IfModule mod_php5.c>
SetEnv PHP_IS_ENABLED yes
</IfModule>
<IfModule mod_php7.c>
SetEnv PHP_IS_ENABLED yes
</IfModule>
<If "reqenv('PHP_IS_ENABLED') == 'yes' || reqenv('REDIRECT_PHP_IS_ENABLED') == 'yes'">
... your directives
</If>
需要 REDIRECT_PHP_IS_ENABLED
才能使用mod_rewrite内部重定向的请求工作。
答案 2 :(得分:0)
这是对cronfy's answer for .htaccess
的改进,我用来设置需要在脚本运行之前设置的PHP指令,因此无法在代码内进行设置(例如ini_set()
):
<IfModule mod_php5.c>
SetEnv MOD_PHP 5
</IfModule>
<IfModule mod_php7.c>
SetEnv MOD_PHP 7
</IfModule>
<If "reqenv('MOD_PHP') != '' || reqenv('REDIRECT_MOD_PHP') != ''">
php_value post_max_size 100M
php_value upload_max_filesize 50M
</If>
此类指令需要与.user.ini
中的指令同步:
post_max_size = 100M
upload_max_filesize = 50M