归档文章 (2011-2017)

date
2011/01/24
为什么买的虚拟主机的 “public_html” 目录下总有那么一个空 “cgi-bin” 目录?再者为什么我将 cgi 文件不放刚才那个”cgi-bin” 目录下也同样也能运行?什么时候需要用到 AddType 指令

一、基础知识

1.1、什么是 CGI?

简单说 CGI 是一种口,所有对 CGI 文件的访问请求,Web 服务器必须先作执行处理而不能直接把内容返回浏览器。

1.2、什么是 Apache PMA

Apache PMA,即多路处理模块,详细介绍见 ,apache2.2 官方文档
apache2.2 默认使用 prefork ,如果需要选择 worker ,那么必须在apache2.2 编译时使用“–with-mpm=” 选项静态编译进核心。可通过”httpd -l”查询当前的PMA模式。
prefork 采用进程的方式,Worker 采用进程与线程混合方式,海量的请求时,prefork 较快但耗资源,worker 相反。

1.3、mod_cgi 和 mod_cgid 区别

Apache PMA 为 prefork 时使用mod_cgi模块,PMA 为worker 时使用mod_cgid模块。详细介绍见文档 Apache Module mod_cgiApache Module mod_cgid。即在用户层面,这两个模块本质上是相同的。

二、执行 CGI 的方法

2.1、指定ScriptAlias目录为CGI文件目录

在 ScriptAlias 目录的文件均被认为是 CGI i脚本,另外要设置该目录属性,但无需添加 ExecCGI 选项。
指定目录别名及路径,注意是“ScriptAlias”而不是“Alias”
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
设置该目录属性,绝对路径,千万不要漏了 “Allow from all” 切记!
<Directory "/usr/local/apache/cgi-bin"> AllowOverride None Options None Order allow,deny Allow from all </Directory>

2.2、指定特定文件后缀为CGI文件

在 ScriptAlias 目录的文件均被认为是 CGI i脚本,那么目录之外是否可以?可以!但要指定后缀、设置目录属性,且启用ExecCGI选项。
指定后缀有两种方法,一是定义MIME类型为application/x-httpd-cgi,二是使用 AddHandler 或 SetHandler 指令激活内置的 cgi-script 处理器
AddType application/x-httpd-cgi .cgi #方法一 AddHandler cgi-script .cgi #方法二
设置CGI的目录属性,必须在Options指令中启用ExecCGI选项
<Directory "/usr/local/apache/htdocs/cgi-bin"> Options ExecCGI AllowOverride None Order allow,deny Allow from all </Directory>
If you have any questions, please contact me.