Apache 未在包含的 perl 脚本中执行“do”包含函数

问题描述

Apache 2.4 已针对服务器端包含进行配置,并且只要变量是本地的,就可以正确运行任何传递的 CGI 脚本。但是,我们有一些脚本使用“do”函数从配置文件中提取变量,如下所示:

#!/usr/bin/perl
do '../includes/cgi.conf';
print "Content-type: text/html\n\n";
print $hostname

cgi.conf 包含以下内容:

$host = 'none.nowhere.com';

在网络服务器上的命令行中执行时,该变量会按预期填充到输出中。但是,Apache 不会按预期打印它,除非该变量在脚本中本地声明。

我正在将一个应用程序从 RHEL6/Apache 2.2 升级到 RHEL7/Apache 2.4,并且这个配置以前是有效的,所以我可能在升级到新配置的过程中遗漏了一些东西。

请原谅代码块中的任何拼写错误。代码未复制粘贴,实际代码中不存在任何错别字。

解决方法

do 读取文件并将其作为 Perl 代码执行(evals)。如果失败,则没有任何反应(静默)。这就像忽略 eval

requiredo 类似,但如果出现问题就会抱怨(perldoc 条目显示了实际行为)。您应该require 该文件,以便它可以告诉您没有发生某些事情。或者,至少检查 do 的结果,如果有问题,将 $@ 发送到错误日志。

,

您假设当前目录设置为包含脚本的目录。

use FindBin qw( $RealBin );

do "$RealBin/../includes/cgi.conf";
,

我的问题是通过将 apache 用户的读取权限添加到配置文件中解决的。它只有来自旧服务器的执行权限,我认为这就是新服务器上所需的全部内容。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...