如何确定是从命令行还是作为cgi脚本调用脚本?

spu*_*dly 8 perl command-line cgi environment-variables

我有一个我写的脚本,可以在命令行上使用,也可以作为CGI脚本使用,需要确定脚本的调用方式,这样我就可以为web请求输出内容类型的头文件(也许还有一些反缓存标题也是).我的第一个想法是检查http环境变量是否存在:

my $js = build_javascript();

if ( exists $ENV{HTTP_HOST} ) {
   print "Content-type: text/javascript\n\n";
}
print $js;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

Voi*_*ter 18

根据RFC3875中的CGI规范(第4.1.4节),GATEWAY_INTERFACE环境变量将是检查您是否在CGI上下文中运行的权威事物:

4.1.4. GATEWAY_INTERFACE

GATEWAY_INTERFACE变量必须设置到CGI的方言正在使用的服务器与脚本进行通信.

  • 布莱恩,通过设置GATEWAY_INTERFACE,你说"我是一个CGI主持人,所有关心的程序应该相应地行事".我没有看到在环境中"意外"设置它的任何理由.否则,任何解决方案都不会有效,因为我可以通过附加调试器来混淆程序,并搞乱实现所依赖的信息. (2认同)

bri*_*foy 8

没有办法判断您的脚本是由Web服务器还是从命令行启动.可以在两种情况下设置任何环境变量.例如,我经常直接从命令行运行CGI程序来测试它们.

知道如果你想选择一个要使用的环境变量,它就必须是一个你不会在另一个情况下设置的环境变量,或者你在两个环境中都设置的环境变量,但是给它们赋予不同的值.在这种情况下,请选择您喜欢的任何环境变量.

如果您想要更复杂,可以使用IO :: Interactive之类的东西来确定您是否已连接到终端.如果不是,则is_interactive返回的filehanandle 是一个空文件句柄,输出无处可去:

 print { is_interactive() } $http_header;
Run Code Online (Sandbox Code Playgroud)

如果你不喜欢IO :: Interactive的决定,你可以重新实现is_interactive.这是一段很短的代码,更高级的界面非常好.