Como definir o robots.txt globalmente no nginx para todos os hosts virtuais

13

Estou tentando definir robots.txtpara todos os hosts virtuais no servidor http nginx. Consegui fazer isso no Apache colocando o seguinte em principal httpd.conf:

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

Tentei fazer algo semelhante com o nginx adicionando as linhas abaixo (a) dentro do nginx.conf e (b) como include conf.d / robots.conf

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

Eu tentei com '=' e até o coloquei em um dos hosts virtuais para testá-lo. Nada parecia funcionar.

O que estou perdendo aqui? Existe outra maneira de conseguir isso?

anup
fonte
Nota: Não havia como colocá-lo como uma configuração Global (ou seja, definida em um arquivo que se aplica a todos os hosts virtuais sem uma instrução de inclusão). Pode-se definir um robots.conf em conf.d (ou global.d [não-padrão]) e incluir isso em todas as configurações de host virtual. Todas as outras respostas apontam para várias maneiras de fazer a mesma coisa: proxy_pass, retrun {} etc.
anup

Respostas:

4

a localização não pode ser usada dentro do httpbloco. O nginx não possui aliases globais (ou seja, aliases que podem ser definidos para todos os vhosts). Salve suas definições globais em uma pasta e inclua-as.

server {
  listen 80;
  root /var/www/html;
  include /etc/nginx/global.d/*.conf;
}
user79644
fonte
Como indicado na pergunta, eu tentei fazer isso colocando robots.conf na pasta conf.d. Mas não funciona como global.
anup
continua ... Como você disse, o Nginx não tem aliases globais. Eventualmente, a resolução foi adicioná-lo por configuração de host virtual.
anup
43

Você pode definir o conteúdo do arquivo robots.txt diretamente na configuração do nginx:

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

Também é possível adicionar o tipo de conteúdo correto:

    location = /robots.txt {
       add_header Content-Type text/plain;
       return 200 "User-agent: *\nDisallow: /\n";
    }
Konstantin V Bekreyev
fonte
1
Apenas uma observação: eu precisava colocar location = /robots.txt(observe o sinal de igual), caso contrário, outra location ~* \.(txt|log)$correspondência abaixo estava substituindo-a.
Beebee
Como isso pode ser adicionado a um arrumado conf.d/robots.conf? Como é a diretiva "local", não é permitida aqui , o que é razoável, mas não é para um servidor específico. Não tenho certeza sobre a resposta para @ user79644. É inevitável adicionar isso a cada site?
Pablo A
Eu não testei isso. Mas, parece semelhante ao em questão, exceto que um 'retorno' é usado no lugar do alias. O problema que enfrentei é torná-lo um cenário global. O que significa que não devo repeti-lo em todos os .conf de um site. Não consegui que o método global funcionasse da maneira que funciona com o Apache. Digamos, por exemplo, um servidor de Desenvolvimento que não deva ser rastreado.
anup 27/08
10

Existem outras regras definidas? Talvez o arquivo common.conf ou outro arquivo conf incluído esteja substituindo sua configuração. Um dos seguintes procedimentos definitivamente deve funcionar.

location /robots.txt { alias /home/www/html/robots.txt; }
location /robots.txt { root /home/www/html/;  }
  1. O Nginx executa todos os locais "regexp" na ordem em que aparecem. Se qualquer local "regexp" for bem-sucedido, o Nginx usará essa primeira correspondência. Se nenhum local "regexp" for bem-sucedido, o Nginx usará o local comum encontrado na etapa anterior.
  2. Os locais "regexp" têm precedência sobre os locais "prefix"
user79644
fonte
Não funciona como uma opção global. Mas, funciona dentro da configuração de um host virtual. Usei o primeiro (local /robots.txt) e até o que especifiquei em questão ('~ * /robots.txt'). Ambos funcionaram na configuração do Host Virtual. Eu acho que o uso de 'location' 'se {}' se enquadra na diretiva 'server' e isso talvez não funcione em nível global.
anup
Verifique se você tem um /robots.txtarquivo para o alias. Não tive a rootopção de trabalhar.
Shadoath
-1

Eu tive o mesmo problema com os desafios da Acme, mas o mesmo princípio também se aplica ao seu caso.

O que fiz para resolver esse problema foi mover todos os meus sites para uma porta não-padrão, escolhi 8081e criei um servidor virtual que escuta na porta 80. Ele proxies todas as solicitações 127.0.0.1:8081, exceto as que são conhecidas. Isso funciona quase como um alias global, com um salto extra, mas isso não deve causar uma queda significativa no desempenho devido à natureza assíncrona do 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
fonte