2017-05-24 3 views
0

nginxにルート以外の場所からファイルを提供する仮想サブディレクトリを作成する必要があります。この仮想ディレクトリはPHPも実行しますが、簡潔にするためにfastcgiの設定を省略しました。nginxロケーションブロックの否定的なlookbehind

私は2つのロケーションブロックを持っていますが、/ virtualディレクトリ用のものはエイリアスを使用していますが、/のロケーションブロックはそれ自身のルートディレクティブです。このルートディレクティブは、仮想フォルダによって継承され、パスを混乱させます。/virtual内のurlを/ locationブロックのルートディレクティブを継承しないようにする方法はありますか?ここで

は私のサーバ設定の抜粋です:

server { 
    root /path/to; 

    location ^~ /virtual/ { 
     alias /path/to/lions/public; 
     try_files $uri $uri/ /lions/public/index.php?$query_string; 
    } 

    location/{ 
     root /path/to/tigers/public; 
     try_files $uri $uri/ /index.php?$query_string; 
    } 
} 

私はホスト名を参照する場合は/仮想/何でも、nginxのは

/path/to/tigers/public/lions/public/whatever 

代わりの

/path/to/lions/public/whatever 
でファイルを探します

私は以下のパターンを、/ virtualで始まるものと/以外で始まるすべてのURLに一致させようと試みましたが、 atch何か。

location ^~ ((?!\/virtual)\/.*)$ 

また、/ virtualのロケーションブロックにエイリアスとルートディレクティブの両方を入れてみましたが、nginxは起動しませんでした。

エイリアスディレクトリに別のルートを設定する方法はありますか。

+0

試行【このアプローチ(https://stackoverflow.com/a/16304073/3832970)。 'location〜^ /?virtual /.*$ {#empty}'を使い、 'location/{...}'を使ってください。 –

答えて

0

locationの値とaliasの値すべきいずれか/の両端または/でもないエンド - $request_filenameを計算する際に起因する方法nginxには、テキスト置換を行います。

try_filesステートメントのすべての要素はURIであるため、最後の要素は/virtual/index.php?$query_stringで、/lions/public/index.php?$query_stringではありません。後者は新しい検索を開始し、location /ブロックで処理されます。したがって、奇妙なファイルパス。

最後に、aliastry_filesを一緒に使用すると予測できません。 this bug reportを参照してください。同じ機能はブロックifを使用して達成することができます。 ifの使用については、this cautionを参照してください。例えば

location ^~ /virtual/ { 
    alias /path/to/lions/public/; 
    if (!-e $request_filename) { rewrite^/virtual/index.php?$query_string; } 
} 
関連する問題