Как мне поступить с белым списком доменов?

Как мне поступить с белым списком доменов?

Я пытаюсь выяснить, как мне справиться с внесением в белый список определенных доменных имен. Если запрос исходит из определенного поддомена, например <id>.domain-name.com, , доступ к изображениям будет ограничен для доменов из белого списка, одобренных для использования. Запросы из доменов, не входящих в белый список, приведут к ошибке 403.

Я не уверен, что именно мне следует делать? Мне следует использовать mapконтекст?

например, мой nginx.conf будет выглядеть примерно так

map $http_host $whitelist {
  default 0;
  "~^(?<id>\w+)\.domain-name\.example\.com$" $id;

  # whitelist domains
  whitelist1 1;
  whitelist2 1;
}

server {
  listen 80;
  proxy_intercept_errors on;

  error_page 400 = @fallback;

  if ($whitelist = 0) {
    return 403;
  }

  proxy_pass $whitelist;
}

решение1

Ваша nginxконфигурация в основном выглядит правильной, но есть несколько изменений, которые вы можете внести, чтобы убедиться, что она работает так, как ожидается.

Во-первых, вам нужно определить фактический белый список доменов, которым разрешен доступ к изображениям. В вашей текущей конфигурации вы определили два домена из белого списка как whitelist1и whitelist2. Вы должны заменить их фактическими именами доменов, которым разрешен доступ к изображениям.

Во-вторых, в контексте карты вы определили переменную $whitelistкак значение поддомена, который делает запрос. Однако на самом деле вам нужно значение имени домена, который делает запрос, без поддомена. Вы можете изменить контекст карты, чтобы извлечь имя домена следующим образом:

map $http_host $whitelist {
  default 0;
  "~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;

  # whitelist domains
  whitelist1 example.com;
  whitelist2 subdomain.example.com;
}

В приведенном выше примере регулярное выражение захватывает поддомен и доменное имя по отдельности. $domainЗатем переменной присваивается значение доменного имени без поддомена.

Наконец, вы можете использовать $whitelistпеременную в вашем блоке сервера, чтобы определить, следует ли разрешить или запретить доступ к изображениям. Ваша обновленная конфигурация будет выглядеть следующим образом:

map $http_host $whitelist {
  default 0;
  "~^(?<subdomain>\w+)\.(?<domain>domain-name\.example\.com)$" $domain;

  # whitelist domains
  whitelist1 example.com;
  whitelist2 subdomain.example.com;
}

server {
  listen 80;
  proxy_intercept_errors on;

  error_page 400 = @fallback;

  if ($whitelist = 0) {
    return 403;
  }

  location /images {
    # allow access only to whitelisted domains
    allow $whitelist;
    deny all;

    # serve images from disk
    alias /path/to/images;
  }

  location @fallback {
    # handle errors
    return 400;
  }
}

Связанный контент