Nginx

將 Nginx 自定義標頭或變數傳遞給 SSI

  • April 12, 2022

我正在使用 SSI 建構 Web 應用程序以盡可能減少伺服器使用量(因為它是小型 VPS),我面臨的問題之一是為移動使用者提供不同的內容/樣式我使用自定義detect-mobile.html標題我將其包含在其餘頁面中部分 。但我只能 <!--# if expr="$MOBILEDEVICE = Yess" -->在請求的 html 文件上使用它指令,例如index.html. 我無法在包含的文件上使用它,footer.html或者header.htmlSSI 無法辨識它。這是我在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;

引用自:https://serverfault.com/questions/966600