首頁 >後端開發 >php教程 >nginxSSI問題的研究

nginxSSI問題的研究

WBOY
WBOY原創
2016-08-08 09:26:111214瀏覽

  最近感覺挺爽的,這個專案團隊沒有一個專門做PHP的,我是第一個進來做PHP(當然還有前端)的,哈哈,我會設計修改出適合我們業務的PHP框架,哈哈,感覺會學到很多東西的樣子,前幾天在組內20幾個前輩面前講php框架,以及跟大牛們探討適合我們的php框架,感覺表達能力太差了,知道的東西表達不清楚,還要我的導師去幫我表達,這裡感謝下我的導師於洪磊(簡稱磊哥),磊哥簡直就是我的偶像,我沒見過那麼有深度的程序員,技術牛B這是肯定的了,對科技外的了解超出了我的想像,磊哥看的書很多,涉獵很廣泛,尤其在歷史和文學方面,聊起天來有理有條、幽默風趣、時不時的引用幾句誰誰誰誰誰的文章,啊!真感覺不出來是一個技術大牛,更像是羅永浩那樣的人,哈哈,在最近2年磊哥就是我的目標,多看書、多講話,提高自己的表達能力,要不然自己知道的東西不能透過最直接的表達分享出去,這就很鬱悶了。

  瞎扯了這麼多,進入正題吧,今天要說的是一個關於SSI的問題,這裡先介紹下SSI

  SSI是Server Side Inclde的縮寫,就是服務端包含的意思,我今天要說的只是用到了nginx中SSI模組的include指令,這個指令會包含一個頁面,然後在nginx伺服器中展開。

  我遇到的是什麼問題呢?現在有個富文本編輯編輯器,要求保存頁篇,輸入一些html(包括SSI include命令),然後保存在資料庫,保存之後還要求可以編輯,要求富文本編輯器中的內容就像這樣內容就像下面這樣:

<html>
<head>
</head>
<body>
	<!--#include virtual="/sinclude/test.shtml"-->
	<div>Hello World!!!</div>
</body>
</html>

  問題就處在了這裡,這裡麵包含了ssi指令。

  這個如果直接訪問的只顯示Hello World! ! ! ,我們對nginx做如下配置:

ssi on;
ssi_types text/html;

  這個時候如果有mime type為text/shtml類型的資料通過nginx的時候,nginx就回去解析這些指令,這導致了個問題,我在資料庫中查出資料然後回傳給客戶端富文本編輯器就會出錯,我的echo內容如下:

<!--# include virtual="/sinclude/test.shtml" -->
<!--# include virtual="/sinclude/test1.shtml" -->
<!--# include virtual="/sinclude/test2.shtml" -->

  頁面會顯示這種形式:

  這我就有點鬱悶了,因為伺服器上其他功能必須用到ssi,而我這裡又不需要,這個該怎麼辦呢?

  這時候我想到了ssi_types,這裡面設定的是text/html,而常用的還有一種text/plain,這種類型的mime是什麼呢,在瀏覽器中他會把所有的內容原封不動的顯示出來,不去進行解析html、css。用了這種類型,nginx就不會進行展開了,試試看在輸出之前修改mime:

header('Content-type: text/plain');

  果然,在修改了mime之後,輸出和資料庫中的一致,原封不動:

  看起來問題解決了,但是沒想到由於歷史原因,後台的編輯框內內容和其他內容是一起返回的,這下囧了,如果設置為text/plain所有的內容都已文本形式顯示在瀏覽器,問題等於還是沒有解決~~

  這個時候想到nginx配置,由於需要nginx進行解析展開的文件一般為shtml、html等後綴,而查數據庫一般為php所以我可以將ssi的所用於縮小為後綴名為shtml、html的文件,看看配置,這裡我講ssi配置資訊移動到一個匹配中,再看看效果,

        location ~* \.(html|shtml|htm)$ {
            ssi on;
            ssi_types text/shtml;
            proxy_pass http://www.testssi.com;
        }

  新建html、php文件,內容類似,

<?php
echo '<!--# include virtual="/sinclude/test.shtml" -->';
echo '<!--# include virtual="/sinclude/test1.shtml" -->';
echo '<!--# include virtual="/sinclude/test2.shtml" -->';
echo 'TEst!!';

  html:

<!--# include virtual="/sinclude/test.shtml" -->
<!--# include virtual="/sinclude/test1.shtml" -->
<!--# include virtual="/sinclude/test2.shtml" -->
TEst!!

  會發現php存取只輸出了Test!!,其他內容要查看原始碼才可以看見,html中則會進行解析,輸出對應包含檔案的內容或沒找到報錯! !至此問題基本上解決了,具體情況下週上班之後試下這個方法,應該沒問題,測試的時候都是ok的。

  本文版權歸作者iforever(luluyrt@163.com)所有,未經作者本人同意禁止任何形式的轉載,轉載文章之後必須在文章頁面明顯位置給出作者和原文連接。

以上就介紹了nginx中SSI問題的研究,包括了方面的內容,希望對PHP教程有興趣的朋友有幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn