Часто для мобильной версии делают отдельный шаблон и не используют при этом для мобильной версии отдельный поддомен. В результате получается, что по оному урлу могут отдаваться разные страницы, что делает невозможным включить композит на сайте.
Но всё же при определенных действиях, можно сделать корректным работу композита в таких случаях. Это потребует доработки, как со стороны сайта, так и со стороны 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.