Назад | Перейти на главную страницу

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

Я создаю веб-приложение с использованием SSI, чтобы максимально сократить использование сервера (так как это небольшой VPS), одна из проблем, с которыми я сталкиваюсь, - это обслуживание различного содержимого / стиля для мобильных пользователей, которые я использую на заказ detect-mobile.html header Я включаю его в остальные части страниц. но я мог использовать только его директиву <!--# 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, я хочу передать некую настраиваемую переменную, например, authorize, в будущем, возможно ли это в 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 [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;