Я создаю веб-приложение с использованием 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;