Я хотел бы обслуживать разные заголовки для разных местоположений, но при этом всегда обслуживать определенный файл (если соответствующий файл не найден).
У меня также есть несколько глобальных заголовков, которые необходимо добавить во все запросы, хотя и с оговоркой, что я не хочу, чтобы они добавлялись, если они уже были добавлены на этом 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;
}
Я понимаю, что любой location
s с add_header
означает любой верхний уровень (в данном случае в server
шаблоне) add_header
sне наследуются.
Проблема с вышеизложенным в том, что это просто не совсем работает! 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
для установки определенных значений. Смотретьэтот ответ.