Як встановити 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, додавши рядки, наведені нижче (а) в межах nginx.conf і (b), як включають conf.d / robots.conf

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

Я спробував з '=' і навіть помістив його в один з віртуальних хостів, щоб перевірити його. Начебто нічого не спрацювало.

Що я тут пропускаю? Чи є інший спосіб досягти цього?


Примітка. Не було можливості встановити це як глобальний параметр (тобто встановити в одному файлі, який застосовується до всіх віртуальних хостів без оператора include). Можна встановити robots.conf в conf.d (або global.d [нестандартно]) і включити його у кожен віртуальний конфігураційний хост. Усі інші відповіді вказують на різні способи зробити те саме: proxy_pass, retrun {} etc.
anup

Відповіді:


4

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

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

Як зазначено в запитанні, я намагався це зробити, помістивши robots.conf в папку conf.d. Але це не працює так глобально.
anup

продовження ... Як ви вже говорили, Nginx не має глобальних псевдонімів. Врешті-решт, резолюція полягала в тому, щоб додати його за конфігурацією віртуального хоста.
anup

44

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

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

Можна також додати правильний тип вмісту:

    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? Як «місце» директива тут не допускається , що є розумним, але це не для конкретного сервера. Я не впевнений у відповіді на це @ user79644. Чи неминуче додавати це на кожен сайт?
Пабло А

Я цього не перевіряв. Але схожий на розглянутий, за винятком того, що замість псевдоніму використовується "повернення". Проблема, з якою я стикався, полягає в тому, щоб зробити її глобальною. Це означає, що я не повинен повторювати це у кожному .conf веб-сайту. Я не зміг отримати глобальний метод працювати так, як це працює з Apache. Скажімо, наприклад, сервер розвитку, який не слід сканувати.
anup

10

Чи є інші правила, які визначені? Можливо common.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. "regexp" місця мають перевагу над "префіксами"

Це не працює як глобальний варіант. Але, працює в налаштуваннях virtualhost. Я використовував перший (location /robots.txt) і навіть той, який я вказав у питанні ('~ * /robots.txt'). Обидва розробили конфігурацію Virtual Host. Я думаю, що використання 'location' ', якщо {}' підпадає під директиву 'server', і це, можливо, не працює на глобальному рівні.
anup

Переконайтеся, що у вас є /robots.txtфайл з псевдонімом. Я не отримав rootможливості працювати.
Шадоат

-1

У мене був такий самий випадок із викликами акме, але той самий принцип стосується і вашої справи.

Що я зробив, щоб вирішити цю проблему, це перемістити всі мої сайти на нестандартний порт, я вибрав 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;
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.