Apache的服务端包含--SSI
SSI定義:
SSI(服務(wù)器端包含)提供了一種對現(xiàn)有HTML文檔增加動(dòng)態(tài)內(nèi)容的方法。
作用:
一般出于效率的考慮,網(wǎng)站都會(huì)把內(nèi)容盡可能的靜態(tài)化成HTML文件,但是網(wǎng)站頁面的布局往往比較復(fù)雜,各個(gè)部分的更新頻率并不一致,比如說:一個(gè)顯示“文章內(nèi)容”的頁面,很可能在旁邊會(huì)有一個(gè)“每天最熱文章TOP10”之類的列表,這個(gè)列表的內(nèi)容是要每天更新的,而文章內(nèi)容本身一般不會(huì)那么頻繁的更新,對于這樣的問題可以用Apache的SSI來解決,從感覺上講,其作用和PHP中的inlucde文件類似。
配置:
配置SSI很簡單,既可以把配置代碼寫在httpd.conf里,也可以寫在.htaccess文件里,這里以httpd.conf文件為例來說明,打開你的httpd.conf文件,在相應(yīng)的<Directory "......">里只要鍵入下面代碼就可以激活SSI:
Options Includes
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
這樣,你所有擴(kuò)展名為shtml的文件都具有了SSI的能力,這里需要注意的是,如果我們不需要在shtml文件里執(zhí)行exec指令,那么就應(yīng)該盡可能的禁止它,以便獲得最大的安全性,所以推薦的配置代碼變成:
Options IncludesNOEXEC
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml
注意:以上配置代碼以Apache2.0.X版本為準(zhǔn),如果你的版本屬于Apache1.3.X系列,則其中的“AddOutputFilter INCLUDES .shtml”應(yīng)該換成“AddHandler server-parsed .shtm”。
另外還有一種XBitHack的配置方法,但是并不推薦,想了解的可以看手冊。
應(yīng)用:
下面看看具體頁面應(yīng)該如何編寫,還是以開頭說的情況為例,我們假設(shè)“每天最熱文章TOP10”的代碼每天都會(huì)由Crontab程序自動(dòng)靜態(tài)化成top10.html文件,那么在我們的文章顯示頁面的里,可以使用如下的代碼來引用top10.html頁面:
1. <!--#include file="top10.html"-->
2. <!--#include virtual="top10.html"-->
file和virtual的區(qū)別在于:file屬性是一個(gè)相對于當(dāng)前目錄的文件路徑,即不能是一個(gè)絕對路徑以“/”開頭或包含“../”的路徑。virtual屬性可能更有用,它是一個(gè)相對于被提供的文檔的URL ,可以以“/”開頭,但必須與被提供的文檔位于同一服務(wù)器上。
當(dāng)然,SSI的能力遠(yuǎn)不止于此,手冊上對相關(guān)的指令有詳細(xì)的介紹,這里只是介紹了SSI最常用的功能而已。
實(shí)戰(zhàn):
某公司有一個(gè)CMS(文章管理系統(tǒng)),首頁,列表頁,顯示頁都已經(jīng)靜態(tài)化,相應(yīng)的頭尾部分使用SSI搞定,大致如下:
<!--#include virtual="head.shtml"-->
<!--#include virtual="foot.shtml"-->
此時(shí),業(yè)務(wù)部門和一些公司達(dá)成了許多合作意向,其中一條是我們的網(wǎng)站的每個(gè)頁面都要加上對方網(wǎng)站的頭和尾,粗看起來問題比較棘手,因?yàn)槲覀兊木W(wǎng)站都已經(jīng)靜態(tài)化了,難道我們要為每個(gè)合作公司再拷貝一份網(wǎng)站不成,那當(dāng)然是不現(xiàn)實(shí)的,別忘了,我們網(wǎng)站原來的頭尾都已經(jīng)使用SSI分離出來了,而且使用的還是shtml格式的頭尾,這就是說明我們還可以在頭尾文件里包含合作公司的頭尾來完成需求,等等,似乎還有疑問,合作公司那么多,我們怎么區(qū)分呢?很簡單,為每個(gè)公司指定的一個(gè)子域名,如:A公司的合作頁面域名為“a.domain.com”,類推,然后在已經(jīng)有的SSI文件(head.shtml和foot.shtml)里的適當(dāng)位置加入下面代碼:
<!--#include virtual="${SERVER_NAME}.head.shtml"-->
<!--#include virtual="${SERVER_NAME}.foot.shtml"-->
其中“SERVER_NAME”是環(huán)境變量,說白了,就是你為公司指定的那個(gè)子域名。如果對應(yīng)公司的頭尾文件都準(zhǔn)備好了,那就瀏覽吧,應(yīng)該可以自動(dòng)根據(jù)域名來動(dòng)態(tài)加載相應(yīng)的頭尾文件了吧,^_^,搞定!
------------------------------------------------------------------
補(bǔ)充:今天一臺(tái)服務(wù)器的httpd進(jìn)程超多,感覺負(fù)載過大,所以決定干掉apache,網(wǎng)站遷移到lighttpd上,本來一切順利,但是安裝好后,瀏覽的時(shí)候發(fā)現(xiàn)頁面的SSI沒有正常加載,里面的代碼和上面說的差不多,如下:
<!--#include virtual="${SERVER_NAME}.head.shtml"-->
<!--#include virtual="${SERVER_NAME}.foot.shtml"-->
查了很多,才搞清楚原來apache和lighttpd對SERVER_NAME的解釋不同,換成HTTP_HOST就好了,所以以后寫SSI的時(shí)候,還是應(yīng)該在可移植性上考慮多點(diǎn)。最終代碼如下:
<!--#include virtual="${HTTP_HOST}.head.shtml"-->
<!--#include virtual="${HTTP_HOST}.foot.shtml"-->
總結(jié)
以上是生活随笔為你收集整理的Apache的服务端包含--SSI的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我有轩辕,逍遥和寒冰,还有炽寒天凤,怎么
- 下一篇: 反向ajax实现