Comment définir globalement robots.txt dans nginx pour tous les hôtes virtuels

13

J'essaie de définir robots.txtpour tous les hôtes virtuels sous le serveur http nginx. J'ai pu le faire dans Apache en mettant les éléments suivants en principal httpd.conf:

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

J'ai essayé de faire quelque chose de similaire avec nginx en ajoutant les lignes ci-dessous (a) dans nginx.conf et (b) comme include conf.d / robots.conf

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

J'ai essayé avec '=' et je l'ai même mis dans l'un des hôtes virtuels pour le tester. Rien ne semblait fonctionner.

Qu'est-ce que j'oublie ici? Existe-t-il un autre moyen d'y parvenir?

anup
la source
Remarque: Il n'y avait aucun moyen de le mettre en tant que paramètre global (c'est-à-dire défini dans un fichier qui s'applique à tous les hôtes virtuels sans instruction include). On peut définir un fichier robots.conf dans conf.d (ou global.d [non standard]) et l'inclure dans chaque configuration d'hôte virtuel. Toutes les autres réponses indiquent différentes façons de faire la même chose: proxy_pass, retrun {} etc.
anup

Réponses:

4

l'emplacement ne peut pas être utilisé à l'intérieur du httpbloc. nginx n'a pas d'alias globaux (c'est-à-dire des alias qui peuvent être définis pour tous les vhosts). Enregistrez vos définitions globales dans un dossier et incluez-les.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
user79644
la source
Comme indiqué dans la question, j'avais essayé de le faire en plaçant robots.conf dans le dossier conf.d. Mais cela ne fonctionne pas comme mondial.
anup
suite ... Comme vous l'avez dit, Nginx n'a pas d'alias globaux. Finalement, la résolution consistait à l'ajouter par configuration d'hôte virtuel.
anup
43

Vous pouvez définir le contenu du fichier robots.txt directement dans la configuration nginx:

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

Il est également possible d'ajouter le bon type de contenu:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
la source
1
Juste une note: je devais mettre location = /robots.txt(Notez le signe égal) sinon une autre location ~* \.(txt|log)$correspondance en dessous la remplaçait.
Beebee
Comment cela pourrait-il être ajouté à un rangement conf.d/robots.conf? De même que la directive "location" n'est pas autorisée ici , ce qui est raisonnable, mais ce n'est pas pour un serveur particulier. Je ne suis pas sûr de la réponse de @ user79644 à cela. Est-il inévitable d'ajouter cela à chaque site?
Pablo A
Je n'ai pas testé ça. Mais, ressemble à celui en question, sauf qu'un «retour» est utilisé à la place de l'alias. Le problème que j'ai rencontré est d'en faire un cadre mondial. Ce qui signifie que je ne devrais pas le répéter dans chaque .conf d'un site Web. Je n'ai pas pu faire fonctionner la méthode globale comme elle fonctionne avec Apache. Disons par exemple un serveur de développement qui ne doit pas être exploré.
anup
10

Y a-t-il d'autres règles qui sont définies? Peut-être common.conf ou un autre fichier de conf inclus qui remplace votre configuration. L'un des éléments suivants devrait certainement fonctionner.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx exécute tous les emplacements "regexp" dans l'ordre de leur apparence. Si un emplacement "regexp" réussit, Nginx utilisera cette première correspondance. Si aucun emplacement "regexp" n'a réussi, Nginx utilise l'emplacement ordinaire trouvé à l'étape précédente.
  2. Les emplacements "regexp" ont priorité sur les emplacements "prefix"
user79644
la source
Cela ne fonctionne pas comme une option globale. Mais, fonctionne dans la configuration d'un virtualhost. J'ai utilisé le premier (emplacement /robots.txt) et même celui que j'ai spécifié en question ('~ * /robots.txt'). Les deux ont fonctionné de la configuration de l'hôte virtuel. Je pense que l'utilisation de 'location' 'si {}' relève de la directive 'server' et cela, peut-être ne fonctionne pas au niveau mondial.
Anup
Assurez-vous d'avoir un /robots.txtfichier à alias. Je n'ai pas eu la rootpossibilité de travailler.
Shadoath
-1

J'ai eu le même problème avec les défis d'acme, mais le même principe s'applique également à votre cas.

Ce que j'ai fait pour résoudre ce problème était de déplacer tous mes sites vers un port non standard, j'ai choisi 8081et créé un serveur virtuel à l'écoute sur le port 80. Il envoie toutes les demandes par proxy 127.0.0.1:8081, sauf celles à .well-known. Cela agit presque comme un alias global, avec un bond supplémentaire, mais cela ne devrait pas entraîner une baisse significative des performances en raison de la nature asynchrone de 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
la source