Часто для мобильной версии делают отдельный шаблон и не используют при этом для мобильной версии отдельный поддомен. В результате получается, что по оному урлу могут отдаваться разные страницы, что делает невозможным включить композит на сайте.
Но всё же при определенных действиях, можно сделать корректным работу композита в таких случаях. Это потребует доработки, как со стороны сайта, так и со стороны nginx.
Суть решения - для мобильной версии всегда подставлять в request_urI определенный параметр, и устанавливать куку. Кука нужна, чтобы на стороне nginx можно было определить какую именно страницу отображать из кеша.
А теперь подробнее:
1) В htaccess добавляем php_value auto_prepend_file с пум на файл с таким содержимым:
Тут вызов страницы с параметром set_mobile=Y устанавливает куку mobile=Y и редиректит на ту же станицу, но без параметра set_mobile=Y. Аналогично set_mobile=N устанавливает куку mobile=N.
Если в момент загрузки страницы куки mobile не существует, то на основе user-agent определяем десктоп или мобильную версию.
Далее, основываясь на куке mobile, при необходимости, в request_uri добавляем параметр mobile=Y.
2) В настройках композита необходимо добавить параметр set_mobile в "Параметры URL, при которых не будет работать композитный режим".
Теперь при включении композита для основной и мобильной версии будет создаваться разный кеш.
Осталось настроить nginx. Для этого надо создать два файла конфигурации:
1) Для определения на основе user_agent и куки какую версию кеа отдавать. Если куки нету, то смотрим по user_agent, если кука есть, то смотрим на содержимое куки.
/etc/nginx/bx/maps/composite_ex.conf
2) Чуть измененный конфиг, стандартного комозита.
/etc/nginx/bx/conf/composite_ex.conf
3) И дальше подключаем наши конфиги в файле виртуального хоста:
/etc/nginx/bx/site_avaliable/bx_domain.ru.conf
Перезагружаем nginx и проверяем работу композита.
Недостатки:
При добавлении параметра в request_uri он может потом вылезти в ссылках в компонентах, по этому придется вносить коррекции в шаблоны компонентов, где такое произошло. Либо на обработчике события OnBeforeEndBufferContent убрать лишние параметры mobile=Y.
Но всё же при определенных действиях, можно сделать корректным работу композита в таких случаях. Это потребует доработки, как со стороны сайта, так и со стороны nginx.
Суть решения - для мобильной версии всегда подставлять в request_urI определенный параметр, и устанавливать куку. Кука нужна, чтобы на стороне nginx можно было определить какую именно страницу отображать из кеша.
А теперь подробнее:
1) В htaccess добавляем php_value auto_prepend_file с пум на файл с таким содержимым:
if(isset($_GET['set_mobile'])) { if($_GET['set_mobile'] == 'Y') { setcookie('mobile', 'Y', time() + 7 * 24 * 60 * 60, '/', 'domain.ru'); } else { setcookie('mobile', 'N', time() + 7 * 24 * 60 * 60, '/', 'domain.ru'); } $uri = parse_url($_SERVER['REQUEST_URI']); parse_str($uri['query'], $params); unset($params['set_mobile']); $uri['query'] = http_build_query($params); header("Location: " . "https://" . $_SERVER['HTTP_HOST'] . $uri['path'].($uri['query'] ? '?'.$uri['query'] : '') ); die(); } $mobile = false; if(!$_COOKIE['mobile']) { if (preg_match('/(android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos)/i', $_SERVER['HTTP_USER_AGENT'])) { setcookie('mobile', 'Y', time() + 7 * 24 * 60 * 60, '/', 'domain.ru'); $mobile = true; } else { setcookie('mobile', 'N', time() + 7 * 24 * 60 * 60, '/', 'domain.ru'); $mobile = false; } } else { $mobile = $_COOKIE['mobile'] == 'Y' ? true : false; } if($mobile) { $uri = parse_url($_SERVER['REQUEST_URI']); $_SERVER['REQUEST_URI'] = $uri['path'].'?mobile=Y'.(isset($uri['query']) ? '&'.$uri['query'] : ''); } |
Если в момент загрузки страницы куки mobile не существует, то на основе user-agent определяем десктоп или мобильную версию.
Далее, основываясь на куке mobile, при необходимости, в request_uri добавляем параметр mobile=Y.
2) В настройках композита необходимо добавить параметр set_mobile в "Параметры URL, при которых не будет работать композитный режим".
Теперь при включении композита для основной и мобильной версии будет создаваться разный кеш.
Осталось настроить nginx. Для этого надо создать два файла конфигурации:
1) Для определения на основе user_agent и куки какую версию кеа отдавать. Если куки нету, то смотрим по user_agent, если кука есть, то смотрим на содержимое куки.
/etc/nginx/bx/maps/composite_ex.conf
map $http_user_agent $is_mobile { default "N"; ~*android|avantgo|blackberry|bolt|boost|cricket|docomo|fone|hiptop|mini|mobi|palm|phone|pie|tablet|up\.browser|up\.link|webos|wos "Y"; } map "$cookie_mobile:$is_mobile:$is_args" $mobile { default ""; ":Y:?" "mobile=Y&"; ":Y:" "mobile=Y"; "Y:Y:?" "mobile=Y&"; "Y:Y:" "mobile=Y"; "N:Y:?" ""; "N:Y:" ""; } |
2) Чуть измененный конфиг, стандартного комозита.
/etc/nginx/bx/conf/composite_ex.conf
set $composite_cache "bitrix/html_pages/${host}${composite_key}/index@${mobile}${args}.html"; set $composite_file "${docroot}/${composite_cache}"; set $composite_enabled "${docroot}/bitrix/html_pages/.enabled"; set $use_composite_cache ""; if ($is_global_composite = 1) {set $use_composite_cache "A";} include bx/conf/bitrix_general.conf; location / { if (-f $composite_enabled) { set $use_composite_cache "${use_composite_cache}B"; } if (-f $composite_file) { set $use_composite_cache "${use_composite_cache}C"; } if ($use_composite_cache = "ABC") { rewrite .* /$composite_cache last; } proxy_pass $proxyserver; } |
3) И дальше подключаем наши конфиги в файле виртуального хоста:
/etc/nginx/bx/site_avaliable/bx_domain.ru.conf
# Ansible managed # Additional website http include bx/maps/composite_ex.conf; server { #limit_conn perip 3; listen 443 http2; server_name domain.ru www.domain.ru; # enable SSL connection include bx/conf/ssl.conf; access_log /var/log/nginx/access.log main; error_log /var/log/nginx/error.log warn; #charset utf-8; server_name_in_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $host:443; proxy_set_header HTTPS YES; proxy_set_header X-Forwarded-Proto https; set $proxyserver "http://127.0.0.1:8887"; set $imcontenttype "text/html; charset=utf-8"; set $docroot "/home/bitrix/www/domain.ru"; index index.php; root "/home/bitrix/www/domain.ru"; proxy_ignore_client_abort off; # Include parameters common to all websites #include bx/conf/bitrix.conf; include bx/conf/composite_ex.conf; # Include munin and nagios web include bx/server_monitor.conf; } |
Перезагружаем nginx и проверяем работу композита.
Недостатки:
При добавлении параметра в request_uri он может потом вылезти в ссылках в компонентах, по этому придется вносить коррекции в шаблоны компонентов, где такое произошло. Либо на обработчике события OnBeforeEndBufferContent убрать лишние параметры mobile=Y.