add_header não funciona no local Nginx

add_header não funciona no local Nginx

Então, tenho tentado descobrir isso nas últimas 8 horas, mas parece que não consigo...

Eu tenho o seguinte arquivo de configuração do 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;
  }

}

O problema é que o X-Robots-Tag do local "/cars/sale" não foi adicionado, não importa o que eu tentei. Suponho que isso ocorre porque a solicitação é passada para o local final ".php", onde qualquer cabeçalho adicionado anteriormente é esquecido. Existe alguma maneira de adicionar esse cabeçalho apenas para aquele local específico sem usar more_set_headers?

Responder1

Na verdade, você pode simplesmente fazer isso:

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

Mas então, se todos seguirem esse padrão, você poderá fazer o seguinte:

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

Sua configuração está bem confusa. Ao usar expressões regulares, o Nginx escolherá o primeiro bloco que corresponder para atender sua solicitação, portanto, a ordem em que você os lista é importante.

Você pode aninhar outro bloco php dentro do bloco de localização do seu carro e adicionar o cabeçalho lá. Se você especificar o manipulador php como um servidor upstream, então você não precisará incluir todos os parâmetros fastcgi todas as vezes, o que mantém as coisas mais organizadas.

Responder2

Então... pensei numa solução depois de uma boa noite de sono. É uma solução muito suja, mas é literalmente a única coisa que funciona no meu caso específico:

No bloco http estou adicionando:

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";
}

(Esses são apenas três como exemplo, mas na verdade eu gerei cerca de 200 deles dentro de um arquivo que estou incluindo no bloco http)

E no bloco do servidor adicionei:

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

Também tive que aumentar o parâmetro "variables_hash_bucket_size" do Nginx para 512, pois o padrão 64 não é suficiente para tantas variáveis, como eu precisava. Então, espero que isso ajude alguém também ...

informação relacionada