Передача пользовательского заголовка или переменных 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;