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