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