Nginx перенаправляет на страницу согласия на использование файлов cookie, если файл cookie согласия не установлен

Этот вопрос относится почти к противоположному этому вопросу. Поскольку nginx допускает только if, а в предложении if только return, rewrite и proxy_pass и т. д., но try_files, else или NOT нельзя использовать.

Итак, проблема: я хочу смоделировать следующее (в конфигурации псевдо nginx)

location / {
  if (NOT  isset(cookie("cookie-consent")) ) {
    return 302 "https://example.com/cookieconsent";
  }
  else {
    # I am running the site on a backend server
    proxy_pass https://example.com:8443;
  }
}

# The HTML here has a button to agree to the use of said cookies
location /cookieconsent {
  root /path/to/www-root;
  try_files $uri/index.html $uri.html;
}

location /setconsent {
  add_header Set-Cookie 'consent=true;Domain=$host;Path=/;Max-Age=7776000;SameSite=strict;HTTPOnly;Secure';
  return 302 https://$host;
}

Предыстория этого заключается в том, что я использую Nextcloud, и поскольку Nextcloud использует только функциональные файлы cookie, достаточно, чтобы пользователи были проинформированы об использовании файлов cookie через всплывающее окно, однако Nextcloud не имеет подключаемого модуля GDPR Cookie Consent, и я не заинтересован в его разработке. . Таким образом, самая простая альтернатива — проверить, был ли пользователь проинформирован об использовании файлов cookie, и сначала отобразить страницу согласия на использование файлов cookie, в противном случае до отображения фактического сайта.


person christopher westburry    schedule 22.06.2020    source источник


Ответы (1)


Каким бы мощным ни был nginx, у вышеуказанной проблемы, конечно же, есть рабочее решение. На самом деле, причина, по которой я добавил вопрос, заключалась в том, чтобы опубликовать этот ответ, так как я считаю, что он может помочь другим, и, конечно, мне тоже, если я забуду, как я этого добился, по прошествии времени, и Google для быстрого решения. Без лишних слов, вот мое решение в файле конфигурации nginx:

location / {
  proxy_set_header HOST example.com;
  proxy_set_header X-Forwarded-For $remote_addr;
  
  if( $http_cookie ~* "consent" ) {
    proxy_pass https://example.com:8443;
  }
  
  # Setting `return 302` directly here doesn't work well
  # the first argument is just a filler as entering '@noconsent' only is disallowed
  try_files $uri/$arg_key @noconsent;
}

location @noconsent {
  return 302 "https://example.com/cookieconsent";
}

location /cookieconsent {
  root /path/to/www-root;
  expires max;
  try_files $uri/index.html $uri.html;
}

location /setconsent {
  add_header Set-Cookie 'consent=true;Domain=$host;Path=/;Max-Age=7776000;SameSite=strict;HTTPOnly;Secure';
  return 302 https://$host;
}

Эта конфигурация выполняет перенаправление 302 на «https://example.com/cookieconsent», если cookie не установлен. Там он ищет «/cookieconsent/index.html» и «cookieconsent.html». Любой из этих файлов должен присутствовать и быть доступным для чтения сервером. Он также должен включать кнопку или ссылку, которая запускает «/setconsent». Затем устанавливается файл cookie consent таким образом, что условие равно true, а proxy_pass срабатывает (в этом случае загружается Nextcloud).

Приятной особенностью этого является то, что это можно сделать исключительно в HTML, не устанавливая никаких файлов cookie, пока посетитель не даст явное согласие в соответствии с требованиями GDPR. С другой стороны, посетитель не может посетить фактический веб-сайт, не согласившись сначала на использование файлов cookie.

person christopher westburry    schedule 22.06.2020