У меня есть конфигурация сервера для приложения PHP, у которого общий заголовок X-Frame-Options установлен на "SAMEORIGIN".
За исключением части заявки должен разрешено включать в iframe. Удобно все это подается из https://example.app/external/*
Поэтому я хочу добавить другой заголовок X-Frame-Options (или опустить его) для запроса в этот каталог.
Я сейчас борюсь с этим. Для проверки я добавил настраиваемый заголовок в 2 места в моем server {}
config:
server {
server_name example.app;
listen 443 ssl;
root /data/example.app/public;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
# this one gets added to every request
add_header X-Test-Header "hello world";
index index.html index.php;
charset utf-8;
location /external/ {
# this one doesn't show up for https://example.app/external/show/24
add_header X-Test-Header-2 "Why not";
try_files $uri $uri/ /index.php?$query_string;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
# ssl config
# ...
# gip config
# ...
}
Как видите, я добавил два тестовых заголовка в свой файл конфигурации. Появляется первый; но тот, который предназначен специально для подкаталога, не отправляется с ответом. Я думаю, что это связано с совпадением блока местоположения, поэтому я попробовал эти
location /external/ {}
location = /external/ {}
location ~* /external/ {}
location ^~ /external/ {}
Но все запросы (например, example.app/external/nl/something/45) имеют только X-Test-Header
а не X-Test-Header-2
.
Есть идеи, почему?
В add_header
директиву нельзя добавить в location
не препятствуя всем остальным add_header
директивы не вступили в силу. Видеть документация, в частности:
Эти директивы наследуются от предыдущего уровня тогда и только тогда, когда на текущем уровне не определены директивы add_header.
Так же location
добавленный вами блок не где URI окончательно обрабатывается. В try_files
директива внутренне перепишет URI на /index.php
что заставит Nginx обработать запрос с помощью location ~ \.php$
блок.
Вы можете использовать add_header
оператор с переменной и установите эту переменную с помощью map
. Поместите оператор в тот же блок, что и другой add_header
заявления. Видеть этот документ для подробностей.
Например:
map $request_uri $myheader {
default "Default Value";
~^/external/ "External Value";
}
server {
...
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
add_header X-Test-Header $myheader;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
...
}
}
Кроме того, если вы установите значение переменной на ""
, то заголовок автоматически отбрасывается.