Eu acho que vale a pena explicar explicitamente que o nginx está operando em prefixos e não em arquivos por si só. No primeiro caso,
location /robots.txt { alias /home/www/static/robots.txt; }
O nginx substitui o prefixo da string /robots.txt
no caminho da URL /home/www/static/robots.txt
e depois usa o resultado como um caminho do sistema de arquivos. Representado como pseudocódigo, isso seria algo como:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
Assim, /robots.txt
é veiculado /home/www/static/robots.txt
porque /robots.txt
o /robots.txt
prefixo despojado é a sequência vazia e anexa a sequência vazia para /home/www/static/robots.txt
deixá-la inalterada. Mas, /robots.txt1
seria servido de /home/www/static/robots.txt1
e /robots.txt/foobar
seria servido de /home/www/static/robots.txt/foobar
. Esses arquivos podem não existir, fazendo com que o nginx envie uma resposta 404, e provavelmente robots.txt
não é um diretório, mas o nginx não sabe disso com antecedência, e tudo isso é baseado em prefixos de string e não no que parece ser um arquivo ou diretório pela ausência ou presença de uma barra final.
Considerando que, no segundo caso,
location /robots.txt { root /home/www/static/; }
O nginx insere a sequência /home/www/static/
no início do caminho da URL e, em seguida, usa o resultado como um caminho do sistema de arquivos. No pseudocódigo, isso seria algo como:
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
Isso tem exatamente o mesmo resultado que o primeiro caso, mas por um motivo diferente. Não há remoção de prefixo, mas como todo caminho de URI deve conter o prefixo /robots.txt
, os caminhos do sistema de arquivos sempre começarão com o /home/www/static//robots.txt
que é equivalente /home/www/static/robots.txt
.
Obviamente, o pseudocódigo não conta a história toda, como, por exemplo, o nginx não usa cegamente caminhos de URL brutos como /../../../etc/passwd
, a try_files
diretiva altera o comportamento de root
/ alias
e há restrições sobre onde alias
pode ser usado.
=
em ambos os casos, correto? Ou apenas se aplica aroot
? Além disso, veja minha edição - não pretendia usar os dois ao mesmo tempo. :)