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
ますか?また、私の編集を参照してください-私は両方を一度に使用するつもりはありませんでした。:)