Назад | Перейти на главную страницу

Добавить заголовок к каждому запросу для подкаталога

У меня есть конфигурация сервера для приложения 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$ { 
        ... 
    }
}

Кроме того, если вы установите значение переменной на "", то заголовок автоматически отбрасывается.