Come impostare robots.txt a livello globale in nginx per tutti gli host virtuali


13

Sto cercando di impostare robots.txtper tutti gli host virtuali sotto il server http nginx. Sono stato in grado di farlo in Apache mettendo principalmente quanto segue httpd.conf:

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

Ho provato a fare qualcosa di simile con nginx aggiungendo le righe indicate di seguito (a) in nginx.conf e (b) come include conf.d / robots.conf

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

Ho provato con '=' e l'ho persino messo in uno degli host virtuali per testarlo. Niente sembrava funzionare.

Cosa mi sto perdendo qui? C'è un altro modo per raggiungere questo obiettivo?


Nota: non c'era modo di metterlo come impostazione globale (cioè impostato in un file che si applica a tutti gli host virtuali senza un'istruzione include). È possibile impostare un file robots.conf in conf.d (o global.d [non standard]) e includerlo in ogni configurazione dell'host virtuale. Tutte le altre risposte indicano vari modi di fare la stessa cosa, vale a dire: proxy_pass, retrun {} ecc.
fino al

Risposte:


4

la posizione non può essere utilizzata all'interno del httpblocco. nginx non ha alias globali (cioè alias che possono essere definiti per tutti i vhosts). Salvare le definizioni globali in una cartella e includerle.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}

Come indicato nella domanda, avevo provato a farlo inserendo robots.conf nella cartella conf.d. Ma non funziona come globale.
Anup

continua ... Come hai detto, Nginx non ha alias globali. Alla fine la risoluzione era di aggiungerlo per la configurazione dell'host virtuale.
Anup

43

È possibile impostare il contenuto del file robots.txt direttamente nella configurazione di nginx:

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

È anche possibile aggiungere il tipo di contenuto corretto:

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

1
Solo una nota: avevo bisogno di mettere location = /robots.txt(nota il segno di uguale), altrimenti un'altra location ~* \.(txt|log)$corrispondenza sotto di essa lo stava scavalcando.
Beebee,

Come potrebbe essere aggiunto a un ordine conf.d/robots.conf? Come è la direttiva "location" non è consentita qui , il che è ragionevole, ma non è per un determinato server. Non sono sicuro della risposta di @ user79644 a questo. È inevitabile aggiungere questo ad ogni sito?
Pablo A

Non l'ho provato. Ma sembra simile a quello in questione, tranne per il fatto che un "ritorno" viene usato al posto dell'alias. Il problema che ho dovuto affrontare è renderlo un ambiente globale. Ciò significa che non dovrei ripeterlo in ogni .conf di un sito Web. Non sono riuscito a far funzionare il metodo globale nel modo in cui funziona con Apache. Ad esempio, dire un server di sviluppo che non deve essere sottoposto a scansione.
Anup

10

Ci sono altre regole definite? Forse common.conf o un altro file di configurazione incluso che sovrasta la tua configurazione. Uno dei seguenti dovrebbe sicuramente funzionare.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. Nginx esegue tutte le posizioni "regexp" in ordine di apparizione. Se una posizione "regexp" ha esito positivo, Nginx utilizzerà questa prima corrispondenza. Se nessuna posizione "regexp" ha esito positivo, Nginx utilizza la posizione ordinaria trovata nel passaggio precedente.
  2. Le posizioni "regexp" hanno la precedenza sulle posizioni "prefisso"

Non funziona come opzione globale. Ma funziona all'interno della configurazione di un virtualhost. Ho usato il primo (location /robots.txt) e anche quello che ho specificato nella domanda ('~ * /robots.txt'). Entrambi hanno funzionato dalla configurazione di Virtual Host. Penso che l'uso di 'location' 'se {}' rientri nella direttiva 'server' e questo, forse, non funziona a livello globale.
Anup

Assicurati di avere un /robots.txtfile con lo pseudonimo. Non ho avuto la rootpossibilità di lavorare.
Shadoath,

-1

Ho avuto lo stesso problema con le sfide acme, ma lo stesso principio si applica anche al tuo caso.

Quello che ho fatto per risolvere questo problema è stato spostare tutti i miei siti su una porta non standard, ho scelto 8081e creato un server virtuale in ascolto sulla porta 80. Inoltra tutte le richieste 127.0.0.1:8081, tranne quelle a .well-known. Questo agisce quasi come un alias globale, con un ulteriore salto, ma ciò non dovrebbe causare un calo significativo delle prestazioni a causa della natura asincrona di 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;
  }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.