Настройка веб-сервера партнера
Одна из основных задач, которую решает партнер — корректная настройка веб-сервера для проксирования трафика в сервис Антиблок.
Внимание
Перед настройкой веб-сервера ознакомьтесь с особенностями работы сервиса Антиблок.
В качестве сервера для проксирования рекомендуется использовать Nginx.
Аутентификация на стороне сервиса
Для аутентификации партнеру выдается уникальный токен, который необходимо передавать при каждом http-запросе в заголовке X-AAB-PartnerToken
.
Ниже описаны примеры конфигурации с использованием Nginx.
Примеры конфигурации Nginx
Ссылки шифруются таким образом, что невозможно придумать правило (location
в терминах Nginx), по которому можно определить зашифрована ссылка или нет. Поэтому большинство конфигураций работает по методу «сначала искать контент у себя, а если контент не найден, то запрашивать его у прокси».
Использование Nginx mapping
Если на сайте партнера шифруются все ссылки на css, js, картинки, то можно использовать простой и удобный вариант конфигурации на базе mapping. В таком варианте практически весь трафик пользователей с AdBlock-приложением будет направлен на сервис.
map $cookie_bltsr:$http_x_aab_proxy:$http_x_aab_http_check:$request_method $px_backend {
default http://local;
~(.+::.*:GET|POST) https://partner_antiadblock-upstream;
~(.*:1:.*:.*) http://local;
~(.*:.*:\d+:POST) https://partner_antiadblock-upstream;
}
upstream partner_antiadblock-upstream {
server cryprox-test.yandex.net:443 max_fails=0 fail_timeout=0;
# backup server if cryprox request failed (optional)
server 127.0.0.1:81 backup;
keepalive 128;
}
upstream local {
server 127.0.0.1:81 max_fails=0 fail_timeout=0;
}
location / {
proxy_intercept_errors on;
proxy_cache off;
proxy_ignore_client_abort off;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-AAB-PartnerToken "PARTNER-TOKEN";
# settings for keepalived
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass_request_body on;
proxy_pass $px_backend;
proxy_next_upstream http_500 http_502 http_503 http_504;
error_page 502 504 = @local;
break;
}
location @local {
proxy_pass http://local;
}
В шапке конфигурации собирается mapping-key
$cookie_bltsr:$http_x_aab_proxy:$http_x_aab_http_check:$request_method
, где:
cookie_bltsr
— cookie, которой помечаются пользователи с AdBlock-приложением;http_x_aab_proxy
— заголовок, который проставляет сервис, когда идет к партнеру с запросом. Используется для предотвращения перезапросов/зацикливания.http_x_aab_http_check
— заголовок, которым подписываются служебные POST-запросы. Запросы с таким заголовком сервис умеет обрабатывать. При обработке остальных POST-запросов возвращается ошибка 405.request_method
— сам http-метод (GET, POST). Остальные методы не поддерживаются.
На основе получившегося ключа описан сценарий проксирования — в какой upstream
направлять запрос.
Использование try_files
Если на сайте партнера шифруются не все ссылки, то необходимо выбирать, что направлять в сервис, а что нет. Для этого можно использовать метод try_files из Nginx.
Сценарий использования:
-
Первый запрос необходимо направлять на свой сервер (
backend
). Если получен успешный ответ, он передается пользователю и обработка завершается. -
Если на предыдущем шаге был получен http-код ответа 404, то необходимо направить запрос в сервис Антиблок. Обработка ответа аналогична: если получен успешный ответ, он передается пользователю и обработка завершается.
-
Если сервис Антиблок тоже ответил 404, следует вернуть пользователю либо http-код ответа 404, либо специальную статусную страницу партнера (логику обработки ошибки 404 партнер выбирает самостоятельно).
upstream partner_antiadblock-upstream {
server cryprox-test.yandex.net:443 max_fails=0 fail_timeout=0;
# backup server if cryprox request failed (optional)
server 127.0.0.1:81 backup;
keepalive 128;
}
location / {
try_files $uri @cryprox;
}
location @cryprox {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-AAB-PartnerToken "PARTNER-TOKEN";
proxy_next_upstream http_500 http_502 http_503 http_504;
proxy_redirect off;
# settings for keepalived
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass https://partner_antiadblock-upstream;
}
Использование if
Если у партнера сложная конфигурация Nginx и перечисленные выше методы нельзя применить, то можно воспользоваться стандартными условиями.
Стоит учесть, что if в nginx реализован достаточно неочевидно.
Внимание
Все if
, которые определяют переменную to_proxy
, должны находиться вне секций location
.
upstream partner_antiadblock-upstream {
server cryprox-test.yandex.net:443 max_fails=0 fail_timeout=0;
# backup server if cryprox request failed (optional)
server 127.0.0.1:81 backup;
keepalive 128;
}
set $to_proxy 0;
if ($cookie_bltsr) {
set $to_proxy 1;
}
if ($request_method != GET) {
set $to_proxy 0;
}
if ($http_x_aab_http_check) {
set $to_proxy 1;
}
if ($http_x_aab_proxy) {
set $to_proxy 0;
}
location / {
error_page 467 = @aab;
if ($to_proxy = 1) {
return 467;
}
# some configuration
}
location @aab {
internal;
proxy_cache off;
proxy_ignore_client_abort off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-AAB-PartnerToken "PARTNER-TOKEN";
# settings for keepalived
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_pass https://partner_antiadblock-upstream;
}