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

13

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

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

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

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

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

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

Anup
источник
Примечание: не было никакого способа поместить это как Глобальный параметр (то есть установить в одном файле, который применяется ко всем виртуальным хостам без оператора включения). Можно установить robots.conf в conf.d (или global.d [нестандартный]) и включить его в каждую конфигурацию виртуального хоста. Все остальные ответы указывают на различные способы сделать то же самое, а именно: proxy_pass, retrun {} и т. Д.
anup

Ответы:

4

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

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
user79644
источник
Как указано в вопросе, я попытался сделать это, поместив robots.conf в папку conf.d. Но это не работает как глобальный.
Anup
продолжение ... Как вы сказали, Nginx не имеет глобальных псевдонимов. В конце концов было решено добавить его в конфигурацию виртуального хоста.
Anup
43

Вы можете установить содержимое файла 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";
    }
Константин В Бекреев
источник
1
Просто примечание: мне нужно было поставить location = /robots.txt(обратите внимание на знак равенства), иначе еще одно location ~* \.(txt|log)$совпадение было ниже его.
Биби
Как это можно добавить в приборку conf.d/robots.conf? Так как директива location не разрешена , это разумно, но не для конкретного сервера. Я не уверен насчет @ user79644 ответа на этот вопрос. Это неизбежно, чтобы добавить это к каждому сайту?
Пабло А
Я не проверял это. Но, похоже на тот, о котором идет речь, за исключением того, что вместо псевдонима используется return. Проблема, с которой я столкнулся, заключается в том, чтобы сделать ее глобальной. Что означает, что я не должен повторять это в каждом .conf сайта. Я не мог заставить глобальный метод работать так, как он работает с Apache. Например, сервер разработки, который не следует сканировать.
Anup
10

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

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx запускает все «регулярные выражения» в порядке их появления. Если какое-либо местоположение "regexp" будет успешным, Nginx будет использовать это первое совпадение. Если местоположение «regexp» не удалось, Nginx использует обычное местоположение, найденное на предыдущем шаге.
  2. местоположения "regexp" имеют приоритет над местоположениями "prefix"
user79644
источник
Это не работает как глобальный вариант. Но работает в конфигурации виртуального хоста. Я использовал первый (location /robots.txt) и даже тот, который я указал в вопросе ('~ * /robots.txt'). Оба работали из конфигурации виртуального хоста. Я думаю, что использование 'location' 'if {}' подпадает под директиву 'server', и это, возможно, не работает на глобальном уровне.
Anup
Убедитесь, что у вас есть /robots.txtфайл для псевдонима. У меня не было rootвозможности работать.
Shadoath
-1

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

Чтобы решить эту проблему, я переместил все свои сайты на нестандартный порт, который я выбрал 8081, и создал виртуальный сервер, прослушивающий порт 80. Он передает все запросы 127.0.0.1:8081, кроме тех, которые относятся к .well-known. Это действует почти как глобальный псевдоним, с одним дополнительным прыжком, но это не должно вызывать значительного падения производительности из-за асинхронной природы 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;
  }
}
Акос Вандра
источник