亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 網站 > Apache > 正文

Apache服務器端包含文件入門

2024-08-27 18:22:40
字體:
來源:轉載
供稿:網友
服務器端包含提供了一種對現有HTML文檔增加動態內容的方法。

概要
相關模塊 相關指令 
mod_include
mod_cgi
mod_expires
 Options
XBitHack
AddType
SetOutputFilter
BrowserMatchNoCase
 

本文針對服務器端包含(Server Side Includes),通常簡稱為SSI,討論如何配置服務器以允許SSI,并介紹一些對現有HTML頁面增加動態內容的基本SSI技術。

本文后部將討論用SSI做一些應該算比較高級的事情,比如SSI指令中的條件語句。


什么是SSI?
SSI (Server Side Includes)是HTML頁面中的指令,在頁面被提供時由服務器進行運算,以對現有HTML頁面增加動態生成的內容,而無須通過CGI程序提供其整個頁面,或者使用其他動態技術。

對什么時候用SSI,而什么時候用某些程序生成整個頁面的權衡,取決于頁面中有多少內容是靜態,有多少內容需要在每次頁面被提供時重新計算。SSI是一種增加小段信息的好方法,諸如當前時間。如果你的頁面大部分是在被提供時生成的,那就要另找方案了。


配置服務器以允許SSI
要使服務器允許SSI,必須在httpd.conf文件或.htaccess文件中有如下配置:

Options +Includes 

告訴服務器以允許解析文件中的SSI指令。注意,在多數配置中,多個Options指令會互相覆蓋,所以,可能必須對需要SSI的特定目錄使用Options,以確保位于最后并起作用。

并不是所有文件中的SSI指令都會被解析,所以,必須告訴Apache應該解析哪些文件。有兩種方法,使Apache解析帶有特定文件后綴的任何文件,比如.shtml, 配置如下:

AddType text/html .shtml
AddOutputFilter INCLUDES .shtml 

這種方法的缺點之一是,為了使文件名有.shtml后綴從而執行其中的指令,可能需要改變加入SSI指令的現有的文件,以及所有指向此頁面的連接。

另一種方法是,使用XBitHack指令:

XBitHack on 

XBitHack告訴Apache解析有執行權限的文件中的SSI指令。如此,只要用chmod使文件變成可執行的,就可以對現有的頁面增加SSI指令。

chmod +x pagename.html 

這里簡要說明一點:偶然會有人向你推薦,無須用帶.shtml的文件名,使Apache解析所有.html文件的SSI就可以了。那些人可能沒聽說過XBitHack。要知道,這樣做會使Apache在發送文件到客戶端之前通讀此文件,即使其中并沒有任何SSI指令,從而對速度有不小影響,所以這并不是好辦法。

當然,在Windows上,沒有對應的執行權限可以設置,但還是應該謹慎選擇。

按缺省配置,Apache不會為SSI頁面發送最后修改日期或者內容長度的HTTP頭,因為這些值對動態頁面來說難以計算。這樣會阻止頁面被緩沖,導致客戶端性能有能夠感覺到的下降。有兩種解決方法:

使用XBitHack Full配置。它告訴Apache判斷最后修改日期時,只查看被請求的文件本身的日期,而忽略其中包含的任何文件的修改日期。 
使用mod_expires提供的指令為文件設置一個明確的過期時間,并告訴瀏覽器和代理這個文件可以被緩沖。 

基本SSI指令
SSI指令有如下語法:

<!--#element attribute=value attribute=value ... --> 

其格式很象HTML的注釋,因此如果沒有正確配置SSI,它會被瀏覽器忽略,但在HTML代碼中仍然可見。而如果正確配置了SSI,則此指令會被其結果替代。

其中的元素可以有許多,我們會在下一個版本的文檔中討論其中的大多數,而在這里,僅舉幾個SSI的例子。

今天的日期
<!--#echo var="DATE_LOCAL" --> 

echo元素僅僅是反饋一個變量的值。標準變量有許多,其中包含對CGI程序有效的所有的環境變量。另外,你也可以用set元素定義你的專用變量。

如果你不喜歡日期的這種打印格式,可以用config元素的timefmt屬性,改變其格式。

<!--#config timefmt="%A %B %d, %Y" -->
Today is <!--#echo var="DATE_LOCAL" --> 

文件的修改日期
This document last modified <!--#flastmod file="index.html" --> 

這個元素也是使用timefmt的格式配置。

包含一個CGI程序的輸出
這是SSI的很常見的一個用途-包含一個CGI程序的輸出,比如人人喜歡的``點擊計數器''。

<!--#include virtual="/cgi-bin/counter.pl" --> 


附加的例子
以下是一些對HTML文檔使用SSI的特殊例子。

文檔是什么時候被修改的?
此前,我們提到過可以用SSI通知用戶文檔是什么時候被修改的,但是其具體實施方法卻基本上是個問題。以下代碼,放在HTML文檔中,會在頁面中產生一個時間戳,當然,首先,你必須按上述方法使SSI有效。

<!--#config timefmt="%A %B %d, %Y" -->
This file last modified <!--#flastmod file="ssi.shtml" --> 

不用說,你應該用你實際引用的文件名來替換ssi.shtml,所以,如果你想簡單地在任何文件中粘貼一段通用代碼以達到這個目的,這個方法就并不方便,如此,就會用到LAST_MODIFIED變量:

<!--#config timefmt="%D" -->
This file last modified <!--#echo var="LAST_MODIFIED" --> 

有關timefmt格式的細節,可以到搜索站點查找strftime,其語法是相同的。

包含一個標準注腳
如果你管理一個擁有許多頁面的站點,你會發現對所有頁面做改動是很痛苦的,尤其是在試圖對所有頁面維持某種標準觀感的時候。

使用包含一個頁眉和/或注腳的方法,可以減輕修改的負擔。你只要制作一個注腳文件,并用includeSSI命令包含到每個頁面,即可。include元素能按file屬性或者virtual屬性判斷應該包含的文件。file屬性是一個相對于當前目錄的文件路徑,即不能是一個絕對文件路徑(以/開頭)。virtual屬性可能更有用,它是一個相對于被提供文檔的URL,可以以/開頭,但必須與被提供文檔在同一個服務器。

<!--#include virtual="/footer.html" --> 

SSI指令和注腳文件相結合使用是很有用的,比如在注腳文件中使用LAST_MODIFIED指令。SSI指令可以出現在包含文件中,而include可以嵌套,即一個包含文件可以包含另一個。


其他的設置
config除了能設置時間格式,還有兩種用途。

當SSI指令發生錯誤時,會產生如下消息:

[an error occurred while processing this directive] 

為了改變消息的形式,可以使用config元素的errmsg屬性:

<!--#config errmsg="[It appears that you don't know how to use SSI]" --> 

當然,最終用戶永遠也不會看到這個消息,因為在網站投入運行之前你已經把這些問題都解決了(是嗎?)。

還可以使用config的sizefmt屬性設置返回的文件大小的格式,或者是以字節為單位,或者是以Kb或Mb為單位的簡寫。


執行命令
我期望未來幾個月內能再寫一篇小型CGI程序使用SSI的文章,而這里,僅介紹exec的使用。SSI確實可以利用shell(/bin/sh,精確地說,還可以是Win32中的DOS shell)來執行命令。下例產生一個目錄列表:

<pre>
<!--#exec cmd="ls" -->
</pre> 

在Windows中:

<pre>
<!--#exec cmd="dir" -->
</pre> 

你可能會發現,在Windows中這個指令的結果有些奇怪,dir的輸出中包含有字串``<dir>'',它會使瀏覽器產生混淆。

注意,這個功能是極度危險的,因為它會執行任何包含在exec標記中的命令。如果用戶有可能修改你的網頁內容,比如“留言本”,那么你一定要關閉這個功能。在Options指令中加上IncludesNOEXEC參數,以關閉exec功能,同時又保留SSI。


高級SSI技術
除了分離內容,Apache SSI還可以設置用以比較和條件表達式的變量。

警告
本文中討論的大多數功能僅在Apache 1.2及更新版本中有效。如果你運行的不是Apache 1.2及更新版本,請立刻或者盡快升級,現在就動手,我們會等你弄好了再繼續往下講。

設置變量
使用set指令可以設置變量以備后用,其語法是:

<!--#set var="name" value="Rich" --> 

除了設置文字變量以外,還可以設置其他任何變量,比如環境變量和此前提到過的一些變量(如LAST_MODIFIED),作為你的專用變量。在變量名前面綴以$,表示它是一個變量,而不是一個文字性字串。

<!--#set var="modified" value="$LAST_MODIFIED" --> 

在文字性字串中使用$,必須使用轉義符號

<!--#set var="cost" value="$100" --> 

最后,如果要在較長的字符串中使用變量,可以用花括號把變量名括起來,以免變量名與其他字符之間沖突而產生混淆(要對這種情況舉例說明有點難度,但還是希望你能領會)。 

<!--#set var="date" value="${DATE_LOCAL}_${DATE_GMT}" --> 

條件表達式
有了變量,就可以設置和比較它們的值以表示條件,SSI也因此成為一種簡潔的編程語言。mod_include提供了if, elif, else和endif等結構以構造條件語句,從而對一個實在的頁面高效地生成多個邏輯的頁面。

條件的結構如下:

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif --> 

test_condition可以是任何邏輯比較 - 可以是一個值和另一個值比較,也可以是測試一個特定的值是否為“真”(一個給定的字串如果非空則為真)。完整的比較操作符列表,見mod_include。以下是可能會用到的一些例子。

在配置文件中,可以這樣設置:

BrowserMatchNoCase macintosh Mac
BrowserMatchNoCase MSIE InternetExplorer 

如果客戶端在Macintosh上運行Internet Explorer,則上例設置環境變量``Mac'' 和``InternetExplorer''為真。

然后,在允許SSI的文檔中,可以這樣設置:

<!--#if expr="${Mac} && ${InternetExplorer}" -->
Apologetic text goes here
<!--#else -->
Cool javascript code goes here
<!--#endif --> 

我一點也不反對在Mac上運行IE - 只是上個星期我花了好幾個小時試圖在Mac上的IE中使用javascript,而它在其他地方都能正常運作,以上只是一個臨時的妥協方案。

任何其他變量(或者是你定義的,或者是標準的環境變量)都可以用于條件語句。利用Apache的SetEnvIf以及其他相關指令設置環境變量,此功能可以很好地實現動態頁面而無須借助于CGI。


總結
SSI固然不能替代CGI或者其他動態頁面技術,但它是在頁面中插入眾多小型的動態片段的優秀方法,而無須大量額外的操作。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人aa精品一区在线播放| 国产精品第1页| 欧美孕妇毛茸茸xxxx| 精品免费在线视频| 亚洲成人av片| 精品久久久999| 精品久久久香蕉免费精品视频| 久久久亚洲精品视频| 欧美大尺度电影在线观看| 一区二区欧美在线| 国产精品福利网| 国产精品视频最多的网站| 色综合久久中文字幕综合网小说| 国产69精品久久久久9| 欧美成人激情视频免费观看| 日韩一区二区三区在线播放| 欧美精品一本久久男人的天堂| 久久好看免费视频| 久久天天躁狠狠躁夜夜av| 在线中文字幕日韩| 久久久噜噜噜久久中文字免| 久久国产精品久久久久久| 国产精品爱啪在线线免费观看| 国产成人aa精品一区在线播放| 午夜免费在线观看精品视频| 国产精品久久精品| 疯狂做受xxxx高潮欧美日本| 国产精品高清免费在线观看| 91香蕉国产在线观看| 精品久久久久久久久国产字幕| 亚洲精品狠狠操| 欧美午夜精品久久久久久久| 操人视频在线观看欧美| 激情久久av一区av二区av三区| 国产精品扒开腿做爽爽爽的视频| 日本午夜精品理论片a级appf发布| 红桃视频成人在线观看| 亚洲欧美中文另类| 亚洲欧美成人一区二区在线电影| 亚洲色图色老头| 性色av一区二区三区红粉影视| 性欧美亚洲xxxx乳在线观看| 国产精品a久久久久久| 国产精品黄色影片导航在线观看| 国产精品视频不卡| 亚洲欧美中文字幕| 日韩亚洲国产中文字幕| 色综合天天综合网国产成人网| 亚洲乱码国产乱码精品精天堂| 亚洲精品网站在线播放gif| 久久男人资源视频| 国产视频精品va久久久久久| 国产aⅴ夜夜欢一区二区三区| xxxxx91麻豆| 欧美性xxxx极品hd满灌| 国产精品wwwwww| 欧美激情综合色综合啪啪五月| 亚洲a∨日韩av高清在线观看| 久久视频在线看| 久久久这里只有精品视频| 国产精品99蜜臀久久不卡二区| 国产精品一久久香蕉国产线看观看| 亚洲精品一区二三区不卡| 国产免费观看久久黄| 亚洲天堂av女优| 久久久久99精品久久久久| 宅男66日本亚洲欧美视频| 亚洲级视频在线观看免费1级| 亚洲精品久久久久久久久久久久久| 国产精品第3页| 欧美精品精品精品精品免费| 日韩在线免费视频| 日韩成人在线免费观看| 国产精品成久久久久三级| 日韩男女性生活视频| 亚洲精品91美女久久久久久久| 韩国精品美女www爽爽爽视频| 91亚洲精品一区二区| 日韩av高清不卡| 在线视频欧美性高潮| 国外成人免费在线播放| 精品国产美女在线| 美女国内精品自产拍在线播放| 亚洲国产精品久久久久秋霞蜜臀| 亚洲成人av在线播放| 欧美网站在线观看| 欧美中文字幕在线| 欧美成人免费一级人片100| 欧美国产日韩xxxxx| 乱亲女秽乱长久久久| 国产大片精品免费永久看nba| 91麻豆国产语对白在线观看| 不卡av电影在线观看| 亚洲精品永久免费精品| 久色乳综合思思在线视频| 亚洲a一级视频| 欧美性猛交99久久久久99按摩| 91av网站在线播放| 亚洲bt欧美bt日本bt| 国产成人亚洲综合91| 午夜精品久久久99热福利| 国产精品永久免费在线| 亚洲tv在线观看| 97久久精品国产| 在线亚洲男人天堂| 成人国产亚洲精品a区天堂华泰| 97人人爽人人喊人人模波多| 久久天天躁狠狠躁夜夜躁| 亚洲大胆人体在线| 国产一区二区三区三区在线观看| 欧美成人免费一级人片100| 国产精品成人免费电影| 热99精品只有里视频精品| 日韩小视频网址| 亚洲xxx自由成熟| 欧美激情视频一区二区三区不卡| 欧美区二区三区| 亚洲国产精品热久久| 亚洲激情电影中文字幕| 久久久精品一区二区| 欧美xxxx18国产| 亚洲精品狠狠操| 久久国内精品一国内精品| 欧美日韩国产中文字幕| 欧美日本亚洲视频| 亚洲国产日韩一区| 欧美又大粗又爽又黄大片视频| xvideos亚洲人网站| 亚洲精品国产精品国产自| 亚洲高清免费观看高清完整版| 亚洲国产精品久久精品怡红院| 欧美精品成人91久久久久久久| 欧美天堂在线观看| 久久久国产一区二区三区| 亚洲欧美日韩中文在线制服| 狠狠做深爱婷婷久久综合一区| 亚洲国产精品人人爽夜夜爽| 91精品国产高清自在线| 精品动漫一区二区| 色婷婷av一区二区三区久久| 亚洲美女性生活视频| 久久人人爽人人爽人人片亚洲| 国产精品免费视频xxxx| 国产亚洲日本欧美韩国| 成人免费自拍视频| 久久久久久九九九| 中文国产亚洲喷潮| 亚洲美女在线看| 国产99久久精品一区二区 夜夜躁日日躁| 日韩国产精品亚洲а∨天堂免| 欧美xxxx14xxxxx性爽| 国产精品爽爽ⅴa在线观看| 久久精品国产亚洲一区二区| 亚洲娇小xxxx欧美娇小| 国产日韩在线播放| 久久久久久久一| 国产精品偷伦视频免费观看国产| 亚洲综合社区网| 91精品91久久久久久| 亚洲网在线观看| 欧美极品欧美精品欧美视频| 欧日韩不卡在线视频| 另类色图亚洲色图| 日韩欧美国产中文字幕|