AS代码如下Q?br />
//定义一个JS函数
function say(txt){
return txt;
}
可以看到在JS中定义了一个sayҎ供AS调用Q现在我们在AS中定义了一个同名的sayҎ来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好?PS:不错?
二、JS调用ASҎ时出现同名方?/strong>Q?a >查看实例Q?/p>
AS代码如下Q?br />
//导入?/span>
import flash.external.*;
//提供JS讉K的函数名
var _method:String = "say";
//指定本地函数中this变量的作用域Q可讄为null留空
var e_area:Object = null;
//AS内部函数?/span>
var method:Function = say;
//函数注册到容器列表
var wasSuccessful:Boolean = ExternalInterface.addCallback(_method, method);
↑ q里q回的void因此无法转换为Boolean
//查看注册是否成功
if(wasSuccessful){
result_txt.text = "函数注册成功";
}
//本地的函?/span>
function say(txt:String) {
result_txt.text = txt;
}
HTML代码如下Q?/font>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh_cn" lang="zh_cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>javascript 调用 flash Ҏ</title>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script src="AC_RunActiveContent.js" language="javascript"></script>
</head>
<body bgcolor="#ffffff">
<!--q中用的 URL-->
<!--q中用的文本-->
<!--
<p>你们?lt;/p>
-->
<!-- saved from url=(0013)about:internet -->
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" width="550" height="400" align="middle" id="myFlash">
<param name="allowScriptAccess" value="sameDomain" />
<param name="allowFullScreen" value="false" />
<param name="movie" value="flashdcss.swf" /><param name="quality" value="high" /><param name="bgcolor" value="#ffffff" /> <embed name="myFlash" swLiveConnect="true" src="flashdcss.swf" quality="high" bgcolor="#ffffff" width="550" height="400" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
<SCRIPT LANGUAGE=JavaScript>
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
</SCRIPT>
<script>
//定义一个JS本地函数
function say(s){
thisMovie("myFlash").say(s);
//↑q里的demo指的是用Object插入flash的时候指定的id和embed指定的nameQ例如:id="demo"和name="demo"
alert(s);
}
//览器兼容访问DOMQƈ且将 flash Objectq回
function thisMovie(movieName) {
if (navigator.appName.indexOf("Microsoft") != -1) {
return window[movieName]
}
else {
return document[movieName]
}
}
</script>
<form name="www">
内容Q?/span><input type="text" name="sendText" maxlength="45" onChange="say(this.value)" >
</form>
</body>
</html>
可以看到在AS中定义了一个sayҎ供JS调用Q现在我们在JS中定义了一个同名的sayҎ来验证它们是否会出现覆盖。结果证明它们不会覆盖,都工作得很好?PS:也不错~)
通过上面的两个例子我们可以得出结?strong>在用ExternalInterface时即使定义了同名ҎQ也不会造成Ҏ覆盖Q你大可攑ֿ使用?/strong>
其余
============================================================
在论坛上l常看见有新手问?#8220;我想让FLASH得到URL中的参数IDP该怎么办?”“某某视频|站的FLASH播放器是如何播放不同ID的视频的Q?#8221;...诸如此类问题看到了太多,每次都有一堆回帖,众说ULQ里面难免有误导性质的回复。今天特l合自己qx工作中用的心得Ҏc问题做一个小的归纳?br />
我所指的静态传?/strong>是区别于与服务端通信q行g递的方式Q例如LoadVarsQXMLQRemoting之类Q后者暂且不在本文的讨论范围内,当你惌FLASH获取URL中的参数Ӟ你ؓ何不换个角度想了Q其实我们可以让服务端动态生成SWF的的插入代码Q主动将我们需要的参数“静?#8221;传递给FLASHQFLASH直接用就可以了,Ҏ不需要自己去拿,而以何种形式传递给FLASHQ就是我所指的静态传倹{我知道的可行的HTML与FLASH之间的静态传值方法有三种Q?
- SWF地址后用参C递符“Q?#8221;
- FlashVars传?/strong>
- JS控制
下面来具体介l下q三U方式的传递是如何工作的:
一、SWF地址后用参C递符“Q?#8221;
我们知道Q在ULR地址中用参C递符“Q?#8221;可以以GET方式传递参敎ͼ例如http://www.v-sky.com?uid=12&uname=vskyQ这里用了参数传递符“Q?#8221;Q同时用了q接W?#8220;&”做ؓ变量分隔标识Q以q种规范的格式来传递两个参敎ͼuid=12和uname=vskyQ那么服务端可以使用GET方式获取q两个倹{?br />
在FLASH中我们同样可以采用类似的方式来传递参敎ͼHTML面中插入SWF文g最常用的就是用Object标签和Embed标签l合的方式,q也是Adobe的推荐方式:
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf?uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf?uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
其中_体部分对应的就是SWF文g的地址Q那么我们可以在q个地址后面通过cM于URL中GET方式传参的方法来个SWF传递参敎ͼ例如上面代码在页面完全加载完毕时Q它已经lSWF文g写入了两个变量:uid=12和uname=vsky?br />
二、FlashVars传?/p>
你可以查阅FLASH帮助文档来看FlashVars的官方定义。其实在HTML语法中,q是一个被很多新手所忽视的属性,同样以上面的参数ZQ下面用FlashVars来传递变量:
<param name="allowScriptAccess" value="sameDomain" />
<param name="movie" value="demo.swf" />
<param name="FlashVars" value="uid=12&uname=vsky" />
<param name="quality" value="high" /><param name="bgcolor" value="#ffffff" />
<embed src="demo.swf" FlashVars="uid=12&uname=vsky" quality="high" bgcolor="#ffffff" width="400" height="300" name="flashvars" align="center" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
跟方式一相同Q它也是直接lFLASH里添加了q两个变量。但我个?strong>推荐使用此方?/strong>Q结?font color="#80ae14">SWFObject的?/font>Q用FlashVars来传递变量有很多好处Q例如代码清晎ͼҎ理Q浏览其兼容Q符合标准。他们的l合使用?#8220;为FLASHE序构造灵zȝ接口”一文中我已l做了介l(PS:随后我会提供一个复杂点的、有说服力的实际应用来说明这U灵zL口的使用)?br />
三、JS控制
对于客户端页面中的资源,JS通过DOMl构来控制它们可以说是随心所Ʋ的QFLASH也不例外Q下面是Flash Player的JavascriptҎ一览表:
Play() ————————————? 播放动画
StopPlay()————————————停止动?br />
IsPlaying()——————————?#8211; 动画是否正在播放
GotoFrame(frame_number)————? 跌{到某?br />
TotalFrames()—————————? 获取动画d?br />
CurrentFrame()——————————回传当前动L在?1
Rewind()———————————?使动画返回第一?br />
SetZoomRect(left,top,right,buttom)—?攑֤指定区域
Zoom(percent)——————————改变动d?br />
Pan(x_position,y_position,unit)————动画在x,y方向上^U?br />
PercentLoaded()————————?q回动画被蝲入的癑ֈ?br />
LoadMovie(level_number,path)——?#8211; 加蝲动画
TGotoFrame(movie_clip,frame_number)- movie_clip跌{到指定?br />
TGotoLabel(movie_clip,label_name)—?movie_clip跌{到指定标{?br />
TCurrentFrame(movie_clip)————?回传movie_clip当前?1
TCurrentLabel(movie_clip)————?#8211;回传movie_clip当前标签
TPlay(movie_clip)—————————播放movie_clip
TStopPlay(movie_clip)——————?停止movie_clip的播?br />
GetVariable(variable_name)————?#8211;获取变量
SetVariable(variable_name,value)——?#8211;变量赋?/strong>
TCallFrame(movie_clip,frame_number)—call指定帧上的action
TCallLabel(movie_clip,label)————?call指定标签上的action
TGetProperty(movie_clip,property)—?#8211;获取movie_clip的指定属?br />
TSetProperty(movie_clip,property,number)——?讄movie_clip的指定属?/font>
在这里我们只需要用的是粗体标识的SetVariableҎQJS通过调用此方法能够直接更改SWF中的变量倹{首先我们需要定义插入的SWF的IDQ例如id为VskyDemoQ那么我们可以通过下面的JS语句来完成SWF内部变量的设|:
很简单吧Q就是这L。除非是涉及CHTML中SWF之外元素跟它交互Q否则我一般不使用JS来控制SWF里的变量Q因为我总觉得怪怪的Q呵呵,个h习惯吧?br />
多多实践Q不要觉得这些小东西不v|东西多了,聚结C起了是一个大的应用?/strong>
条条大\通北京,选择你自己喜Ƣ的Q自pZL方式可以了Q目前我是没有发现这三个方式存在功能上的~陷?/p>
======================================================================================
前言、JavaScript和Macromedia Flash的通信CZ
原文地址: http://www.macromedia.com/support/flash/ts/documents/java_script_comm.htm
说明: 略作修改,主要是一些很初的操? 又很多相似的文章,不过q个很权?
下面是一些在Flash和用Javascript的HTML文g直接通信的示?每个CZ都有略的步骤
本文讨论?U基本的Flash/Javascript通信方式:
Javascript ?Flash的通信----使用Flash播放器的javascriptҎ
Flash ?Javascript的通信----使用Flash的fscommand
Flash ?Flash的通信----------使用本地q接对象或综合上2U技?/p>
q不是所有的览器都很重视脚?Z和Flash播放器通信,览器必L内置的钩子以便Flash播放器可?监听'.览器必L下列的几U?
Netscape Navigator 3.0-4.7x, ?Netscape 6.2或更?/strong>
(Windows 95/98/NT/2000/XP ?MacOS; 允许Java和LiveConnect)
Internet Explorer 3.0 或更?/strong>
(仅Windows 95/98/NT/2000/XP; 允许ActiveX)
注意:Macintosh上的Internet Explorer和早期版本的Netscape6不支持这U方?h看本文的附加信息
一、Javascript到Flash的通信
q个例子演示了如何用Flash的method把变量从HTML的input text 发送到该页面中的Flash文g?HTML input的数据通过Flash的SetVariableҎ传送到Flash文g?
查看CZ:CZ
下蝲源文? javascript_to_flash.zip(17k)
步骤:
Flash?br />
1.新徏一个文?保存为javascript_to_flash.fla
2.用文字工具在舞台上创Z个文本域
3.选择q个文本?在属性面板中,从下拉列表中选择动态文?Dynamic Text),在变?variable)栏填?myVar"
注意:最好的习惯是用Instance,用myVar.text更改myVar的?Z单v见和兼容Flash4和Flash5,我们使用的是变量名的形式.
4.保存文g
5.发布HTML文g和SWF文g
Dreamweaver?br />
下一步的工作转移到Dreamweaver中了,当然也可以是其他的HTML~辑?br />
1.打开上一步发布的HTML文g
2.插入生成的SWF文g和OBJECT/EMBED标签
(1) Insert>Media>Flash,q择q个Flash
(2) 切换C码视?我们需要修改被选中?lt;OBJECT>?lt;EMBED>标签
(3) 在OBJECT标签?插入id="myFlash"
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
注意:如果你是_脓复制代码的话,保删除不必要的换行.否则可能会引起错? id也可以在属性面杉K直接输入
(4) 在EMBED标签?插入name="myFlash"和swLiveConnect="true",保没有使用id属?代码应当是这样子?
<embed src="javascript_to_flash.swf" quality=high width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash"
name="myFlash" swLiveConnect="true">
</embed>
3.创徏表单?br />
(1) 回到设计视图
(2) 插入文本?Insert> Form Object> Text Field),如果询问是否d表单?选择?br />
(3) 把文本域的HTML标签修改成这?
<input type="text" name="sendText" maxlength="45"
onChange="doPassVar(this)">
每当文本域内容发生变化时,onChangep触发,doPassVar()函数p调用
4.创徏传递变量值的Javascript函数
复制下面的Javascript?lt;head></head>标签?/p>
<SCRIPT LANGUAGE=JavaScript>
<!--
function doPassVar(args){
var sendText = args.value;
window.document.myFlash.SetVariable("myVar", sendText);
}
//-->
</SCRIPT>
5.保存文g,试一?F12)
二、Flash到Javascript的通信
从HTML可以发送数据到Flash,反过来也可以. q个例子演示了如何应用Flash的Fscommand来发送数据到Javascript.
查看CZ:CZ2
下蝲源文? flash_to_javascript.zip(10K)
要步?
Flash?br />
新徏一个文?保存为flash_to_javascript.fla
创徏一个文本域,讄成输入文?Input Text),选择"border"以便我们能看C,指定他的变量为inputVar
创徏一个按?在按钮上d如下的as:
on (release) {
fscommand ("send_var", inputVar);
}
保存文g,导出HTML和SWF
Dreamweaver?br />
1.打开导出HTML文g,修改<OBJECT>?lt;EMBED>标签,l果同上:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/
flash/swflash.cab#version=5,0,0,0"
width=366 height=142 id="myFlash">
<embed src="javascript_to_flash.swf" quality=high
width=366 height=142
type="application/x-shockwave-flash"
pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?
P1_Prod_Version=ShockwaveFlash" name="myFlash" swLiveConnect="true">
</embed>
2. 插入如下的Javascript?lt;Body>标签?
<SCRIPT LANGUAGE=JavaScript>
<!--
var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;
function myFlash_DoFSCommand(command, args) {
var myFlashObj = InternetExplorer ? myFlash : document.myFlash;
alert (args);
}
if (navigator.appName && navigator.appName.indexOf("Microsoft")
!= -1 &&
navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows
3.1") == -1) {
document.write('<SCRIPT LANGUAGE=VBScript\> \n');
document.write('on error resume next \n');
document.write('Sub myFlash_FSCommand(ByVal command, ByVal args)\n');
document.write(' call myFlash_DoFSCommand(command, args)\n');
document.write('end sub\n');
document.write('</SCRIPT\> \n');
}
//-->
</SCRIPT>
三、Flash和Flash的通信
通过上面两种Ҏ的和?同一HTML中两个或者更多的Flash直接可以怺传送消? 从一个flash使用fscommand传送消息给Javascript,使用Flash的Javascript methods把消息传l另外一个flash
详细的看q里:Flashq之间的通信CZ
从Flash MX开?local connection对象可以用来在flash之间传送消? q得同一HTML中的或者位于两个浏览器H口中的两个flashq可以怺发送消?而不必用Javascript或者fscommand
详细的看q里:在Flash MX中用local connection对象(英文Q?/p>
本站的localConnection教程Q?a target="_blank">http://www.flashempire.com/school/tutorview.php?id=327
附可控制Flash Player的JavascriptҎ:
一览表:
Play() ---------------------------------------- 播放动画
StopPlay()------------------------------------停止动画
IsPlaying()----------------------------------- 动画是否正在播放
GotoFrame(frame_number)---------------- 跌{到某?
TotalFrames()------------------------------- 获取动画d?
CurrentFrame()------------------------------回传当前动画所在?1
Rewind()-------------------------------------使动画返回第一?
SetZoomRect(left,top,right,buttom)-------攑֤指定区域
Zoom(percent)------------------------------改变动画大小
Pan(x_position,y_position,unit)------------使动dx,y方向上^U?
PercentLoaded()----------------------------q回动画被蝲入的癑ֈ?
LoadMovie(level_number,path)----------- 加蝲动画
TGotoFrame(movie_clip,frame_number)- movie_clip跌{到指定?
TGotoLabel(movie_clip,label_name)------ movie_clip跌{到指定标{?
TCurrentFrame(movie_clip)--------------- 回传movie_clip当前?1
TCurrentLabel(movie_clip)-----------------回传movie_clip当前标签
TPlay(movie_clip)---------------------------播放movie_clip
TStopPlay(movie_clip)----------------------停止movie_clip的播?
GetVariable(variable_name)-----------------获取变量
SetVariable(variable_name,value)-----------变量赋?
TCallFrame(movie_clip,frame_number)---call指定帧上的action
TCallLabel(movie_clip,label)----------------call指定标签上的action
TGetProperty(movie_clip,property)--------获取movie_clip的指定属?
TSetProperty(movie_clip,property,number)-讄movie_clip的指定属

]]>
动态图片新?JS实现.
<script language="JavaScript">
var imgUrl=new Array();
var imgLink=new Array();
var imgText=new Array();
var picNum=0;
imgUrl[1]="囄地址一";
imgLink[1]="链接1";
imgText[1]="标题或简介或其它HTML内容1";
imgUrl[2]="囄地址?;
imgLink[2]="链接2";
imgText[2]="标题或简介或其它HTML内容2";
imgUrl[3]="囄地址?;
imgLink[3]="链接3";
imgText[3]="标题或简介或其它HTML内容3";
imgUrl[4]="囄地址?;
imgLink[4]="链接4";
imgText[4]="标题或简介或其它HTML内容4";
imgUrl[5]="囄地址?;
imgLink[5]="链接5";
imgText[5]="标题或简介或其它HTML内容5";
function NextPic(){
if(picNum<4) picNum++ ;//昄4个图?br /> else picNum=1;
if (document.all){
//下面注意Q如果存在于FORM表单中,需要用下面的ҎQ否则可直接使用name?br /> document.imgInit.filters.revealTrans.Transition=Math.floor(Math.random()*23);
document.imgInit.filters.revealTrans.apply();
document.imgInit.filters.revealTrans.play();
}
document.images.imgInit.src=imgUrl[picNum];
//如果不是囄Q而是SWF{,可做判断Q内容可在程序中做好Q再放于下面?br /> focustext.innerHTML='<a href='+imgLink[picNum]+' target=_blank>'+imgText[picNum]+'</a>';
//讄页旉
theTimer=setTimeout('NextPic()', 3000);
}
function goUrl(){
window.open(imgLink[picNum],'_blank');
}
</script>
HTML代码中:
可以做到控g?br /><TABLE cellPadding=0 width=100% border=0>
<TR>
<TD align=middle height="140" >
<div align='center'>
<a href='javascript:goUrl()'><img style="FILTER: revealTrans(duration=2,Transition=5)" src="javascript:NextPic()" width="170" height="120" border="1" id=imgInit name=imgInit></a></TD></TR>
<TR><TD align=middle height="38" ><div name=focustext id=focustext align='center'></div>
</div>
</TD></TR></TABLE>
httpd.conf提供了最基本的服务器配置Q是对守护程序httpd如何q行的技术描qͼsrm.conf是服务器的资源映文Ӟ告诉服务器各U文件的MIMEcdQ以及如何支持这些文Ӟaccess.conf用于配置服务器的讉K权限Q控制不同用户和计算机的讉K限制Q这三个配置文g控制着服务器的各个斚w的特性,因此Z正常q行服务器便需要设|好q三个文件?/p>
除了q三个设|文件之外,Apacheq用mime.types文g用于标识不同文g
对应的MIMEcdQ?magic文g讄不同MIMEcd文g的一些特D标识,使得 Apache 服务器从文档后缀不能判断出文件的MIME cdӞ能通过文g内容中的q些Ҏ标记来判断文档的MIMEcd?/p>
bash-2.02$ ls -l /usr/local/apache/conf
total 100
-rw-r--r-- 1 root wheel 348 Apr 16 16:01 access.conf
-rw-r--r-- 1 root wheel 348 Feb 13 13:33 access.conf.default
-rw-r--r-- 1 root wheel 30331 May 26 08:55 httpd.conf
-rw-r--r-- 1 root wheel 29953 Feb 13 13:33 httpd.conf.default
-rw-r--r-- 1 root wheel 12441 Apr 19 15:42 magic
-rw-r--r-- 1 root wheel 12441 Feb 13 13:33 magic.default
-rw-r--r-- 1 root wheel 7334 Feb 13 13:33 mime.types
-rw-r--r-- 1 root wheel 383 May 13 17:01 srm.conf
-rw-r--r-- 1 root wheel 357 Feb 13 13:33 srm.conf.default
事实上当前版本的Apache原来httpd.conf、srm.conf与access.conf中的所有配|参数均攑֜了一个配|文?httpd.conf中,只是Z与以前的版本兼容的原因(使用q三个设|文件的方式来源于NCSA-httpdQ,才用三个配|文件。而提供的 access.conf和srm.conf文g中没有具体的讄?/p>
׃在新版本的Apache中,所有的讄都被攑֜了httpd.conf中,因此只需要调整这个文件中的设|。以下用缺省提供的httpd.confZQ解释Apache?br />务器的各个设|选项。然而不必因为它提供讄的参数太多而烦|基本上这?br />参数都很明确Q也可以不加改动q行Apache服务器。但如果需要调整Apache服务
器的性能Q以及增加对某种Ҏ的支持Q就需要了解这些设|参数的含义?/p>
关于Apache服务器的性能Q在Internet上存在很大的争议Q基本上使用Apache的用者几乎都不怀疑它的优U性能QApache也支撑了很多著名的高负蝲的网站,但是在商业机构的评测中,Apache往往得分不高。很多h指出Q在q些评测中,商业Web服务器及其操作系l往往由其专业公司的工E师q行q性能调整Q而Free 的操作系l和Web服务器往往׃用其~省配置或仅仅作很小的更攏V需要指出的是,除了操作pȝ的性能调整之外QApache 服务器本w的~省配置l不是最优化和最高效的,而是要适应几乎所有种cL作系l、所有种cȝ件下的设|,多^台的软g不可能ؓ特定q_和特定硬件提供最优化的缺省配|。因此要使用Apache的时候,性能调整是必不可的?/p>
在商业评中忽略了的另一个事实是Q评时往往对不同种cȝ功能q行?br />较,例如使用Apache的标准CGI 的性能与ISAPIQNSAPI{服务器端API比较Q事实上Apache服务器与此可以比较的功能为modperl QFastCGIQ与ASPcM的功能ؓPHP{等Q只不过׃Apache的开放模式,q些功能是由独立的开发组Q作为独立的模块来实现的。但是在评测中,试人员没有加入相应的模块评其性能?/p>
HTTP守护q程的运行参?/p>
httpd.conf中首先定义了一些httpd守护q程q行旉要的参数Q来军_其运行方式和q行环境?/p>
ServerType standalone
ServerType定义服务器的启动方式Q缺省gؓ独立方式standaloneQhttpd
服务器将由其本n启动Qƈȝ在主Z监视q接h。在Linux下将在启动文?/etc/rc.d/rc.local/init.d/apache中自动启动Web服务器,q种方式是推荐设|?br /> 启动Apache服务器的另一U方式是inet方式Q用超U服务器inetd监视q接hq启动服务器。当需要用inetd启动方式Ӟ侉K要更改ؓq个讄Qƈ屏蔽/etc/rc.d/rc.local/init.d/apache文gQ以及更?etc/inetd.confq?inetdQ那么Apachep从inetd中启动了?br /> 两种方式的区别是独立方式是由服务器自w管理自q启动q程Q这样在?br />动时能立卛_动服务器的多个副本,每个副本都驻留在内存中,一有连接请求不需要生成子q程可以立卌行处理,对于客户览器的h反应更快Q性能?br />高。?inetd方式要由inetd发现有连接请求后才去启动http服务器,׃inetd 要监听太多的端口Q因此反应较慢、效率较低,但节U了没有q接h时Web服务器占用的资源。因此inetd方式只用于偶被讉Kq且不要求访问速度的服务器上。事实上inetd方式不适合http的突发和多连接的Ҏ,因ؓ一个页面可能包含多个图象,而每个图象都会引起一个连接请求,即虽然讉K人数造成教少Q但瞬间的连接请求ƈ不少Q这受到inetd性能的限Ӟ甚至会媄响由inetd启动的其他服务器E序?/p>
ServerRoot "/usr/local"
ServerRoot用于指定守护q程httpd的运行目录,httpd在启动之后将自动?br />q程的当前目录改变ؓq个目录Q因此如果设|文件中指定的文件或目录是相?br />路径Q那么真实\径就位于q个ServerRoot定义的\径之下?br /> ׃httpd会经常进行ƈ发的文g操作Q就需要用加锁的方式来保证文件操作不冲突Q由于NFS文gpȝ在文件加锁方面能力有限,因此q个目录应该是本地磁盘文件系l,而不应该使用NFS文gpȝ?/p>
#LockFile /var/run/httpd.lock
LockFile参数指定了httpd守护q程的加锁文Ӟ一般不需要设|这个参敎ͼ Apache服务器将自动在ServerRoot下面的\径中q行操作。但如果ServerRoot为NFS文gpȝQ便需要用这个参数指定本地文件系l中的\径?/p>
PidFile /var/run/httpd.pid
PidFile指定的文件将记录httpd守护q程的进E号Q由于httpd能自动复制其自nQ因此系l中有多个httpdq程Q但只有一个进Eؓ最初启动的q程Q它为其他进E的父进E,对这个进E发送信号将影响所有的httpdq程。PidFILE定义的文件中p录httpd父进E的q程受?/p>
ScoreBoardFile /var/run/httpd.scoreboard
httpd使用ScoreBoardFile来维护进E的内部数据Q因此通常不需要改变这个参敎ͼ除非理员想在一台计机上运行几个Apache服务器,q时每个Apache服务器都需要独立的讄文ghtt pd.confQƈ使用不同的ScoreBoardFile?/p>
#ResourceConfig conf/srm.conf
#AccessConfig conf/access.conf
q两个参数ResourceConfig和AccessConfigQ就用于和?srm.conf ?access.conf 讄文g的老版本Apache兼容。如果没有兼容的需要,可以对应的讄文g指定?dev/nullQ这表CZ存在其他讄文gQ而仅使用 httpd.conf 一个文件来保存所有的讄选项?/p>
Timeout 300
Timeout定义客户E序和服务器q接的超旉隔,过q个旉间隔Q秒Q后服务器将断开与客h的连接?/p>
KeepAlive On
在HTTP 1.0中,一ơ连接只能作传输一ơHTTPhQ而KeepAlive参数用于支持HTTP 1.1版本的一ơ连接、多ơ传输功能,q样可以在一ơ连接中传递多个HTTPh。虽然只有较新的览器才支持q个功能Q但q是打开使用q个选项?/p>
MaxKeepAliveRequests 100
MaxKeepAliveRequestsZơ连接可以进行的HTTPh的最大请求次数。将
其D?支持在一ơ连接内q行无限ơ的传输h。事实上没有客户E序在一ơ连接中h太多的页面,通常达不到这个上限就完成q接了?/p>
KeepAliveTimeout 15
KeepAliveTimeout试一ơ连接中的多ơ请求传输之间的旉Q如果服务器
已经完成了一ơ请求,但一直没有接收到客户E序的下一ơ请求,在间隔超q了
q个参数讄的g后,服务器就断开q接?/p>
MinSpareServers 5MaxSpareServers 10
在用子q程处理HTTPh的Web服务器上Q由于要首先生成子进E才能处理客LhQ因此反应时间就有一点gq。但是,Apache服务器用了一个特D技术来摆脱q个问题Q这是预先生成多个IZ的子q程ȝ在系l中Q一旦有h出现Q就立即使用q些IZ的子q程q行处理Q这样就不存在生成子q程造成的gq了。在q行中随着客户h的增多,启动的子q程会随之增多,但这些服务器副本在处理完一ơHTTPh之后q不立即退出,而是停留在计机中等待下ơ请求。但是空余的子进E副本不能光增加不减,太多的空余子q程没有处理dQ也占用服务器的处理能力Q因此也要限制空余副本的数量Q其保持一个合适的数量Q得既能及时回应客戯求,又能减少不必要的q程数量?br /> 因此可以用参数MinSpareServers来设|最的IZ子进E数量, 以及
使用参数MaxSpareServers 来限制最多的I闲子进E数量,多余的服务器q程?br />本就会退出。根据服务器的实际情冉|q行讄Q如果服务器性能较高Qƈ且也
被频J访问,应该增大这两个参数的设|。对于高负蝲的专业网站,q两个?br />应该大致相同Qƈ且等同于pȝ支持的最多服务器副本数量Q也减少不必要的?br />本退出?/p>
StartServers 5
StartServers参数是用来讄httpd启动时启动的子进E副本数量,q个参数与上面定义的MinSpareServers?MaxSpareServers参数相关Q都是用于启动空闲子q程以提高服务器的反应速度的。这个参数应该设|ؓ前两个g间的一个数|于 MinSpareServers和大于MaxS pareServers都没有意义?/p>
MaxClients 150
在另一斚wQ服务器的能力毕竟是有限的,不可能同时处理无限多的连接请
求,因此参数Maxclient sq于规定服务器支持的最多ƈ发访问的客户敎ͼ如果q个D|得q大Q系l在J忙时不得不在过多的q程之间q行切换来ؓ太多的客戯行服务,q样Ҏ个客L反应׃减慢Qƈ降低了整体的效率。如果这个D|的较小Q那么系l繁忙时׃拒绝一些客Lq接h。当服务器性能较高Ӟ可以适当增加q个值的讄。对于专业网站,应该使用提高服务器效率的{略Q因此这个参C能超q硬件本w的限制Q如果频J出现拒l访问现象,p明需要升U服务器g了。对于非专业|站Q不太在意对客户览器的反应速度Q或者认为反应速度较慢也比拒绝q接好,׃可以略微过g条g来设|这个参数?br /> q个参数限制了MinSpareServers和MaxSpareServers的设|,它们不应该大
于这个参数的讄?/p>
MaxRequestsPerChild 30
使用子进E的方式提供服务的Web服务Q常用的方式是一个子q程Zơ连接服务,q样造成的问题就是每ơ连接都需要生成、退出子q程的系l操作,使得q些额外的处理过E占据了计算机的大量处理能力。因此最好的方式是一个子q程可以为多ơ连接请求服务,q样׃需要这些生成、退E的pȝ消耗, Apache采用了q样的方式,一ơ连接结束后Q子q程q不退出,而是停留在系l中{待下一ơ服务请求,q样极大的提高了性能?br /> 但由于在处理q程中子q程要不断的甌和释攑ֆ存,ơ数多了׃造成一
些内存垃圾,׃影响pȝ的稳定性,q且影响pȝ资源的有效利用。因此在一个副本处理过一定次数的h之后Q就可以让这个子q程副本退出,再从原始?br />httpdq程中重新复制一个干净的副本,q样p提高pȝ的稳定性。这P?br />个子q程处理服务hơ数由MaxRe questPerChild定义?~省的设|gؓ30Q?br />q个值对于具备高E_性特点的Linuxpȝ来讲是过于保守的讄Q可以设|ؓ1000甚至更高Q设|ؓ0支持每个副本q行无限ơ的服务处理?/p>
#Listen 3000
#Listen 12.34.56.78:80
#BindAddress *
Listen参数可以指定服务器除了监视标准的80端口之外Q还监视其他端口?br />HTTPh。由于FreeBSDpȝ可以同时拥有多个IP地址Q因此也可以指定服务器只听取Ҏ个BindAddress< /B>的IP地址的HTTPh。如果没有配|这一,则服务器会回应对所有IP的请求?br /> 即使用了BindAddress参数Q得服务器只回应对一个IP地址的请求,但是通过使用扩展的Listen参数Q仍然可以让HTTP守护q程回应对其他IP地址的请求。此时Listen参数的用法与上面的第二个例子相同。这U比较复杂的用法主要用于讄虚拟L。此后可以用 VirtualHost参数定义对不同IP的虚拟主机,然而这U用法是较早的HTTP 1.0标准中设|虚拟主机的ҎQ每针对一个虚拟主机就需要一个IP地址Q实际上用处q不大。在HTTP 1.1中,增加了对单IP地址多域名的虚拟L的支持,使得虚拟L的设|具备更大的意义?/p>
LoadModule mime_magic_module libexec/apache/mod_mime_magic.so
LoadModule info_module libexec/apache/mod_info.so
LoadModule speling_module libexec/apache/mod_speling.so
LoadModule proxy_module libexec/apache/libproxy.so
LoadModule rewrite_module libexec/apache/mod_rewrite.so
LoadModule anon_auth_module libexec/apache/mod_auth_anon.so
LoadModule db_auth_module libexec/apache/mod_auth_db.so
LoadModule digest_module libexec/apache/mod_digest.so
LoadModule cern_meta_module libexec/apache/mod_cern_meta.so
LoadModule expires_module libexec/apache/mod_expires.so
LoadModule headers_module libexec/apache/mod_headers.so
LoadModule usertrack_module libexec/apache/mod_usertrack.so
LoadModule unique_id_module libexec/apache/mod_unique_id.so
ClearModuleList
AddModule mod_env.c
AddModule mod_log_config.c
AddModule mod_mime_magic.c
AddModule mod_mime.c
AddModule mod_negotiation.c
AddModule mod_status.c
AddModule mod_info.c
AddModule mod_include.c
AddModule mod_autoindex.c
AddModule mod_dir.c
AddModule mod_cgi.c
AddModule mod_asis.c
AddModule mod_imap.c
AddModule mod_actions.c
AddModule mod_speling.c
AddModule mod_userdir.c
AddModule mod_proxy.c
AddModule mod_alias.c
AddModule mod_rewrite.c
AddModule mod_access.c
AddModule mod_auth.c
AddModule mod_auth_anon.c
AddModule mod_auth_db.c
AddModule mod_digest.c
AddModule mod_cern_meta.c
AddModule mod_expires.c
AddModule mod_headers.c
AddModule mod_usertrack.c
AddModule mod_unique_id.c
AddModule mod_so.c
AddModule mod_setenvif.c
Apache服务器的一个重要特性就是其模块化的l构Q这不但表现为其能在~?br />译时能通过新的模块加入新的功能Q还表现为其模块可以动态加载入http服务E?br />序中Q而不必蝲入不需要的模块。用Apache的动态加载模块只需要设|好Load Module和AddModule参数可以了Q这U特性就是Apache?DSOQDynamic Shared ObjectQ特性,然而要惛_分用DSOҎ仍然不是一个简单的事情Q不适当的改动这里的讄可能造成服务器不能正常启动。因此如果不是要增加或减服务器提供的功能,׃要改动这里的讄?/p>
上面q些列表显CZLinux下的~省Apache服务器支持的模块Q事实上?br />多模块是没有必要的,不必要模块不会被载入内存。模块可以静态连接到Apache 服务器内部,也可以这样动态加载,Apache的特性都~译成动态可加蝲模块是该Port的做法,而不是Apache的缺省做法,q样׃牺牲很小的性能的同Ӟ带来极大的灵zL?/p>
因而动态可加蝲的能力还是对性能有轻微的影响Q因此可以重新编译ApacheQ将自己所需要的功能~译qApache 服务器内部,可以让系l显得更为干净Q效率也有轻微的提高。通常仅仅Zq一个目的就重新~译Apache是没有必要的Q如果需要增加其他特性而重新编?ApacheQ不妨在增加其他模块的同时将所有的模块都静态连接入Apache 服务器。有的用者更喜欢动态加载模块,那么也不妨全部都使用动态加载模块?/p>
q些模块都被攄?usr/local/apache/libexec/目录下,每个模块对应Apache服务器的一个特性。详l解释每个模块的功能需要相当多的篇q,其中比较重要的特性将在后面相应的地方中进行解释,而具体每个模块的功能及用法就需要查看Apache的文档?/p>
#ExtendedStatus On
Apache服务器可以通过Ҏ的HTTPhQ来报告自n的运行状态,打开q个
ExtendedStatus 参数可以让服务器报告更全面的q行状态信息?/p>
L务器讄
Apache服务器需要各U设|,以定义自׃用各U参C提供Web服务。对于用虚拟主机的情况Q除了在虚拟L的定义项中覆盖的讄之外Q有的设|必重新定义)Q这里的讄也是虚拟L的缺省设|?/p>
Port 80
Port定义了Standalone模式下httpd守护q程使用的端口,标准端口?0。这个选项只对于以独立方式启动的服务器才有效,对于以inetd方式启动的服务器则在inetd.conf中定义用哪个端口?/p>
在Unix下?0端口需要root权限Q一些管理员Z安全的原因,认ؓ httpd 服务器不可能没有安全漏洞Q因而更愿意使用普通用L权限来启动服务器Q这样就不能使用80端口及其他小?024的端口,而必M用大?1024的端口来启动httpdQ一般情况下8000?080也是常用的端口。而Apache httpd服务器本w可以在以root权限打开80端口后再改变为普通用戯n份进行运行,q样减了危险性,因而就不需要考虑q个安全问题。但是如果普通用户也惛_装配|自qWWW服务器,那么׃得不使用大于1024的端口?/p>
User nobody
Group nogroup
User和Group配置是Apache的安全保证,Apache在打开端口之后Q就其本n讄两个选项讄的用户和l权限进行运行,q样降低了服务器的危险性。这个选项也只用于 Standalone模式Qinetd模式在inetd.conf中指定运行Apache的用戗由于服务器必须执行改变w䆾的setuid()操作Q因此初始进E应该具备root权限Q如果是使用非root用户来启动AapcheQ这个配|就不会发挥作用?br /> ~省讄为nobody和nogroupQ这个用户和l在pȝ中不拥有文gQ保证了服务器本w和由它启动的CGI q程没有权限更改文gpȝ。在某些情况下,例如Zq行CGI与Unix交互Q也需要让服务器来讉K服务器上的文Ӟ如果仍然使用nobody?nogroupQ那么系l中会出现属于nobody的文Ӟq对于系l安全是不利的,因ؓ其他E序也会以nobody和nogroup的权限执行某些操作,有可能讉Kq些nobody拥有的文Ӟ造成安全问题。一般情况下要ؓWeb服务讑֮一个特定的用户和组Q同时在q里更改用户和组讄?/p>
ServerAdmin you@your.address
配置文g中应该改变的也许只有ServerAdminQ这一用于配|WWW服务器的理员的email地址Q这在HTTP服务出现错误的条件下q回l浏览器Q以便让Web使用者和理员联p,报告错误。习惯上使用服务器上的webmaster作ؓWWW服务器的理员,通过邮g服务器的别名机制Q将发送到webmaster 的电子邮件发送给真正的Web理员?/p>
#ServerName new.host.name
~省情况下,q不需要指定这个ServerName参数Q服务器自动通过名字?br />析过E来获得自己的名字,但如果服务器的名字解析有问题Q通常为反向解析不
正确Q,或者没有正式的DNS名字Q也可以在这里指定IP地址。当ServerName?br />|不正确的时候,服务器不能正常启动?br /> 通常一个Web服务器可以具有多个名字,客户览器可以用所有这些名字或IP地址来访问这台服务器Q但在没有定义虚拟主机的情况下,服务器L以自q正式名字回应览器。ServerName定义了Web服务器自己承认的正式名字Q例如一台服务器名字Q在DNS中定义了AcdQؓ exmaple.org.cnQ同时ؓ了方便记忆还定义了一个别名(CNAME记录Qؓwww.exmaple.org.cnQ那么Apache自动解析得到的名字就为example.org.cnQ这样不客h览器使用哪个名字发送请求,服务器L告诉客户E序自己?example.org.cn。虽然这一般ƈ不会造成什么问题,但是考虑到某一天服务器可能q移到其他计机上,而只想通过更改DNS中的www别名配置完成迁UMQ务,所以不惌客户在其书签中?Linux 记录下这个服务器的地址Q就必须使用ServerName来重新指定服务器的正式名字?/p>
DocumentRoot "/www/"
DocumentRoot定义q个服务器对外发布的文本文档存攄路径Q客L序请求的UR Lp映射个目录下的网|件。这个目录下的子目录Q以及?br />W号q接指出的文件和目录都能被浏览器讉KQ只是要在URL上用同L相对目录名?/p>
注意Q符可接虽焉辑上位于根文档目录之下Q但实际上可以位于计机
上的L目录中,因此可以使客L序能讉K那些Ҏ档目录之外的目录Q这?br />增加了灵zL的同时但减了安全性。Apache在目录的讉K控制中提供了 FollowSymLinks选项来打开或关闭支持符可接的Ҏ?/p>
Options FollowSymLinks
AllowOverride None
Apache服务器可以针对目录进行文档的讉K控制Q然而访问控制可以通过?br />U方式来实现Q一个是在设|文?httpd.confQ或access.confQ中针对每个?br />录进行设|,另一个方法是在每个目录下讄讉K控制文gQ通常讉K控制文g
名字?htaccess。虽然用这两个方式都能用于控制览器的讉KQ然而用配|文件的Ҏ要求每次改动后重新启动httpd守护q程Q比较不灉|Q因此主要用于配|服务器pȝ的整体安全控制策略,而用每个目录下?htaccess文g讄具体目录的访问控制更为灵zLѝ?br /> Directory语句是用来定义目录的访问限制的Q这里可以看出它的标准语法,Z个目录定义访问限制。上例的q个讄是针对系l的根目录进行的Q设|了允许W号q接的选项FollowSymLinks Q以及用AllowOverride None表示不允许这个目录下的访问控制文件来改变q里q行的配|,q也意味着不用查看q个目录下的相应讉K控制文g?br /> ׃Apache对一个目录的讉K控制讄是能够被下一U目录承的Q因此对
根目录的讄媄响到它的下目录。注意由于AllowOverride None的设|,?br />得Apache服务器不需要查看根目录下的讉K控制文gQ也不需要查看以下各U目
录下的访问控制文Ӟ直至httpd.confQ或access.conf Q中为某个目录指定了
允许AlloworrideQ即允许查看讉K控制文g。由于Apache对目录访问控制是采用的承方式,如果从根目录允许查看访问控制文Ӟ那么 Apache必MU一U的查看讉K控制文gQ对pȝ性能会造成影响。而缺省关闭了根目录的q个Ҏ,׃得Apache从httpd.conf中具体指定的目录向下搜寻Q减了搜寻的敎ͼ增加了系l性能。因此对于系l根目录讄AllowOverride None不但对于pȝ安全有帮助,也有益于pȝ性能?/p>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
q里定义的是pȝ对外发布文档的目录的讉K讄Q设|不同的 AllowOverride选项Q以定义配置文g中的目录讄和用L录下的安全控制文件的关系Q而Options选项用于定义该目录的Ҏ?br /> 配置文g和每个目录下的访问控制文仉可以讄讉K限制Q设|文件是?br />理员设|的Q而每个目录下的访问控制文件是q录的属主讄的,因此理
员可以规定目录的属主是否能覆盖系l在讄文g中的讄Q这需要?啊AllowOverride参数q行讄Q通常可以讄的gؓQ?br />AllowOverride的设|?Ҏ个目录访问控制文件作用的影响
All ~省|使访问控制文件可以覆盖系l配|?br />None 服务器忽略访问控制文件的讄
Options 允许讉K控制文g中可以用Options参数定义目录的选项
FileInfo 允许讉K控制文g中可以用AddType{参数设|?br />AuthConfig 允许讉K控制文g使用AuthNameQAuthType{针Ҏ个用L认证机制Q这使目录属主能用口令和用户名来保护目录 Limit 允许对访问目录的客户机的IP地址和名字进行限?br /> 每个目录具备一定属性,可以使用Options来控制这个目录下的一些访问特性设|,以下为常用的Ҏ选项Q?/p>
Options讄 服务器特性设|?br />All 所有的目录Ҏ都有效Q这是缺省状?br />None 所有的目录Ҏ都无效
FollowSymLinks 允许使用W号q接Q这ɋ览器有可能讉K文档根目?QDocumentRootQ之外的文档 SymLinksIfOwnerMatch 只有W号q接的目的与W号q接本n为同一用户所拥有Ӟ才允许访问,q个讄增加一些安全?br />ExecCGI 允许q个目录下可以执行CGIE序 Indexes 允许览器可以生成这个目录下所有文件的索引Q得在q个目录下没有index.htmlQ或其他索引文gQ时Q能向浏览器发送这个目录下的文件列?br /> 此外Q上例中q用了Order、Allow、Deny{参敎ͼq是Limit语句中用来根据浏览器的域名和 IP地址来控制访问的一U方式。其中Order定义处理Allow和Deny的顺序,而Allow、Deny则针对名字或IPq行讉K控制讄Q上例?allowfrom allQ表C允许所有的客户问这个目录,而不q行M限制?/p>
UserDir public_html
当在一台Linux上运行Apache服务器时Q这台计机上的所有用户都可以有自q|页路径QŞ?http://example.org.cn/~userQ用L符?..褂肈ISABLED?UserDir的参数即可?/p>
#
# AllowOverride FileInfo AuthConfig Limit
# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
#
# Order allow,deny
# Allow from all
#
#
# Order deny,allow
# Deny from all
#
#
q里可以看到Directory的另一个用法,卛_以通过单的模式匚wҎQ针对分布在不同目录下的子目录定义访问控制权限。这栯|就需要Apache服务器对每个路径q行额外的处理,因此׃降低服务器的性能Q所以缺省情况ƈ没有打开q种讉K限制?/p>
q里可以看到另外一个语句LimitQLimit语句是用来针对具体的请求方法来讑֮讉K控制的,其中可以使用GET、POST{各U服务器支持的请求方法做Lim
it的参敎ͼ来设定对不同hҎ的访问限制。一般可以打开对GET、POST?HEAD三种hҎQ而屏蔽其他的hҎQ以增加安全性。Limit语句中,可以用Order 、Allow、DenyQAllow和Deny中可以用匹配的Ҏ针对域名和IPq行限制Q只是对于域名是从后向前匚wQ对于IP地址则从前向后匹配?/p>
DirectoryIndex index.html
很多情况下,URL中ƈ没有指定文档的名字,而只是给Z一个目录名。那么Apache服务器就自动q回q个目录下由DirectoryIndex定义的文Ӟ当然可以指定多个文g名字Q系l会q个目录下顺序搜索。当所有由DirectoryIndex指定的文仉不存在时QApache服务器可以根据系l设|,生成q个目录下的所有文件列表,提供用户选择。此时该目录的访问控刉项中的Indexes选项QOptions Indexes Q必L开Q以使得服务器能够生成目录列表,否则Apache拒l访问?/p>
AccessFileName .htaccess
AccessFileName定义每个目录下的讉K控制文g的文件名Q缺省ؓ.htaccessQ可以通过更改q个文gQ来改变不同目录的访问控刉制?/p>
Order allow,deny
Deny from all
除了可以针对目录q行讉K控制之外Q还可以Ҏ文g来设|访问控Ӟq?br />是File语句的Q务。用File 语句Q不文件处于哪个目录,只要名字匚wQ就必须接受相应的访问控制。这个语句对于系l安全比较重要,例如上例屏蔽所有的使用者不能访?htaccess文gQ这样就避免.htaccess中的关键安全信息不至于被客户获取?/p>
#CacheNegotiatedDocs
~省情况下如果代理服务器和Apache服务器协商是否缓存其|页QApachel?br />予否定的回答Q不希望自己的网被代理服务器缓存。然而这样就不能有效的利用代理服务器的优势,因此可以讄CacheNegotiatieDocs 选项Q?使得代理服务器可以对|页q行~存。然而即使不讄q个选项Q有的代理服务器Q或通过调整讄Q也能对|页q行~存?/p>
UseCanonicalName On
打开q个UseCanonicalName是Web服务器的标准做法Q因为客户发送的大部分请求都是对本服务器的引用,q样服务器就能?ServerName和Port选项的设|内Ҏ建完整的URLQƈ回应客户Qɋ览器能得到规范的URL。如果将q个参数讄为OffQ那?Apache用从客户h中获得服务器的名字和端口|支持HTTP 1.1的客Lh中将会有q些信息Q,重新构徏URL?/p>
TypesConfig /usr/local/apache/etc/mime.types
TypeConfig用于讄保存有不同的MIMEcd数据的文件名Q在Linux下缺省设|ؓ/usr/local/apache/etc/mime.types?/p>
DefaultType text/plain
如果Web服务器不能决定一个文档的~省cdQ这通常表示文档使用了非标准的后~Q那么服务器׃?DefaultType定义的MIMEcd文档发送给客户览器。这里的讄为text/plainQ这栯|的问题是,如果服务器不能判断出文档?MIMEQ那么大部分情况下这个文档ؓ一个二q制文档Q但使用 text/plain格式发送回去,览器将在内部打开它而不会提CZ存。因此徏议将q个讄更改?br />application/octet-streamQ这h览器提C用戯行保存?/p>
MIMEMagicFile /usr/local/apache/etc/magic
除了从文件的后缀出发来判断文件的MIMEcd之外QApacheq可以进一步分
析文件的一些特征,来判断文件的真实MIMEcd。这个功能是由mod_mime_magic 模块实现的,它需要一个记录各UMIMEcd特征的文Ӟ以进行分析判断。上面的讄是一个条件语句,如果载入了这个模块,必L定相应的标志文gmagic的位|?/p>
通常q接Ӟ服务器仅仅可以得到客h的IP地址Q如果要惌得客h?br />L名,以进行日志记录和提供l?CGIE序使用Q就需要用这?HostnameLookups 选项Q将其设|ؓOn打开DNS反查功能。但是这服务器对每次客户h都进行DNS查询Q增加了pȝ开销Q得反应变慢,因此~省讄Z用Off关闭此选项。关闭选项之后Q服务器׃会获得客h的主机名Q而只能用IP地址来记录客戗?/p>
ErrorLog /var/log/httpd-error.log
LogLevel warn
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-Agent} "" combined
LogFormat "%h %l %u %t "%r" %>s %b" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
#CustomLog /var/log/httpd-access.log common
#CustomLog /var/log/httpd-referer.log referer
#CustomLog /var/log/httpd-agent.log agent
CustomLog /var/log/httpd-access.log combined
q里定义了系l日志的形式Q对于服务器错误记录Q?由ErrorLog?LogLevel 来定义不同的错误日志文g及其记录内容?br /> 对于pȝ的访问日志,~省使用CustomLog参数定义日志的位|,~省使用 combined 参数指定所有的讉K日志攑֜一个文件中Q然而也可以不同种cȝ讉K日志攑֜不同的日志记录文件中Q这是通过?CustomLog中指定不同的记录cd来完成的。common表示普通的对单面h讉K记录Qreferer表示每个面的引用记录,可以看出一个页面中包含的请求数Qagent表示对客h的类型记录,昄可以现有的combined 定义的设|行注释掉,q用common、referer和agent作ؓCustomLog的参敎ͼ来ؓ不同U类的日志分别指定日志记录文件?br /> 昄QLogFormat是用于定义不同类型的日志q行记录时用的格式Q?q里
使用了以%开头的宏定义,以记录不同的内容?br /> 如果q些参数指定的文件用的是相对\径,那么是相对于ServerRoot?br />路径?/p>
ServerSignature On
一些情况下Q例如当客户h的网ƈ不存在时Q服务器生错误文档,
~省情况下由于打开?ServerSignature选项Q错误文档的最后一行将包含服务器的名字、Apache的版本等信息。有的管理员更們于不对外昄q些信息Q就
可以这个参数设|ؓOffQ或者设|ؓEmailQ最后一行将替换为对 ServerAdmin 的Email提示?/p>
Alias /icons/ "/www/icons/"
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
Alias参数用于URL与服务器文gpȝ中的真实位置q行直接映射Q一般的
文档在DocumentRoot 中进行查询,然而用Alias定义的\径将直接映射到相
应目录下Q而不再到DocumentRoot 下面q行查询。因此Alias可以用来映射一?br />公用文g的\径,例如保存了各U常用图标的icons路径。这样得除了用符可接之外,文档根目录(DocumentRootQ外的目录也可以通过使用了Alias映射Q提供给览器访问?br /> 定义好映的路径之后Q应该需要用Directory语句讄讉K限制?/p>
ScriptAlias /cgi-bin/ "/www/cgi-bin/"
AllowOverride None
Options None
Order allow,deny
Allow from all
ScriptAlias也是用于URL路径的映,但与Alias的不同在于,ScriptAlias 是用于映CGIE序的\径,q个路径下的文g都被定义为CGIE序Q通过执行它们来获得结果,而非由服务器直接q回其内宏V缺省情况下CGIE序使用 cgi-bin目录作ؓ虚拟路径?/p>
# Redirect old-URI new-URL
Redirect参数是用来重写URL的,当浏览器讉K服务器上的一个已l不存在的资源的时候,服务器返回给览器新的URLQ告诉浏览器从该URL 中获取资源。这主要用于原来存在于服务器上的文档Q改变了位置之后Q而又希望能用老URL能访问到Q以保持与以前的URL兼容?/p>
IndexOptions FancyIndexing
AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
AddIconByType (TXT,/icons/text.gif) text/*
AddIconByType (IMG,/icons/image2.gif) image/*
AddIconByType (SND,/icons/sound2.gif) audio/*
AddIconByType (VID,/icons/movie.gif) video/*
AddIcon /icons/binary.gif .bin .exe
AddIcon /icons/binhex.gif .hqx
AddIcon /icons/tar.gif .tar
AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
AddIcon /icons/a.gif .ps .ai .eps
AddIcon /icons/layout.gif .html .shtml .htm .pdf
AddIcon /icons/text.gif .txt
AddIcon /icons/c.gif .c
AddIcon /icons/p.gif .pl .py
AddIcon /icons/f.gif .for
AddIcon /icons/dvi.gif .dvi
AddIcon /icons/uuencoded.gif .uu
AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
AddIcon /icons/tex.gif .tex
AddIcon /icons/bomb.gif core
AddIcon /icons/back.gif ..
AddIcon /icons/hand.right.gif README
AddIcon /icons/folder.gif ^^DIRECTORY^^
AddIcon /icons/blank.gif ^^BLANKICON^^
DefaultIcon /icons/unknown.gif
#AddDescription "GZIP compressed document" .gz
#AddDescription "tar archive" .tar
#AddDescription "GZIP compressed tar archive" .tgz
ReadmeName README
HeaderName HEADER
IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
当一个HTTPh的URLZ个目录的时候,服务器返回这个目录中的烦引文件。但如果一个目录中不存在缺省的索引文gQƈ且该服务器又许可昄目录文g列表的时候,׃昄个目录中的文件列表,Z使得q个文g列表能具有可理解性,而不仅仅是一个简单的列表Q就需要前面的q些讄参数?br /> 如果使用了IndexOptions FancyIndexing选项Q可以让服务器生的目录?br />表中针对各种不同cd的文档引用各U图标。而哪U文件用哪U图标,则?br />下面?AddIconByEncoding、AddIconByType以及AddIcon来定义,分别依据MIME 的编码、类型以及文件的后缀来判断用何U图标。如果不能确定文档用的图标Q就使用 DefaultIcon定义的缺省图标?br /> 同样Q用AddDescription可以Z同类型的文档加入不同的描q。ƈ且,
服务器还在目录下Q查询用ReadmeName和HeaderName定义的文Ӟ自动加上 .
html后缀Q如果没有发玎ͼ再?txt后缀q行搜烦Q,如果发现了这些文Ӟ
在文g列表之前首先昄q些文g的内容,以得普通目录列表具备更大的?br />理解性?br /> IndexIgnore让服务器在列出文件列表时忽略相应的文Ӟ q里使用模式?br />|的方式定义文g名?/p>
AddEncoding x-compress Z
AddEncoding x-gzip gz
AddEncoding用于告诉一些用压~的MIMEcdQ这样可以让览器进行解压羃操作?/p>
AddLanguage en .en
AddLanguage fr .fr
AddLanguage de .de
AddLanguage da .da
AddLanguage el .el
AddLanguage it .it
LanguagePriority en fr de
一个HTML文档可以同时具备多个语言的版本,如对于file1.html文档可以?br />备file1.html.en、file1.html.fr {不同的版本Q每个语a后缀必须使用 AddLanguageq行定义。这h务器可以针对不同国家的客P通过与浏览器q行协商Q发送不同的语言版本。而LanguagePriority 定义不同语言的优先Q以便在览器没有特D要求时Q按照顺序用不同的语言版本回应对file1.html 的请求?br />q个国际化的能力实际的应用ƈ不多?/p>
#AddType application/x-httpd-php .phtml
#AddType application/x-httpd-php-source .phps
AddType参数可以为特定后~的文件指定MIMEcdQ这里的讄覆?mime.types中的讄?/p>
#AddHandler cgi-script .cgi
AddHandler是用于指定非静态的处理cdQ用于定义文档ؓ一个非静态的?br />档类型,需要进行处理,再向览器返回处理结果。例如上面注释中的设|是以.cgil尾的文件设|ؓcgi-scriptcdQ那么服务器启动这?CGIE序以进行处理。如果需要在前面AliasScript定义的\径之外执行CGIE序Q就需要用这个参数进行设|,此后?cgil尾的文件将被当作CGIE序执行?/p>
在配|文件、这个目录中?htaccess以及其上U目录的.htaccess中必d许执行CGIE序Q这需要通过Options ExecCGI参数讑֮?/p>
#AddType text/html .shtml
#AddHandler server-parsed .shtml
另外一U动态进行处理的cd为server-parsedQ由服务器自w预先分析网内的标讎ͼ标记更改ؓ正确的HTML标识。由于server- parsed需要对text/html cd的文档进行处理,因此首先定义了对应的.shtml为text/htmlcd?br /> 然而要支持SSIQ还要首先要在配|文Ӟ?htaccessQ中使用Options Includes允许该目录下的文档可以ؓSSIcdQ或使用Options IncludesNOExec让执行普通的SSI标志Q但不执行其中引用的外部E序?/p>
另一U指定server-parsedcd的方式ؓ使用XBitBack讄选项Q如果将 XBitHack讄为OnQ服务器检查所有text/htmlcd的文档(包括.html后缀的文档)Q如果发现文件属性具备执行位 “x"Q则服务器就认ؓ它是服务器分析文档,需要服务器q行处理。推荐用AddHandlerq行讄Q而将XBitBack 讄为OffQ因Z用XBitBack对所有的HTML文档都执行额外的查,降低了效率?/p>
#AddHandler send-as-is asis
#AddHandler imap-file map
#AddHandler type-map var
上面被注释的AddHandler用于支持Apache服务器的asis、map和var处理能力
?/p>
# Action media/type /cgi-script/location
# Action handler-name /cgi-script/location
因ؓApache内部提供的处理功能有限,因此可以使用Action为服务器定义?br />部程序作为可处理的动态文档类型,q些外部E序与标准CGIE序相同Q都是对输入的数据处理之后,再输Z同MIMEcd的结果。例如要定义一个对Ҏ后缀wri都先执行wri2txtq行处理操作Q再q回l果的操作,可以使用Q?/p>
Action windows-writer /bin/wri2txt
AddHandler windows-writer wri
更进一步,可以直接使用Action定义Ҏ个MIMEcd预先q行处理操作Q这
需要例子中W一U格式的Action 参数讄方式。这栯|方式就不再需要额外的AddHandler用来处理操作与文g后缀联系hQ而是使用Action直接处理MIMEcd的文件。但如果文档后缀没有正式的MIMEcdQ还需要先定义一个MIMEcd?/p>
#MetaDir .web
#MetaSuffix .meta
Meta信息是在文档发送给客户之前Q预先发送给客户览器一些数据,因此
览器可以通过HEADh来访问这些Meta信息而不必真正通过GET来返回全部文档数据。服务器通常发送给览器的是一些标准的HTTP头信息,如果要想增加额外的信息,需要用MetaDir来定义Meta数据存放的目录, 而MetaS uffix用于指定包含Meta数据的文件后~?/p>
#ErrorDocument 500 "The server made a boo boo.
#ErrorDocument 404 /missing.html
#ErrorDocument 404 /cgi-bin/missing_handler.pl
#ErrorDocument 402
http://some.other_server.com/subscription_info.html
如果客户h的网不存在Q或者没有访问权限等情况发生Ӟ服务器将?br />生一个错误代码,同时也将回应客户览器一个标识错误的|页?br />ErrorDocumentq于设|当出现哪个错误时应该回应客h览器那些内容QErrorDocument的第一个参Cؓ错误的序PW二个参Cؓ回应的数据,可以为简单的文本Q本地网,本地CGIE序Q以及远E主Z的网c?/p>
BrowserMatch "Mozilla/2" nokeepalive
BrowserMatch "MSIE 4.0b2;" nokeepalive downgrade-1.0 force-response-1.0
BrowserMatch "RealPlayer 4.0" force-response-1.0
BrowserMatch "Java/1.0" force-response-1.0
BrowserMatch "JDK/1.0" force-response-1.0
BrowserMatch命o为特定的客户E序Q设|特D的参数Q以保证对老版本浏
览器的兼Ҏ,q支持新览器的新特性?/p>
#
# SetHandler server-status
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# SetHandler server-info
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#
# Deny from all
# ErrorDocument 403 http://phf.apache.org/phf_abuse_log.cgi
#
用于讄讉K控制的设|主要是针对目录和文件进行设|的Q然而也可以?br />对不同的URLq行讉K控制的设|,q样׃必担心ScriptAlias、Alias是否\径设|到了受控制的目录之外了。针对URLq行控制的语句ؓ Location语句Q这样不但能Ҏ务器上的文g、CGI提供保护Q此外,它还能保护不能找到对应文Ӟ而是由服务器本n提供的特D功能URL?http://servername/server-status用于报告?..器的状态,http: //servername/server-info用于报告Apache 服务器的l计信息。与此相关的讄q有ExtendedStatus参数Q可以让服务器输出更详细的的报告?/p>
#
#ProxyRequests On
#
#
# Order deny,allow
# Deny from all
# Allow from .your_domain.com
#
#ProxyVia On
#CacheRoot "/www/proxy"
#CacheSize 5
#CacheGcInterval 4
#CacheMaxExpire 24
#CacheLastModifiedFactor 0.1
#CacheDefaultExpire 1
#NoCache a_domain.com another_domain.edu joes.garage_sale.com
#
Apache服务器本w就具备代理的功能,然而这要求加蝲入mod_proxy模块。这能用IfModule语句q行判断Q如果存?mod_proxy模块Q就使用ProxyRequests打开代理支持。此后的Directory用于讄对Proxy功能的访问权限设|,以及用于讄~冲的各个参数设|?/p>
虚拟L
#NameVirtualHost 12.34.56.78:80
#NameVirtualHost 12.34.56.78
#
# ServerAdmin webmaster@host.some_domain.com
# DocumentRoot /www/docs/host.some_domain.com
# ServerName host.some_domain.com
# ErrorLog logs/host.some_domain.com-error_log
# CustomLog logs/host.some_domain.com-access_log common
#
#
~省讄文g中的q些内容是用于设|命名基的虚拟主机服务器时用?br />其中NameVirtualHost 来指定虚拟主Z用的IP地址Q这个IP地址对应多?DNS名字Q如果Apache使用了Listen 参数控制了多个端口,那么可以在q里加上端口号以q一步进行区分对不同端口的不同连接请求。此后,使用 VirtualHost 语句Q用NameVirtualHost指定的IP地址作参敎ͼҎ个名字都定义对应的虚拟主|?br /> 虚拟L是在一台Web服务器上Q可以ؓ多个单独域名提供Web服务Qƈ且每个域名都完全独立Q包括具有完全独立的文档目录l构及设|,q样域名之间完全独立Q不但用每个域名访问到的内容完全独立,q且使用另一个域名无法访
问其他域名提供的|页内容?br /> 虚拟L的概念对于ISP来讲非常有用Q因然一个组l可以将自己的网|在具备其他域名的服务器上的下U往址上,但用独立的域名和根|址更ؓ正式Q易Z人接受。传l上Q必自p立一台服务器才能辑ֈ单独域名的目的,然而这需要维护一个单独的服务器,很多单位缺乏够的l护能力Q更为合适的方式是租用别人维护的服务器。ISP也没有必要ؓ一个机构提供一个单独的服务器,完全可以使用虚拟L能力Q服务器ؓ多个域名提供Web服务Q而且不同的服务互不干扎ͼ对外pCؓ多个不同的服务器?br /> 有两U设定虚拟主机的方式Q一U是ZHTTP 1.0标准Q需要一个具备多IP
地址的服务器Q再配置DNS 服务器,l每个IP地址以不同的域名Q最后才能配|Apache的配|文Ӟ使服务器对不同域名返回不同的Web文档。由于这需要用额外的IP地址Q对每个要提供服务的域名都要使用单独的IP地址Q因此这U方式实现v来问题较多?br /> 可以在一个网l界面上l定多个IP地址QLinux下需要用ifconfig?alias参数来进行这个配|,但此时会影响|络性能?br /> HTTP 1.1标准在协议中规定了对览器和服务器通信Ӟ服务器能够跟t浏
览器h的是哪个L名字。因此可以利用这个新Ҏ,使用更轻杄方式讑֮
虚拟L。这U方式不需要额外的IP地址Q但需要新版本的浏览器支持。这U方
式已l成为徏立虚拟主机的标准方式?br /> 要徏立非IP基础的虚拟主机,多个域名是不可少的配|,因ؓ每个域名对
应一个要服务的虚拟主机。因此需要更改DNS服务器的配置Qؓ服务器增加多个C NAME选项Q如Q?/p>
linux IN A 192.168.1.64
vhost1 IN CNAME linux
vhost2 IN CNAME linux
基本的设|选项都是ZlinuxL讑֮的,如果要ؓvhost1和vhost2讑֮
虚拟LQ就要用VirtualHost语句定义不同的选项Q在语句中可以用配|文件前面中的大部分选项Q而可以重新定义几乎所有的针对服务器的讄?/p>
NameVirtualHost 192.168.1.64
DocumentRoot /www/data
ServerName linux.example.org.cn
DocumentRoot /vhost1
ServerName vhost1.example.org.cn
DocumentRoot /vhost2
ServerName vhost2.example.org.cn
q里需要注意的是,VirtualHost的参数地址一定要和NameVirtualHost定义
的地址怸_必须保证所有的gg_Apache服务器才承认q些定义是ؓq个IP地址定义的虚拟主机?br /> 此外Q定义过NameVirtualHost之后Q那么对q个IP地址的访问都被区分不同的虚拟Lq行处理Q而对其他IP地址的访问,例如127.0.0.1Q才应用前面定义的缺省选项?/p>