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?
2 ответа
Вы можете просто сделать это:
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, что будет держать все в порядке.
Итак... Я подумал о решении после хорошего сна. Это очень грязное исправление, но буквально единственное, что работает в моем конкретном случае:
В блок 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 "variable_hash_bucket_size" до 512, потому что по умолчанию 64 недостаточно для такого количества переменных, как мне было нужно. Надеюсь, это поможет кому-то еще...