Передача пользовательского заголовка или переменных Nginx в SSI

Я создаю веб-приложение с использованием SSI, чтобы максимально снизить нагрузку на сервер (так как это небольшой 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" -->

Помимо разрешенных переменных SSI [ 1], таких как HTTP_USER_AGENT, я хочу передать в будущем своего рода переменную типа авторизации, может ли это быть возможно в SSI . Так как директива о стране вспышки облаков работает! как они это делают!

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

Поскольку я дошел до единственно возможного для меня сейчас пути, html-файл SSI мог читать переменные через пользовательский QUERY_STRING например, перенаправить rewrite ^ http://example.com$uri?m=1 permanent;

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 [1] Редактировать: мне даже не нужно было устанавливать значение заголовка, SSI может напрямую читать специальную переменную nginx.

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

Распечатать Noo на рабочем столе и Yess на мобильном телефоне

Похоже, вы устанавливаете заголовок, передаваемый прокси, как "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;
Другие вопросы по тегам