So setzen Sie robots.txt global in nginx für alle virtuellen Hosts

13

Ich versuche, robots.txtfür alle virtuellen Hosts unter nginx http server festzulegen. Ich konnte es in Apache tun, indem ich Folgendes in main einfügte httpd.conf:

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

Ich habe versucht, etwas Ähnliches mit nginx zu tun, indem ich die folgenden Zeilen (a) in nginx.conf und (b) als conf.d / robots.conf hinzugefügt habe

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

Ich habe es mit '=' versucht und es sogar in einen der virtuellen Hosts gestellt, um es zu testen. Nichts schien zu funktionieren.

Was fehlt mir hier? Gibt es einen anderen Weg, um dies zu erreichen?

anup
quelle
Hinweis: Es gab keine Möglichkeit, es als globale Einstellung festzulegen (dh in einer Datei festgelegt, die für alle virtuellen Hosts ohne include-Anweisung gilt). Man kann eine robots.conf in conf.d (oder global.d [nicht standardmäßig]) setzen und diese in jede virtuelle Hostkonfiguration aufnehmen. Alle anderen Antworten verweisen auf verschiedene Möglichkeiten, dasselbe zu tun, nämlich: proxy_pass, retrun {} usw.
anup

Antworten:

4

Der Standort kann nicht innerhalb des httpBlocks verwendet werden. nginx hat keine globalen Aliase (dh Aliase, die für alle vhosts definiert werden können). Speichern Sie Ihre globalen Definitionen in einem Ordner und fügen Sie diese hinzu.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
user79644
quelle
Wie in der Frage angegeben, hatte ich versucht, dies zu tun, indem ich robots.conf in den Ordner conf.d legte. Aber es funktioniert nicht so global.
Anup
Fortsetzung ... Wie Sie sagten, hat Nginx keine globalen Aliase. Schließlich bestand die Lösung darin, es pro Konfiguration des virtuellen Hosts hinzuzufügen.
Anup
43

Sie können den Inhalt der robots.txt-Datei direkt in der nginx-Konfiguration festlegen:

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

Es ist auch möglich, den richtigen Inhaltstyp hinzuzufügen:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
quelle
1
Nur eine Anmerkung: Ich musste setzen location = /robots.txt(beachten Sie das Gleichheitszeichen), sonst wurde eine andere location ~* \.(txt|log)$Übereinstimmung darunter überschrieben.
Beebee
Wie könnte dies zu einem ordentlichen hinzugefügt werden conf.d/robots.conf? Die Direktive "location" ist hier nicht zulässig , was sinnvoll ist, aber nicht für einen bestimmten Server. Ich bin mir nicht sicher, ob @ user79644 darauf antwortet. Ist es unvermeidlich, dies jeder Site hinzuzufügen?
Pablo A
Ich habe das nicht getestet. Sieht jedoch ähnlich aus wie die fragliche, außer dass anstelle von Alias ​​eine "Rückgabe" verwendet wird. Das Problem, mit dem ich konfrontiert war, war, es zu einem globalen Umfeld zu machen. Das heißt, ich sollte es nicht in jeder .conf einer Website wiederholen. Ich konnte die globale Methode nicht so verwenden, wie sie mit Apache funktioniert. Angenommen, ein Entwicklungsserver sollte nicht gecrawlt werden.
Anup
10

Gibt es andere Regeln, die definiert sind? Möglicherweise ist die Datei common.conf oder eine andere Conf-Datei enthalten, die Ihre Konfiguration überschreibt. Eine der folgenden sollte auf jeden Fall funktionieren.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx führt alle "Regexp" -Standorte in der Reihenfolge ihres Erscheinungsbilds aus. Wenn ein "regulärer Ausdruck" erfolgreich ist, verwendet Nginx diese erste Übereinstimmung. Wenn kein "Regexp" -Standort erfolgreich war, verwendet Nginx den normalen Speicherort, der im vorherigen Schritt gefunden wurde.
  2. "Regexp" -Standorte haben Vorrang vor "Präfix" -Standorten
user79644
quelle
Es funktioniert nicht als globale Option. Funktioniert jedoch in der Konfiguration eines virtuellen Hosts. Ich habe den ersten (Speicherort /robots.txt) und sogar den von mir angegebenen ('~ * /robots.txt') verwendet. Beide haben in der Konfiguration von Virtual Host funktioniert. Ich denke, die Verwendung von 'location' ', wenn {}' unter die 'server'-Direktive fällt, funktioniert möglicherweise nicht auf globaler Ebene.
Anup
Stellen Sie sicher, dass Sie eine /robots.txtAlias-Datei haben. Ich hatte keine rootMöglichkeit zu arbeiten.
Shadoath
-1

Ich hatte das gleiche Problem mit den Acme-Herausforderungen, aber das gleiche Prinzip gilt auch für Ihren Fall.

Um dieses Problem zu lösen, habe ich alle meine Sites auf einen nicht standardmäßigen Port verschoben. Ich habe 8081einen virtuellen Server ausgewählt und erstellt, der Port 80 127.0.0.1:8081überwacht. Er überträgt alle Anforderungen an , mit Ausnahme derjenigen an .well-bekannt. Dies fungiert fast als globaler Alias ​​mit einem zusätzlichen Hop, aber dies sollte aufgrund der asynchronen Natur von Nginx keinen signifikanten Leistungsabfall verursachen.

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
quelle