Cómo configurar robots.txt globalmente en nginx para todos los hosts virtuales

13

Estoy tratando de configurar robots.txttodos los hosts virtuales en el servidor http nginx. Pude hacerlo en Apache poniendo lo siguiente en main httpd.conf:

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

Intenté hacer algo similar con nginx agregando las líneas dadas a continuación (a) dentro de nginx.conf y (b) como include conf.d / robots.conf

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

He intentado con '=' e incluso lo puse en uno de los hosts virtuales para probarlo. Nada parecía funcionar.

¿Que me estoy perdiendo aqui? ¿Hay otra forma de lograr esto?

anup
fuente
Nota: No había forma de ponerlo como una configuración global (es decir, establecido en un archivo que se aplica a todos los hosts virtuales sin una declaración de inclusión). Se puede configurar un robots.conf en conf.d (o global.d [no estándar]) e incluirlo en cada configuración de host virtual. Todas las demás respuestas apuntan a varias formas de hacer lo mismo, a saber: proxy_pass, retrun {}, etc.
hasta el

Respuestas:

4

la ubicación no se puede usar dentro del httpbloque. nginx no tiene alias globales (es decir, alias que se pueden definir para todos los vhosts). Guarde sus definiciones globales en una carpeta e inclúyalas.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
usuario79644
fuente
Como se indica en la pregunta, intenté hacerlo colocando robots.conf en la carpeta conf.d. Pero no funciona como global.
anup
continúa ... Como dijiste, Nginx no tiene alias globales. Finalmente, la resolución fue agregarlo por configuración de host virtual.
anup
43

Puede configurar el contenido del archivo robots.txt directamente en la configuración de nginx:

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

También es posible agregar el tipo de contenido correcto:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
fuente
1
Solo una nota: necesitaba poner location = /robots.txt(Tenga en cuenta el signo igual) de lo contrario, otra location ~* \.(txt|log)$coincidencia debajo de la anulaba.
Beebee
¿Cómo se podría agregar esto a un ordenado conf.d/robots.conf? Como es , la directiva de "ubicación" no está permitida aquí , lo cual es razonable, pero no es para un servidor en particular. No estoy seguro acerca de @ user79644 respuesta a esto. ¿Es inevitable agregar esto a cada sitio?
Pablo A
No he probado esto. Pero, se parece al que está en cuestión, excepto que se usa un 'retorno' en lugar de un alias. El problema que enfrenté es convertirlo en un entorno global. Lo que significa que no debería repetirlo en cada archivo .conf de un sitio web. No pude lograr que el método global funcionara como funciona con Apache. Digamos, por ejemplo, un servidor de desarrollo que no debe rastrearse.
hasta el
10

¿Hay otras reglas definidas? Tal vez common.conf u otro archivo conf incluido que está anulando su configuración. Uno de los siguientes definitivamente debería funcionar.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx ejecuta todas las ubicaciones "regexp" en orden de aparición. Si alguna ubicación "regexp" tiene éxito, Nginx usará esta primera coincidencia. Si ninguna ubicación "regexp" tuvo éxito, Nginx usa la ubicación normal encontrada en el paso anterior.
  2. Las ubicaciones "regexp" tienen prioridad sobre las ubicaciones "prefijas"
usuario79644
fuente
No funciona como una opción global. Pero, funciona dentro de la configuración de un virtualhost. Usé el primero (ubicación /robots.txt) e incluso el que especifiqué en cuestión ('~ * /robots.txt'). Ambos funcionaron desde la configuración de Virtual Host. Creo que el uso de 'ubicación' 'si {}' cae dentro de la directiva 'servidor' y esto, quizás, no funciona a nivel global.
anup
Asegúrese de tener un /robots.txtarchivo para alias. No tuve la rootopción de trabajar.
Shadoath
-1

Tuve el mismo problema con los desafíos de acme, pero el mismo principio también se aplica a su caso.

Lo que hice para resolver este problema fue mover todos mis sitios a un puerto no estándar, elegí 8081y creé un servidor virtual que escuchaba en el puerto 80. Proxies todas las solicitudes 127.0.0.1:8081, excepto las que son bien conocidas. Esto actúa casi como un alias global, con un salto adicional, pero eso no debería causar una caída significativa en el rendimiento debido a la naturaleza asíncrona 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
fuente