由于Apache具有相当高
![](/icons/26829de.gif)
可移植性
![](/icons/26829dou.gif)
它支持超过30种操作系统
![](/icons/26829dou.gif)
包括Unix、Windows 及Darwin等系统
![](/icons/26829dou.gif)
所以目前在网络上已注册
![](/icons/26829de.gif)
网域里大部份是使用Apache网页服务器
![](/icons/26829dou2.gif)
目前ApacheSoftware Foundation 正致力于发展现在已进入alpha测试阶段
![](/icons/26829de.gif)
Apache2.0
![](/icons/26829dou2.gif)
在这里
![](/icons/26829dou.gif)
我和大家探讨如何修改服务器选项让服务器能提供简单
![](/icons/26829de.gif)
动态网页内容
![](/icons/26829dou.gif)
也就是支持CGI
![](/icons/26829chengxu.gif)
及 Server-Side Include(SSI)
![](/icons/26829chengxu.gif)
![](/icons/26829dou2.gif)
1、准备工作
首先
![](/icons/26829dou.gif)
我假设你已经安装好Apache而且你
![](/icons/26829de.gif)
Apache能提供静态网页供浏览
![](/icons/26829dou2.gif)
Apache
![](/icons/26829de.gif)
安装会自动附上静态
![](/icons/26829de.gif)
HTML测试页
![](/icons/26829dou.gif)
也就是说如果能看到那测试页
![](/icons/26829dou.gif)
就代表你
![](/icons/26829de.gif)
Apache能正常运作了
![](/icons/26829dou2.gif)
基本安装下
![](/icons/26829de.gif)
Apache仅能提供静态
![](/icons/26829de.gif)
HTML网页
![](/icons/26829dou2.gif)
然而
![](/icons/26829dou.gif)
你可以通过使用模块(modules)来提升它
![](/icons/26829de.gif)
功能
![](/icons/26829dou2.gif)
在原始
![](/icons/26829de.gif)
设定下
![](/icons/26829dou.gif)
Apache
![](/icons/26829de.gif)
编译会包含mod_
![](/icons/26829include.gif)
及 moc_cgi 这两个模块
![](/icons/26829dou2.gif)
你可以在bin子目录下执行./httpd -l来查看你
![](/icons/26829de.gif)
Apache是否装有这两个模块
![](/icons/26829dou2.gif)
执行
![](/icons/26829de.gif)
输出会是
![](/icons/26829yi.gif)
长串Apache现在安装
![](/icons/26829de.gif)
所有模块
![](/icons/26829dou2.gif)
如果mod_
![](/icons/26829include.gif)
及moc_cgi 这两个模块不在清单里
![](/icons/26829dou.gif)
你必须重新编译服务器
![](/icons/26829dou2.gif)
重新编译时
![](/icons/26829dou.gif)
确定依照如何含括 mod_
![](/icons/26829include.gif)
、moc_cgi 模块
![](/icons/26829de.gif)
介绍说明
![](/icons/26829dou2.gif)
此外你还必需有提供实时网页
![](/icons/26829de.gif)
Server-Side Includes(相关资料网址:http://www.oreilly.com/catalog/apache/excerpt/ch10.html)
![](/icons/26829dou2.gif)
有了 server-side
![](/icons/26829include.gif)
s (SSI)支持
![](/icons/26829dou.gif)
你就能制作出实时
![](/icons/26829de.gif)
动态网页
![](/icons/26829dou2.gif)
接下来
![](/icons/26829dou.gif)
我先从服务器
![](/icons/26829de.gif)
SSI支持设定开始
![](/icons/26829dou.gif)
然后进入CGI
![](/icons/26829de.gif)
编写
![](/icons/26829dou2.gif)
2、Apache
![](/icons/26829de.gif)
设定
首先你必须先找到Apache这个设定文件
![](/icons/26829dou2.gif)
Apache
![](/icons/26829de.gif)
原始安装目录在 Unix下是/usr/local/apache
![](/icons/26829dou.gif)
在Windows下则是 c:Program FilesApache
![](/icons/26829dou2.gif)
接着在conf子目录下你会找到httpd.conf 文件
![](/icons/26829dou2.gif)
这就是Apache
![](/icons/26829de.gif)
设定档
![](/icons/26829dou2.gif)
这个设定文件是个纯文字文件
![](/icons/26829dou.gif)
所以你可以使用
![](/icons/26829yi.gif)
般
![](/icons/26829de.gif)
文字编辑器
![](/icons/26829dou.gif)
如vi或Notepad 等
![](/icons/26829dou.gif)
来编辑
![](/icons/26829dou2.gif)
首先要注意
![](/icons/26829de.gif)
是在这个设定档里有些行
![](/icons/26829de.gif)
起始文字是#符号
![](/icons/26829dou.gif)
这表示这行
![](/icons/26829de.gif)
文字全为批注
![](/icons/26829dou2.gif)
适当地在你
![](/icons/26829de.gif)
设定档内做批注是个好习惯
![](/icons/26829dou.gif)
![](/icons/26829yinwei.gif)
那帮你记得你曾做了哪些设定以及为什么
![](/icons/26829dou2.gif)
3、执行 SSI
![](/icons/26829chengxu.gif)
开启设定文件并寻找以下这些文字:
#
# To use server-parsedHTMLfiles
#
#AddType text/html .shtml
#AddHandler server-parsed .shtml
删除AddType及AddHandler这两行指令前
![](/icons/26829de.gif)
#符号
![](/icons/26829dou2.gif)
AddType指令会要求服务器在传回任何附属档名为.shtml
![](/icons/26829de.gif)
网页时
![](/icons/26829dou.gif)
以 text或HTML做为传回文件
![](/icons/26829de.gif)
内容格式
![](/icons/26829dou2.gif)
AddHandler 则是用来指示服务器将文件内容送交给mod_
![](/icons/26829include.gif)
处理
![](/icons/26829dou2.gif)
的后
![](/icons/26829dou.gif)
mod_
![](/icons/26829include.gif)
就会判断该如何响应这样
![](/icons/26829de.gif)
文件
![](/icons/26829dou2.gif)
接下来
![](/icons/26829dou.gif)
寻找以下文字:
在这行文字及对应
![](/icons/26829de.gif)
间会有
![](/icons/26829yi.gif)
行选项行(options line)
![](/icons/26829dou2.gif)
原始
![](/icons/26829de.gif)
设定是:
Options Indexes FollowSymLinks MultiViews
在这行尾端加上Includes
![](/icons/26829dou.gif)
结果看起来会是这样:
Options Indexes FollowSymLinks MultiViews Includes
这是要求Apache在htdocs子目录里执行 server-side
![](/icons/26829include.gif)
s
![](/icons/26829chengxu.gif)
![](/icons/26829dou2.gif)
为了让这些修改生效
![](/icons/26829dou.gif)
我们必须重新启动服务器
![](/icons/26829dou2.gif)
在 Unix 下重新激活
![](/icons/26829dou.gif)
执行"kill -HUP `cat /usr/local/apache/logs/httpd.pid`"
![](/icons/26829dou2.gif)
在 Windows 下
![](/icons/26829dou.gif)
执行"Apache-k restart"
![](/icons/26829dou2.gif)
现在我们来试试刚才
![](/icons/26829de.gif)
设定结果
![](/icons/26829dou2.gif)
在/usr/local/apache/htdocs 目录里新增
![](/icons/26829yi.gif)
个文件 test.shtml
![](/icons/26829dou2.gif)
这个文件必须要包含以下
![](/icons/26829chengxu.gif)
代码:
The file hello.txt is long and it was last mod
![](/icons/26829if.gif)
ied on
这段 SSI
![](/icons/26829chengxu.gif)
会去读取
![](/icons/26829yi.gif)
个称为 hello.txt 文件
![](/icons/26829dou.gif)
并将该文件
![](/icons/26829de.gif)
大小以及最近
![](/icons/26829yi.gif)
次
![](/icons/26829de.gif)
修改日期输出到网页上
![](/icons/26829dou2.gif)
显然
![](/icons/26829de.gif)
![](/icons/26829dou.gif)
我们还必须在 htdocs 目录下新增这个hello.txt 文件
![](/icons/26829dou2.gif)
在我
![](/icons/26829de.gif)
hello.txt 文件里只有
![](/icons/26829yi.gif)
行文字:HOW ARE YOU!
![](/icons/26829dou2.gif)
完成新增这些文件后
![](/icons/26829dou.gif)
打开你惯用
![](/icons/26829de.gif)
浏览器并开启http://localhost/test.shtml网页
![](/icons/26829dou2.gif)
如果你服务器
![](/icons/26829de.gif)
安装并不是通过root用户
![](/icons/26829dou.gif)
你可能必须改为开启http://localhost:8080/test.shtml
![](/icons/26829dou2.gif)
的后将得到如下结果:
HOW ARE YOU! The file hello.txt is 1k
![](/icons/26829byte.gif)
s long and it was last mod
![](/icons/26829if.gif)
ied on Wednesday, 02-Aug-2000 20:18:28 PDT
另外
![](/icons/26829yi.gif)
种可以激活支持SSI
![](/icons/26829chengxu.gif)
![](/icons/26829de.gif)
思路方法称为XbitHack设定(相关资料网址:http://www.apache.org/docs/mod/mod_
![](/icons/26829include.gif)
.html#xbithack )
![](/icons/26829dou2.gif)
这个思路方法
![](/icons/26829de.gif)
由来是当你将文本文件
![](/icons/26829de.gif)
使用者可执行位(user-executable bit)设为可执行状态后
![](/icons/26829dou.gif)
Apache会将那些文件视为 SSI
![](/icons/26829chengxu.gif)
文件
![](/icons/26829dou2.gif)
要激活这样
![](/icons/26829de.gif)
功能必须将以下指令(directive)放在所有目录
![](/icons/26829de.gif)
.htaccess 文件里:XbitHack status on (or full) status
![](/icons/26829de.gif)
值可以设为on 、off 或是full
![](/icons/26829dou2.gif)
on
![](/icons/26829de.gif)
设定会强制服务器将所有使用者可执行
![](/icons/26829de.gif)
文件视为SSI项
![](/icons/26829dou2.gif)
Off则使服务器完全忽略使用者可执行
![](/icons/26829de.gif)
设定状态
![](/icons/26829dou2.gif)
若是设定为Full
![](/icons/26829dou.gif)
服务器会视所有使用者可执行档为SSI项
![](/icons/26829dou.gif)
同时也会检查组可执行(group-executable bit)
![](/icons/26829dou2.gif)
如果组可执行项设定为可执行时
![](/icons/26829dou.gif)
传回header
![](/icons/26829de.gif)
last mod
![](/icons/26829if.gif)
ied time
![](/icons/26829de.gif)
值就会被设定为该文件最近
![](/icons/26829yi.gif)
次被修改
![](/icons/26829de.gif)
时间
![](/icons/26829dou2.gif)
这样
![](/icons/26829de.gif)
设定可以让客户端
![](/icons/26829de.gif)
浏览器及代理服务器(proxy)进行缓存Cache(caching)
![](/icons/26829dou2.gif)
不过在使用这样
![](/icons/26829de.gif)
功能时必须要小心
![](/icons/26829dou2.gif)
例如说
![](/icons/26829dou.gif)
如果你
![](/icons/26829de.gif)
网页有提供轮替式广告看板你就不会想要设定群组可执行位为开启
![](/icons/26829de.gif)
状态
![](/icons/26829dou.gif)
![](/icons/26829yinwei.gif)
那么做会让第
![](/icons/26829yi.gif)
个下载
![](/icons/26829de.gif)
广告被快取起来
![](/icons/26829dou.gif)
导致使用者再也看不到其它页
![](/icons/26829de.gif)
广告
![](/icons/26829dou2.gif)
4、执行CGI
![](/icons/26829chengxu.gif)
在Apache原始安装里
![](/icons/26829dou.gif)
cgi-bin子目录下附有两组CGI
![](/icons/26829chengxu.gif)
![](/icons/26829dou.gif)
test-cgi 以及pr
![](/icons/26829int.gif)
env
![](/icons/26829dou.gif)
只不过这两组
![](/icons/26829chengxu.gif)
有潜在
![](/icons/26829de.gif)
安全漏洞
![](/icons/26829dou2.gif)
但是由于我们只是要做设定测试
![](/icons/26829dou.gif)
并且我们不会将这样
![](/icons/26829de.gif)
原始安装设定直接放在主运行服务器(live server)
![](/icons/26829dou.gif)
所以我们还是会激活其中
![](/icons/26829yi.gif)
组CGI
![](/icons/26829chengxu.gif)
![](/icons/26829dou.gif)
看看Apache当初是如何被设定来执行这组
![](/icons/26829chengxu.gif)
![](/icons/26829dou2.gif)
最后我们会自己撰写
![](/icons/26829yi.gif)
支简单
![](/icons/26829de.gif)
CGI
![](/icons/26829chengxu.gif)
![](/icons/26829dou2.gif)
首先
![](/icons/26829dou.gif)
要确定这组
![](/icons/26829chengxu.gif)
是能执行
![](/icons/26829de.gif)
![](/icons/26829dou2.gif)
进入cgi-bin子目录
![](/icons/26829dou.gif)
确定
![](/icons/26829chengxu.gif)
文件被设定为使用者(服务器执行时使用者)可执行以及使用组(服务器执行时使用组)可执行
![](/icons/26829dou2.gif)
对 Windows系统来说
![](/icons/26829dou.gif)
这
![](/icons/26829yi.gif)
步应该是非必要
![](/icons/26829de.gif)
![](/icons/26829dou2.gif)
接着
![](/icons/26829dou.gif)
对服务器要求这样
![](/icons/26829de.gif)
内容:
http://localhost:8080/cgi-bin/test-cgi
注意:只有在通过非root使用者进行服务器安装
![](/icons/26829de.gif)
情况下才需要指定8080端口(port)
![](/icons/26829dou2.gif)
这支Apache内建
![](/icons/26829de.gif)
test-cgi
![](/icons/26829chengxu.gif)
会列出CGI
![](/icons/26829chengxu.gif)
会存取
![](/icons/26829de.gif)
变量值
![](/icons/26829dou2.gif)
激活CGI支持是设定在httpd.conf设定文件内
![](/icons/26829de.gif)
ScriptAlias 指令区段
![](/icons/26829dou2.gif)
这个指令区段
![](/icons/26829de.gif)
原始设定值是:
ScriptAlias /cgi-bin/ "/usr/local/apache/cgi-bin/"
这行指令是告诉Apache如果要求
![](/icons/26829de.gif)
网页路径是以cgi-bin为起始
![](/icons/26829dou.gif)
这些文件可在/usr/local/apache/cgi-bin/ 目录下找得到
![](/icons/26829dou2.gif)
这行指令同时也告诉Apache要在这个目录下执行文件
![](/icons/26829dou2.gif)
在下面我准备了
![](/icons/26829yi.gif)
个会输出"How are you!"
![](/icons/26829de.gif)
简单CGI
![](/icons/26829chengxu.gif)
![](/icons/26829dou2.gif)
我将它命名为 how.sh
![](/icons/26829dou2.gif)
#!/bin/sh
echo "Content-type: text/html"
echo
echo "How are you!"
修改这个文件
![](/icons/26829de.gif)
权限使其成为可执行文件并且向你
![](/icons/26829de.gif)
服务器提出以下
![](/icons/26829de.gif)
要求:
http://localhost:8080/cgi-bin/how.sh
虽然这组CGI是采用shell script来编写
![](/icons/26829dou.gif)
其实它可以用任何适用于该系统
![](/icons/26829de.gif)
语言来撰写
![](/icons/26829dou2.gif)
至于有关CGI
![](/icons/26829chengxu.gif)
![](/icons/26829de.gif)
撰写如果有机会我会和大家作更深入
![](/icons/26829de.gif)
探讨
![](/icons/26829dou2.gif)
结论:
Apache支持
![](/icons/26829de.gif)
所有SSI 指令可以在Apachedocumentation 里找到
![](/icons/26829dou.gif)
Apache所有
![](/icons/26829de.gif)
功能都可以通过设定文件 (config file)进行调试
![](/icons/26829dou2.gif)
在这里我所介绍
![](/icons/26829de.gif)
仅只是设定文件相关知识
![](/icons/26829de.gif)
皮毛
![](/icons/26829dou2.gif)
设定文件
![](/icons/26829de.gif)
原始设定有着非常详尽
![](/icons/26829de.gif)
介绍说明文件
![](/icons/26829dou.gif)
而且每
![](/icons/26829yi.gif)
个系统版本都附有核心模块及标准模块
![](/icons/26829de.gif)
介绍说明文件
![](/icons/26829dou.gif)
如果你花些时间在这些文件里摸索
![](/icons/26829dou.gif)
你会找到任何你想要
![](/icons/26829de.gif)
功能