2017-05-24 97 views
0

我需要在nginx中創建一個虛擬子目錄,它將提供與根不同的位置的文件。這個虛擬目錄也運行PHP,但爲了簡潔,我省略了fastcgi配置。nginx位置塊中的負向lookbehind

我有兩個位置塊,一個用於/ virtual目錄使用別名,而位置塊for /有它自己的根指令。這個root指令被虛擬文件夾繼承,搞亂了路徑。有沒有什麼辦法可以通過繼承/ location塊的根指令來排除/ virtual中的url?

這裏是我的服務器配置的摘錄:

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開頭的所有網址,但沒有m什麼都可以。

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塊可以實現相同的功能。請參閱this caution關於使用if

例如:

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