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

Как установить robots.txt глобально в nginx для всех виртуальных хостов

Я пытаюсь установить robots.txt для всех виртуальных хостов под http сервером nginx. Я смог сделать это в Apache, поместив в основной httpd.conf:

<Location "/robots.txt">
    SetHandler None
</Location>
Alias /robots.txt /var/www/html/robots.txt

Я попытался сделать что-то подобное с nginx, добавив приведенные ниже строки (a) в nginx.conf и (b) как include conf.d / robots.conf

location ^~ /robots.txt {
        alias /var/www/html/robots.txt;
}

Я пробовал с '=' и даже поместил его на один из виртуальных хостов, чтобы проверить это. Казалось, ничего не работает.

Что мне здесь не хватает? Есть ли другой способ добиться этого?

Вы можете установить содержимое файла robots.txt прямо в конфигурации nginx:

location = /robots.txt { return 200 "User-agent: *\nDisallow: /\n"; }

Также можно добавить правильный Content-Type:

location = /robots.txt {
   add_header Content-Type text/plain;
   return 200 "User-agent: *\nDisallow: /\n";
}

Есть ли другие правила, которые определены? Возможно, включен common.conf или другой файл conf, который имеет приоритет над вашей конфигурацией. Одно из следующих определенно должно работать.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx запускает все локации "regexp" в порядке их появления. Если какое-либо местоположение "regexp" выполнено успешно, Nginx будет использовать это первое совпадение. Если местоположение "regexp" не удалось, Nginx использует обычное местоположение, найденное на предыдущем шаге.
  2. Расположение "регулярных выражений" имеет приоритет над местоположениями "префиксов"

местоположение нельзя использовать внутри http блок. nginx не имеет глобальных псевдонимов (т.е. псевдонимов, которые могут быть определены для всех vhosts). Сохраните свои глобальные определения в папке и включите их.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}

Вы также можете просто передать файл robots.txt напрямую:

location /robots.txt {
   return 200 "User-agent: *\nDisallow: /\n"
}

У меня была такая же проблема с вызовами acme, но тот же принцип применим и к вашему случаю.

Чтобы решить эту проблему, я переместил все свои сайты на нестандартный порт, который я выбрал 8081и создал виртуальный сервер, прослушивающий порт 80. Он передает все запросы на 127.0.0.1:8081, кроме хорошо известных. Это действует почти как глобальный псевдоним с одним дополнительным прыжком, но это не должно вызывать значительного падения производительности из-за асинхронной природы nginx.

upstream nonacme {
  server 127.0.0.1:8081;
}

server {
  listen 80;

  access_log  /var/log/nginx/acme-access.log;
  error_log   /var/log/nginx/acme-error.log;

  location /.well-known {
    root /var/www/acme;
  }

  location / {
    proxy_set_header    Host                $http_host;
    proxy_set_header    X-Real-IP           $remote_addr;
    proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
    proxy_set_header    X-Forwarded-Proto   $scheme;
    proxy_set_header    X-Frame-Options     SAMEORIGIN;

    # WebSocket support (nginx 1.4)
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";

    proxy_pass http://nonacme;
  }
}