将 Nginx 自定义标头或变量传递给 SSI

将 Nginx 自定义标头或变量传递给 SSI

我正在使用 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" -->

除了允许的 SSI 变量 [1] 比如 HTTP_USER_AGENT,我希望将来能传递一些自定义变量,比如授权,这在 SSI 中可行吗?因为 cloud flare 国家指令是有效的!他们是怎么做到的!

<!--#echo var = "HTTP_CF_IPCOUNTRY" -->

就我目前所知,唯一可行的方法是,SSI html 文件可以通过自定义QUERY_STRING重定向读取变量,例如 rewrite ^ http://example.com$uri?m=1 permanent;

答案1

看起来您正在将传递给代理的标头设置为“HTTP_CF_ISMOBILE”。由于 HTTP 标头在 SSI 中使用“HTTP_”前缀访问,因此您可能需要将其作为变量“HTTP_HTTP_CF_ISMOBILE”访问。

proxy_set_header HTTP_CF_ISMOBILE $ismobile;

或者,你可以在 nginx 中提供一个不带 HTTP 前缀的变量

proxy_set_header CF_ISMOBILE $ismobile;

答案2

经过长时间的搜索,我发现 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移动设备上打印

相关内容