Tilbake

Nginx basic auth not working with return statement

Som nevnt her1 og her2; dette3 er årsaken.

TL;DR — return trer inn før basic auth. Se de overnevnte sidene for en forklaring.

Løsningsforslag:

server {
  listen 80;
  server_name sub.domain.tld;
  return      302 https://$server_name$request_uri;
}

server {
  listen 443 ssl;
  server_name sub.domain.tld;

  # ref. https://stackoverflow.com/a/67981564 - https://nginx.org/en/docs/dev/development_guide.html#http_phases
  # `return` (`NGX_HTTP_SERVER_REWRITE_PHASE`) prosesseres før `auth_basic*` (`NGX_HTTP_ACCESS_PHASE`) av nginx,
  # og man vil derfor ikke kunne bruke basic auth for å autentisere et `return`-statement direkte i samme location block.
  # `proxy_pass` kommer etter `auth_basic*` og vil derfor fungere som en litt hacky workaround.
  location ~* {
    auth_basic           "Restricted";
    auth_basic_user_file /etc/nginx/basic_auth;
    proxy_pass http://127.0.0.1:1337;
  }
}

server {
  listen 1337;

  location = /cfg {
    set $CFG '';
    set $CFG '${CFG}key1=value\n';
    set $CFG '${CFG}key2=value\n';

    return 200 $CFG;
  }
}
  1. https://stackoverflow.com/a/67981564 

  2. https://mailman.nginx.org/pipermail/nginx/2016-November/052313.html 

  3. https://nginx.org/en/docs/dev/development_guide.html#http_phases