Конфигурация для разных заголовков для разных путей, но в итоге всегда обслуживается один и тот же файл

Конфигурация для разных заголовков для разных путей, но в итоге всегда обслуживается один и тот же файл

Я хотел бы обслуживать разные заголовки для разных местоположений, но при этом всегда обслуживать определенный файл (если соответствующий файл не найден).

У меня также есть несколько глобальных заголовков, которые необходимо добавить во все запросы, хотя и с оговоркой, что я не хочу, чтобы они добавлялись, если они уже были добавлены на этом locationуровне.

У меня .template.confпока получилось следующее:

server {   
   listen   ${PORT};
   # Don't include any local server address info in redirects
   absolute_redirect off;

   index    index.html;

   root ${HTML_SRC};

   include  ${INCLUDE_DIR}/*.conf;
    
   # Serve any matching requested file (CSS, etc.) fallbacking to /index.html
   location / {
      # First try a matching existing file, then just show index.html
      try_files     $uri $uri/ /index.html;
   }
}

include(В ) INCLUDE_DIR/headers.confопределяется как:

# Global headers
add_header  X-FRAME-OPTIONS "DENY"  always;
add_header  Cache-Control   "no-store, must-revalidate" always;
add_header  Report-To   "<global-config>" always;
add_header  Content-Security-Policy "<global-config>" always;

# Location specific paths

# Specific known existing file in /$HTML_SRC/.well-known
location /.well-known/apple-app-site-association$ {
    default_type    application/json;
    # Redirect everything to fallback / location to serve the file
    rewrite .* / last;
}

# Assets
location ~* \.(jpg|jpeg|gif|png|svg|ttf)$ {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Report-To   "<global-config>" always;
    add_header  Content-Security-Policy "<global-config>" always;
    # Cache assets for a bit longer
    add_header  Cache-Control   "max-age=31557600";
    # Redirect everything to fallback / location to serve any files file
    rewrite .* / last;
}

location = /login {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<specific-config>" always;
    add_header  Content-Security-Policy "<specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

# All locations with this prefix have these headers
location /some-other-path {
    # Redeclare global headers (not inherited)
    add_header  X-FRAME-OPTIONS "DENY"  always;
    add_header  Cache-Control   "no-store, must-revalidate" always;
    # Path specific CSP headers
    add_header  Report-To   "<other-specific-config>" always;
    add_header  Content-Security-Policy "<other-specific-config>" always;
    # Redirect everything to /
    rewrite .* / last;
}

Я понимаю, что любой locations с add_headerозначает любой верхний уровень (в данном случае в serverшаблоне) add_headersне наследуются.

Проблема с вышеизложенным в том, что это просто не совсем работает! locationКонкретные заголовки не всегда используются. Я думаю, что rewriteпроблема в этом, но я также пробовал try_files(соответствуя шаблону) без успеха. Я также пробовал не иметь ничего, кроме дополнительных заголовков в locationблоке, но безуспешно. Я также думаю, что то, что я делаю, тоже не лучший подход...

Обратите внимание, что я упростил добавленные заголовки, например, включены заголовки CSP, есть другие глобальные заголовки и другие, специфичные для местоположения. У меня также есть другие пути, которым нужны другие заголовки, но я думаю, что то, что я получил выше, можно исправить с помощью общего решения, которое я могу применить к ним.

решение1

rewrite...lastзаставит Nginxпоиск нового местадля обработки запроса. Только последний locationполучает возможность задать заголовки ответа.

Вы можете обработать весь запрос в том же locationблоке, который устанавливает заголовки ответа, rewrite...breakили проще говоряс использованиемtry_filesследующее:

try_files /index.html =404;

Обратите внимание, что этот /index.htmlтерминнетпоследний параметр. Если бы это был последний параметр, это заставило бы Nginx искать новое местоположение для обработки запроса.


В качестве альтернативы, сохраните все ваши add_headerутверждения вместе и используйте a mapдля установки определенных значений. Смотретьэтот ответ.

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