我的问题是关于cgi。我想知道我是否将Perl脚本保存为.cgi文件,实际的机制是什么让服务器知道它是Perl脚本而不是别的什么?我知道源文件的开头有一个#!/usr/local/bin/perl
,但它也是Perl编程语言的一部分,所以服务器在开始执行之前必须知道它是一个Perl脚本。
答案 0 :(得分:3)
HTTP服务器通常只将send指定的文件发送给客户端。服务器的配置决定了运行哪些文件并返回它们的输出。
例如,流行的Apache httpd服务器的配置文件是httpd.conf
,或者特别是其中一个文件Include
d。它随软件版本,主机操作系统和分发而变化很大。
标准可以基于文件结构中文件的位置,也可以基于名称。
像
这样的ScriptAlias指令ScriptAlias /cgi-bin
表示/cgi-bin
目录中的所有文件都将被视为CGI脚本。
或者,像
这样的AddHandler指令AddHandler cgi-script .cgi
表示所有扩展名为.cgi
的文件都将作为CGI脚本运行。
答案 1 :(得分:1)
如果服务器配置为识别.cgi
后缀,则它只是执行文件,可能使用exec*()
functions之一。
在类Unix系统上,如果文件是以#!
开头的文本文件,那么系统内核本身将使用该行来确定要启动哪个解释器以将文件作为脚本运行。
您可以用任何解释语言编写CGI脚本(Perl,Python,bash,sh,ruby等等)。
就此而言,您可以将任何可执行文件用作CGI 脚本程序。如果编译C,C ++或Ada程序来创建可执行文件,则将其安装在文件名后缀为.cgi
的相应目录中,Web服务器可以直接执行。这种情况并不常见,因为脚本语言往往对这种事情很方便,但是Web服务器并不关心它调用什么样的可执行文件,或内核如何调用它。
(Windows上的细节可能略有不同,通常使用文件扩展名来确定如何启动可执行文件。)