如果启用PHP,如何签入.htaccess?

时间:2016-09-12 12:51:23

标签: php apache .htaccess

我如何让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代码以明文泄漏?

3 个答案:

答案 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中,有几个新的有用功能:defineifdefineif, 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