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.txtno caminho da URL /home/www/static/robots.txte 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.txtporque /robots.txto /robots.txtprefixo despojado é a sequência vazia e anexa a sequência vazia para /home/www/static/robots.txtdeixá-la inalterada. Mas, /robots.txt1seria servido de /home/www/static/robots.txt1e /robots.txt/foobarseria 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.txtnã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.txtque é 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_filesdiretiva altera o comportamento de root/ aliase há restrições sobre onde aliaspode 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. :)