add_header не работает в расположении Nginx

add_header не работает в расположении Nginx

Итак, я пытаюсь разобраться в этом уже 8 часов, но, похоже, я застрял...

У меня есть следующий файл конфигурации Nginx:

server_tokens off;

upstream php-handler {
  server unix:/var/run/php5-fpm.sock;
}

server {
  listen 80;
  server_name     domain.net;
  access_log      /var/log/nginx/domain.net-access.log;
  error_log       /var/log/nginx/domain.net-error.log;




  location ~* \.(jpg|jpeg|gif|png|js|css|ico|eot|woff|ttf|svg|cur|htc|xml|html|tgz)$ {
       expires 24h;
  }

  root /var/www/html/domain.net;

  index index.php;


  location ~ ^/cars/sale(.*) {
        add_header X-Robots-Tag "noindex, nofollow" always;
        try_files $uri $uri/ /index.php;
  }

  location ~ ^/(?:\.htaccess|config){
       deny all;
  }

  location / {
        try_files $uri $uri/ /index.php;
  }


 location ~ \.php(?:$|/) {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass php-handler;
    fastcgi_read_timeout 120s;
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    fastcgi_ignore_client_abort on;
    fastcgi_param  SERVER_NAME $http_host;
  }

}

Проблема в том, что X-Robots-Tag из локации "/cars/sale" не добавляется, что бы я ни пробовал. Я предполагаю, что это происходит из-за того, что запрос передается в конечную локацию ".php", где любой ранее добавленный заголовок забывается. Есть ли способ добавить этот заголовок только для этой конкретной локации без использования more_set_headers?

решение1

На самом деле вы можете просто сделать это:

map $request_uri $robot_header {
    default "";
    ~^/cars/sale(.*) "noindex, nofollow";
    ~^/bikes/sale(.*) "noindex, nofollow";
    ~^/motorbikes/sale(.*) "noindex, nofollow";
}

Но если все они следуют этому шаблону, то можно просто сделать следующее:

map $request_uri $robot_header {
    default "";
    ~^/(.+?)/sale(.*) "noindex, nofollow";
}

Ваша конфигурация довольно запутанная. При использовании регулярных выражений Nginx выберет первый подходящий блок для обслуживания вашего запроса, поэтому порядок их перечисления важен.

Вы можете вложить еще один блок php в блок местоположения вашего автомобиля и добавить заголовок туда. Если вы укажете обработчик php как сервер upstream, то вам не придется включать все параметры fastcgi каждый раз, что делает все более аккуратным.

решение2

Итак... Я придумал решение после хорошего ночного сна. Это очень грязное решение, но это буквально единственное, что работает в моем конкретном случае:

В блоке http я добавляю:

map $request_uri $robot_header1 {
    default "";
    ~^/cars/sale(.*) "noindex, nofollow";
}

map $request_uri $robot_header2 {
    default "";
    ~^/bikes/sale(.*) "noindex, nofollow";
}

map $request_uri $robot_header3 {
    default "";
    ~^/motorbikes/sale(.*) "noindex, nofollow";
}

(Это всего лишь три примера, но на самом деле я сгенерировал около 200 из них внутри файла, который я включил в блок http)

А в блоке сервера я добавил:

add_header X-Robots-Tag $robot_header1;
add_header X-Robots-Tag $robot_header2;
add_header X-Robots-Tag $robot_header3;
...

Мне также пришлось увеличить параметр Nginx "variables_hash_bucket_size" до 512, поскольку значение по умолчанию 64 недостаточно для такого количества переменных, как мне было нужно. Поэтому я надеюсь, что это поможет кому-то еще...

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