nginxはファイル自体ではなくプレフィックスで動作していることを明示的に説明する価値があると思います。最初のケースでは、
location /robots.txt { alias /home/www/static/robots.txt; }
nginxは、URLパスの文字列プレフィックス /robots.txtを置換/home/www/static/robots.txtし、その結果をファイルシステムパスとして使用します。擬似コードとして表される場合、これは次のようになります。
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/robots.txt" + urlPath.stripPrefix("/robots.txt")
serveFile(fsPath)
}
だから、/robots.txtから提供される/home/www/static/robots.txtので、/robots.txt剥奪/robots.txt接頭空の文字列で、空の文字列を追加するとして/home/www/static/robots.txtそのままそれを残します。しかし、/robots.txt1はから提供され/home/www/static/robots.txt1、/robots.txt/foobarから提供され/home/www/static/robots.txt/foobarます。これらのファイルは、404応答を送信するためにnginxのを引き起こして、存在しないかもしれない、それはそれは可能性がありますrobots.txtどのようなとにかくないディレクトリが、nginxのは、事前にそれを知らないので、これはすべての文字列のプレフィックスに基づいておりません表示されるファイルであることをまたは、末尾のスラッシュの有無によるディレクトリ。
一方、2番目のケースでは、
location /robots.txt { root /home/www/static/; }
nginx /home/www/static/は、URLパスの先頭に文字列を挿入し、その結果をファイルシステムパスとして使用します。擬似コードでは、これは次のようになります。
if urlPath.startsWith("/robots.txt") {
fsPath := "/home/www/static/" + urlPath
serveFile(fsPath)
}
これは最初のケースとまったく同じ結果になりますが、理由は異なります。そこには、プレフィックスストリッピングませんが、すべてのURIパスが接頭辞を含める必要があるため/robots.txt、ファイル・システム・パスは常に始まります/home/www/static//robots.txtこれは同等です /home/www/static/robots.txt。
例えばnginxのは、盲目的などの生のURLパスを使用しないのでもちろん、擬似コードは非常に、全体的な話を教えてくれない/../../../etc/passwd、try_filesディレクティブはの行動変更root/をalias、そしてどこに制約があるalias使用することができますが。
=、どちらの場合でも使用できますか?またはそれだけに適用されrootますか?また、私の編集を参照してください-私は両方を一度に使用するつもりはありませんでした。:)