將 Nginx 自定義標頭或變數傳遞給 SSI
我正在使用 SSI 建構 Web 應用程序以盡可能減少伺服器使用量(因為它是小型 VPS),我面臨的問題之一是為移動使用者提供不同的內容/樣式我使用自定義
detect-mobile.html
標題我將其包含在其餘頁面中部分 。但我只能<!--# if expr="$MOBILEDEVICE = Yess" -->
在請求的 html 文件上使用它指令,例如index.html
. 我無法在包含的文件上使用它,footer.html
或者header.html
SSI 無法辨識它。這是我在detect-mobile.html
.<!--#if expr="$HTTP_USER_AGENT=/iPhone/" --> <!--#set var="MOBILEDEVICE" value="Yess" --> <!--#elif expr="$HTTP_USER_AGENT=/Android/" --> <!--#set var="MOBILEDEVICE" value="Yess" --> <!--#elif expr="$HTTP_USER_AGENT=/iPod/" --> <!--#set var="MOBILEDEVICE" value="Yess" --> <!--#else --> <!--#set var="MOBILEDEVICE" value="Noo" --> <!--#endif -->
我試圖從 nginx 添加我自己的自定義標頭
set $ismobile Noo; if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") { set $ismobile Yess ; } proxy_set_header HTTP_CF_ISMOBILE $ismobile; # add_header 'HTTP_ISMOBILE' $ismobile;
但 SSI 無法讀取
<!--#echo var = "HTTP_ISMOBILE" -->
除了像 HTTP_USER_AGENT 這樣允許的 SSI 變數 [ 1 ] 之外,我還想在未來傳遞一些自定義變數,比如授權,這在 SSI 中是否可行。因為雲耀斑國家指令有效!他們是怎麼做到的!
<!--#echo var = "HTTP_CF_IPCOUNTRY" -->
到目前為止,我現在達到了唯一可能的方式,SSI html 文件可以通過自定義
QUERY_STRING
重定向讀取變數,例如rewrite ^ http://example.com$uri?m=1 permanent;
好的,經過長時間的搜尋,我發現 Nginx 在代理到其他伺服器時不接受下劃線標頭(因為我使用的是 cloudflare 代理伺服器)所以我將標頭更改為如下所示
add_header 'ISMOBILE' $ismobile ;
當我在 SSI 文件上回顯它時,我得到了正確的值,這對我來說太棒了
<!--#echo var = "ISMOBILE" -->
這是我用來檢測僅使用 HTML SSI 和 nginx 伺服器的移動設備的完整程式碼(沒有 php Javascript 等)
set $itismobile Noo; if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od|ad)|iris|kindle|lge |maemo|midp|mmp|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") { set $itismobile Yess ; }
移動UA程式碼參考
編輯:我什至根本不需要設置標頭值,SSI 可以直接讀取 nginx 特殊變數。
<!--#echo var = "itismobile" -->
Noo
在桌面和Yess
移動設備上列印
看起來您將傳遞給代理的標頭設置為“HTTP_CF_ISMOBILE”。由於在 SSI 中使用“HTTP_”前綴訪問 HTTP 標頭,因此您可能需要將其作為變數“HTTP_HTTP_CF_ISMOBILE”進行訪問。
proxy_set_header HTTP_CF_ISMOBILE $ismobile;
或者,您可以在 nginx 中提供不帶 HTTP 前綴的變數
proxy_set_header CF_ISMOBILE $ismobile;