Apache .htaccess中reqenv()判断MOD_PHP环境变量失效问题
问题分析与解决方案
你的问题核心在于Apache配置指令的执行顺序:SetEnv是在请求处理的运行阶段(request processing phase)才会设置环境变量,而<If>表达式是在配置解析阶段(configuration parsing phase)就会被求值。这时候MOD_PHP环境变量还没被设置,所以reqenv('MOD_PHP')自然返回空,导致条件不成立,php_value也就没生效。
方案一:用Define替代SetEnv(推荐)
Define是在配置解析阶段生效的指令,<If>表达式可以直接读取到它的值。修改你的配置如下:
<IfModule mod_php5.c> Define MOD_PHP php5 </IfModule> <IfModule mod_php7.c> Define MOD_PHP php7 </IfModule> <IfVersion >= 2.4> <If "defined('MOD_PHP')"> php_value memory_limit 1024M </If> </IfVersion>
方案二:直接嵌套<IfModule>与<IfVersion>
既然你本来就是通过<IfModule>判断PHP模块是否加载,不如直接把php_value放在对应的<IfModule>区块里,逻辑更清晰,也避免了环境变量的时序问题:
<IfVersion >= 2.4> <IfModule mod_php5.c> php_value memory_limit 1024M </IfModule> <IfModule mod_php7.c> php_value memory_limit 1024M </IfModule> </IfVersion>
验证方法
修改配置后,重启Apache服务:
sudo service apache2 restart
然后在PHP脚本中打印ini_get('memory_limit'),确认是否已经改为1024M。
另外,你的环境是PHP7.2,mod_php7.c模块是正确的,Ubuntu14.04的Apache2.4.7也支持<If>和<IfVersion>指令,所以上面的方案都可以正常工作。
内容的提问来源于stack exchange,提问作者Cyclonecode
相关产品推荐
相关产品推荐

