2012-07-29 75 views
2

我的问题是关于CGI。我想知道如果我将Perl脚本保存为.cgi文件,那么让服务器知道它是Perl脚本而不是其他的实际机制是什么?我知道在源文件开头有一个#!/usr/local/bin/perl,但这也是Perl编程语言的一部分,所以服务器在开始执行之前必须知道它是一个Perl脚本。Web服务器如何解释“.cgi”?

+4

的'#!'就是不使用Perl的一部分。它被称为“shebang”。这是一种用于任何类型文本“脚本”的Unix约定。 – Mat 2012-07-29 15:47:16

+0

那么如果我想在其他操作系统中使用cgi呢? – 2012-07-29 15:48:31

+4

取决于网络服务器。可以将其配置为将.cgi文件作为perl处理,或者它已经读取了第一行来尝试并确定它是什么类型的文件。 – Mat 2012-07-29 15:49:28

回答

1

如果服务器配置为识别.cgi后缀,那么它只是执行该文件,可能使用exec*() functions之一。

在类Unix系统上,如果文件是以#!开头的文本文件,那么系统内核​​本身将使用该行来确定启动哪个解释器来将该文件作为脚本运行。你可以用任何解释语言(Perl,Python,bash,sh,ruby等等)编写CGI脚本。

对于这个问题,您可以使用任何可执行文件作为CGI 脚本 程序。如果编译一个C,C++或Ada程序来创建一个可执行文件,然后将其安装在文件名后缀为.cgi的适当目录中,则Web服务器可以直接执行它。这并不常见,因为脚本语言对于这类事情往往会变得很方便,但Web服务器并不关心它调用的是哪种可执行文件,或者内核如何调用它。

(细节可能会有点不同的Windows上,通常使用文件扩展名来确定如何启动一个可执行文件。)

+0

请解释downvote;我想提高我的答案。 – 2012-07-30 18:13:10

3

一个HTTP服务器通常只给send指定文件给客户端。服务器的配置决定将运行哪些文件并返回其输出。

例如,流行的Apache httpd服务器的配置文件是httpd.conf,或者具体来说是其中的一个文件Included。它随软件版本,主机操作系统和分配而变化很大。

的标准可以或者基于其中文件在文件结构,或者是它的是。

一个ScriptAlias指令像

ScriptAlias /cgi-bin 

说,在/cgi-bin目录中的所有文件将作为CGI脚本来处理。

或者,AddHandler指令像

AddHandler cgi-script .cgi 

说,和.cgi扩展名的文件将被运行的CGI脚本无论他们在哪里。

+0

这并没有回答这个问题:“让服务器知道它是Perl脚本而不是别的什么是真正的机制?” – 2012-07-30 16:22:09

+0

@brian:我认为“服务器如何知道它是CGI脚本而不是文本资源”。也许我错了。希望OP会告诉我们。 – Borodin 2012-07-30 16:32:23