Jak ustawić globalnie plik robots.txt w nginx dla wszystkich hostów wirtualnych

13

Próbuję ustawić robots.txtdla wszystkich wirtualnych hostów na serwerze http nginx. Byłem w stanie to zrobić w Apache, umieszczając następujące w głównym httpd.conf:

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

Próbowałem zrobić coś podobnego z nginx, dodając wiersze podane poniżej (a) w nginx.conf i (b) jako dołączone conf.d / robots.conf

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

Próbowałem z „=”, a nawet umieściłem go w jednym z wirtualnych hostów, aby go przetestować. Wydawało się, że nic nie działa.

Czego tu brakuje? Czy istnieje inny sposób na osiągnięcie tego?

anup
źródło
Uwaga: Nie było możliwości ustawienia go jako ustawienia Globalnego (tj. W jednym pliku, który dotyczy wszystkich wirtualnych hostów bez instrukcji dołączenia). Można ustawić plik robots.conf w conf.d (lub global.d [niestandardowy]) i uwzględnić go w każdej konfiguracji hosta wirtualnego. Wszystkie pozostałe odpowiedzi wskazują na różne sposoby robienia tego samego, a mianowicie: proxy_pass, retrun {} itd.
anup

Odpowiedzi:

4

Lokalizacja nie może być użyta wewnątrz httpbloku. nginx nie ma globalnych aliasów (tj. aliasów, które można zdefiniować dla wszystkich vhostów). Zapisz swoje definicje globalne w folderze i dołącz je.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
użytkownik79644
źródło
Jak podano w pytaniu, próbowałem to zrobić, umieszczając plik robots.conf w folderze conf.d. Ale to nie działa tak globalnie.
anup
kont'd ... Tak jak powiedziałeś, Nginx nie ma globalnych aliasów. Ostatecznie rozwiązaniem było dodanie go dla konfiguracji hosta wirtualnego.
anup
44

Możesz ustawić zawartość pliku robots.txt bezpośrednio w konfiguracji nginx:

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

Można również dodać poprawny typ zawartości:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
źródło
1
Tylko uwaga: musiałem umieścić location = /robots.txt(zwróć uwagę na znak równości), w przeciwnym razie location ~* \.(txt|log)$zastąpiłoby go kolejne dopasowanie poniżej.
Beebee
Jak można to dodać do porządku conf.d/robots.conf? Podobnie jak dyrektywa „lokalizacja” nie jest tutaj dozwolona , co jest rozsądne, ale nie dotyczy konkretnego serwera. Nie jestem pewien odpowiedzi @ user79644 na to pytanie. Czy dodanie tego do każdej witryny jest nieuniknione?
Pablo A
Nie testowałem tego. Wygląda jednak podobnie do omawianego, z tym wyjątkiem, że zamiast aliasu używany jest zwrot. Problem, z którym się spotkałem, to uczynienie go globalnym. Co oznacza, że ​​nie powinienem powtarzać tego w każdym .conf strony internetowej. Nie mogłem zmusić globalnej metody do działania tak, jak działa z Apache. Powiedz na przykład serwer programistyczny, którego nie należy indeksować.
anup
10

Czy istnieją inne reguły, które są zdefiniowane? Może dołączony jest plik common.conf lub inny plik conf, który zastępuje konfigurację. Jedna z poniższych rzeczy zdecydowanie powinna działać.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx uruchamia wszystkie lokalizacje „regexp” w kolejności ich wyglądu. Jeśli jakakolwiek lokalizacja „wyrażenia regularnego” powiedzie się, Nginx użyje tego pierwszego dopasowania. Jeśli żadna lokalizacja „wyrażenia regularnego” nie powiodła się, Nginx używa zwykłej lokalizacji znalezionej w poprzednim kroku.
  2. Lokalizacje „regexp” mają pierwszeństwo przed lokalizacjami „prefiksów”
użytkownik79644
źródło
Nie działa jako opcja globalna. Ale działa w ramach konfiguracji wirtualnego hosta. Użyłem pierwszego (lokalizacja /robots.txt), a nawet tego, który określiłem w pytaniu („~ * /robots.txt”). Oba działały z konfiguracji wirtualnego hosta. Myślę, że użycie „lokalizacji”, jeśli {} „wchodzi w zakres dyrektywy„ serwerowej ”, i to może nie działa na poziomie globalnym.
anup
Upewnij się, że masz /robots.txtplik do aliasu. Nie dostałem rootopcji do pracy.
Shadoath,
-1

Miałem ten sam problem z wyzwaniami acme, ale ta sama zasada dotyczy również twojego przypadku.

Aby rozwiązać ten problem, przeniosłem wszystkie moje witryny do niestandardowego portu, wybrałem 8081i utworzyłem wirtualny serwer nasłuchujący na porcie 80. 127.0.0.1:8081Odpowiada on na wszystkie żądania , z wyjątkiem tych na dobrze znane. Działa to prawie jak globalny alias z jednym dodatkowym przeskokiem, ale nie powinno to powodować znacznego spadku wydajności z powodu asynchronicznej natury 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;
  }
}
Ákos Vandra
źródło