如果PHP被启用,如何检入.htaccess


How to check in .htaccess if PHP is enabled?

如何让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