nginx中SSI问题的研究
最近感覺挺爽的,這個(gè)項(xiàng)目團(tuán)隊(duì)沒有一個(gè)專門做PHP的,我是第一個(gè)進(jìn)來做PHP(當(dāng)然還有前端)的,哈哈,我會(huì)設(shè)計(jì)修改出適合我們業(yè)務(wù)的PHP框架,哈哈,感覺會(huì)學(xué)到很多東西的樣子,前幾天在組內(nèi)20幾個(gè)前輩面前講php框架,以及跟大牛們探討適合我們的php框架,感覺表達(dá)能力太差了,知道的東西表達(dá)不清楚,還要我的導(dǎo)師去幫我表達(dá),這里感謝下我的導(dǎo)師于洪磊(簡稱磊哥),磊哥簡直就是我的偶像,我沒見過那么有深度的程序員,技術(shù)牛B這是肯定的了,對(duì)技術(shù)外的了解超出了我的想象,磊哥看的書很多,涉獵很廣泛,尤其在歷史和文學(xué)方面,聊起天來有理有條、幽默風(fēng)趣、時(shí)不時(shí)的引用幾句誰誰誰的文章,啊!真感覺不出來是一個(gè)技術(shù)大牛,更像是羅永浩那樣的人,哈哈,在最近2年磊哥就是我的目標(biāo),多看書、多講話,提高自己的表達(dá)能力,要不然自己知道的東西不能通過最直接的表達(dá)分享出去,這就很郁悶了。
瞎扯了這么多,進(jìn)入正題吧,今天要說的是一個(gè)關(guān)于SSI的問題,這里先介紹下SSI
SSI是Server Side Inclde的縮寫,就是服務(wù)端包含的意思,我今天要說的只是用到了nginx中SSI模塊的include命令,這個(gè)命令會(huì)包含一個(gè)頁面,然后在nginx服務(wù)器中展開。
我遇到的是什么問題呢?現(xiàn)在有個(gè)富文本編輯編輯器,要求保存頁面篇,輸入一些html(包括SSI include命令),然后保存在數(shù)據(jù)庫,保存之后還要求可以編輯,要求富文本編輯器中的內(nèi)容就像這樣內(nèi)容就像下面這樣:
| 1 2 3 4 5 6 7 8 | <html> <head> </head> <body> ????<!--#include virtual="/sinclude/test.shtml"--> ????<div>Hello World!!!</div> </body> </html> |
問題就處在了這里,這里面包含了ssi命令。
這個(gè)如果直接訪問的只顯示Hello World!!!,我們對(duì)nginx做如下配置:
| 1 2 | ssi on; ssi_types text/html; |
這個(gè)時(shí)候如果有mime type為text/shtml類型的數(shù)據(jù)通過nginx的時(shí)候,nginx就回去解析這些命令,這導(dǎo)致了個(gè)問題,我在數(shù)據(jù)庫中查出數(shù)據(jù)然后返回給客戶端富文本編輯器就會(huì)出錯(cuò),我的echo內(nèi)容如下所示:
| 1 2 3 | <!--#?include?virtual="/sinclude/test.shtml"?--> <!--#?include?virtual="/sinclude/test1.shtml"?--> <!--#?include?virtual="/sinclude/test2.shtml"?--> |
頁面會(huì)顯示這種形式:
這我就有點(diǎn)郁悶了,因?yàn)榉?wù)器上其他功能必須用到ssi,而我這里又不需要,這個(gè)該怎么辦呢?
這個(gè)時(shí)候我想到了ssi_types,這里面設(shè)置的是text/html,而常用的還有一種text/plain,這種類型的mime是什么呢,在瀏覽器中他會(huì)把所有的內(nèi)容原封不動(dòng)的顯示出來,不去進(jìn)行解析html、css。用了這種類型,nginx就不會(huì)進(jìn)行展開了,試試在輸出之前修改mime:
| 1 | header('Content-type: text/plain'); |
果然,在修改了mime之后,輸出和數(shù)據(jù)庫中的一致,原封不動(dòng):
看樣子問題解決了,但是沒想到由于歷史原因,后臺(tái)的編輯框內(nèi)內(nèi)容和其他內(nèi)容是一起返回的,這下囧了,如果設(shè)置為text/plain所有的內(nèi)容都已文本形式顯示在瀏覽器,問題等于還是沒有解決~~
這個(gè)時(shí)候想到nginx配置,由于需要nginx進(jìn)行解析展開的文件一般為shtml、html等后綴,而查數(shù)據(jù)庫一般為php所以我可以將ssi的所用于縮小為后綴名為shtml、html的文件,看看配置,這里我講ssi配置信息移動(dòng)到一個(gè)匹配中,再看看效果,
| 1 2 3 4 5 | location ~* \.(html|shtml|htm)$ { ????ssi on; ????ssi_types text/shtml; ????proxy_pass http://www.testssi.com; } |
新建html、php文件,內(nèi)容類似,
| 1 2 3 4 5 | <?php echo?'<!--# include virtual="/sinclude/test.shtml" -->'; echo?'<!--# include virtual="/sinclude/test1.shtml" -->'; echo?'<!--# include virtual="/sinclude/test2.shtml" -->'; echo?'TEst!!'; |
html:
| 1 2 3 4 | <!--# include virtual="/sinclude/test.shtml" --> <!--# include virtual="/sinclude/test1.shtml" --> <!--# include virtual="/sinclude/test2.shtml" --> TEst!! |
會(huì)發(fā)現(xiàn)php訪問只輸出了Test!!,其他內(nèi)容要查看源碼才可以看見,html中則會(huì)進(jìn)行解析,輸出對(duì)應(yīng)包含文件的內(nèi)容或者沒找到報(bào)錯(cuò)!!至此問題基本解決了,具體情況下周上班之后試下這個(gè)方法,應(yīng)該沒問題,測試的時(shí)候都是ok的。
今天在實(shí)際代碼中沒有用這些,使用了一個(gè)簡單的函數(shù),哈哈,將大小于號(hào)轉(zhuǎn)化為html編碼,nginx解析ssi的時(shí)候不認(rèn)識(shí),但是瀏覽器還是認(rèn)識(shí)的,ok,問題解決,沒有修改nginx哦配置
| 1 2 3 | function?escape_ssi($str){ ????return?preg_replace(array('/</',?'/>/'),?array('<',?'>'),?$str); } |
來源:http://www.cnblogs.com/iforever/p/4417428.html
總結(jié)
以上是生活随笔為你收集整理的nginx中SSI问题的研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 四皇(说一说四皇的简介)
- 下一篇: 京东三级列表页持续架构优化—Golang