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?


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;
}

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";
    }

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"

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;
  }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.