如何让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代码以明文形式泄漏?
<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>
# php8
<IfModule mod_php.c>
Define PHP_IS_ENABLED
</IfModule>
# ...
<IfDefine !PHP_IS_ENABLED>
<FilesMatch ".+'.php$">
Require all denied
</FilesMatch>
</IfDefine>
这里是一个针对多个PHP版本(例如:"如果php 5 或 php 7是启用的"),确实可以在.htaccess
中工作。
它需要Apache 2.4与mod_env
模块(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内部重定向的请求工作。
这是对我用来设置需要在脚本运行之前设置的PHP指令的.htaccess
的回答的改进,因此不能从代码中设置(例如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