Nginx-単一のファイルを提供するためのルート対エイリアス?


66

(ヒント:毎回ブラウザキャッシュをクリアする)nginxなどの単一のファイルを提供するのに何時間もかかった後、エイリアスディレクティブを使用する方法と、ルートディレクティブを使用する方法の2つの異なる方法を見つけました。robots.txt

location /robots.txt { alias /home/www/static/robots.txt; }
location /robots.txt { root /home/www/static/;  }

2つの間に機能的な違いはありますか?またはセキュリティの問題?他のディレクティブとの競合はありますか?(両方とも別の/ staticロケーションで問題ないように見えました)。それとも、どちらかを選択する理由は何ですか?

注-私は両方を同時に使用しませんでし :)むしろ、一度に1つずつ試し、両方とも機能しました。同じファイル内で両者がどのように相互作用するかを尋ねているわけではありませんが、どちらを使用する方がよいでしょうか。

回答:


71

後者の場合は完全一致を使用しないため、これら2つのディレクティブはわずかに機能が異なります。したがって、/robots.txt11112番目の場所も一致します。
location =/robots.txt { root /home/www/static/; }は、最初のディレクティブと完全に機能的に同等です。


良い点、ありがとう。しかし=、どちらの場合でも使用できますか?またはそれだけに適用されrootますか?また、私の編集を参照してください-私は両方を一度に使用するつもりはありませんでした。:)
サイクロプス

@Cyclopsはい、=両方の場合に使用できます。
アレクサンダーアザロフ

したがって、それらは同じになります-あるディレクティブを他のディレクティブよりも選ぶ理由はありますか?私の主な質問です。
サイクロプス

@Cyclops基本的に、そのような理由はありません。
アレックス

41

はい、違いがあります。「エイリアス」を使用すると、次のように別のファイル名にエイリアスすることができます。

location /robots.txt { alias /home/www/static/any-filename.txt; }

一方

location /robots.txt { root /home/www/static/; }

サーバー上のファイルにrobots.txtという名前を付けます。サーバー上のロボットファイルにtld.domain.subdomain-robots.txtという名前を付けるのが好きなので、最初のオプションを使用します。例えば

location /robots.txt { alias /home/www/static/ch.notex.static-robots.txt; }

1

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/passwdtry_filesディレクティブはの行動変更root/をalias、そしてどこに制約があるalias使用することができますが。


0

エイリアスがディレクトリ全体の場合、違いがあります。

    location ^~ /data/ { alias /home/www/static/data/; }

動作しますが、

    location ^~ /data/ { root /home/www/static/data/; }

しません これはする必要があります

    location ^~ /data/ { root /home/www/static/; }

(混同しやすい)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.