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

}

问题是,无论我怎么尝试,来自“/cars/sale”位置的 X-Robots-Tag 都无法添加。我猜这是因为请求被传递到最终的“.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 处理程序指定为上游服务器,则不必每次都包含所有 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";
}

(这些只是三个示例,但实际上我在 http 块中包含的文件中生成了约 200 个这样的示例)

在服务器块中我添加了:

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 不足以容纳我需要的那么多变量。所以,我希望这也能帮助其他人……

相关内容