2017-05-25 36 views
0

我有一些在通用TTP子域下都可以進行深層鏈接的圖形用戶界面。特別是URL/TTP/app/網站 /應該加載GUI命名爲app網站的統計數據。與/ ttp/應用程序加載相同的GUI與默認站點。支持位置正則表達式和try_files的深度鏈接,不能重定向到foo/local /到foo/index.html

這應該通過重定向都/ TTP/應用和/ TTP/應用/網站 /請求到/ usr /共享/ HTML/TTP/應用 /index.html頁面,該工作頁面將解析剩餘的網址,並找出哪個支持點擊,如果網站提供。

目前,我有這樣的事情在我的conf文件(我使用嵌套的位置這裏不包括其他的東西):

location /ttp { 
    root /usr/share/nginx/html/ttp/; 
    location ~ ^/foo/ { 
     try_files $uri $uri/ /foo/index.html; 
    } 
    location ~ ^/bar/ { 
     try_files $uri $uri/ /bar/index.html; 
    } 
    ... (one for each app) 
} 

這個工作,但是多餘的。我試圖用一個正則表達式來整合它,它將覆蓋所有具有單一位置的應用程序。我已經嘗試了幾個變體,原來有貪婪的正則表達式搶佔所有/ 應用程序/網站 /而不是/ 應用程序 /。我與非貪婪正則表達式是

location /ttp { 
    index index.html 
    root /usr/share/nginx/html/ttp/ 

    location ~ ^/((?U).*)/ { 
     try_files $uri /$1/index.html; 
    } 
} 

最好的嘗試這給我關於重寫或內部重定向循環錯誤而內部重定向TI「/ttp/index.html」這似乎意味着它不夠貪婪和完全忽略應用程序,其中$ 1爲空字符串。

有沒有一些乾淨的方式來做到這一點,與正則表達式或我不知道的一些指令?

回答

1

你的例子有缺陷 - 我認爲你簡化了它,並且我們在丟失/ttp前綴後將其刪除,它將進入外部location區塊。

您的URI結構爲/ttp/foo/xxx,您希望默認操作爲/ttp/foo/index.html,其中foo是應用的名稱。

您可以使用非貪婪正則表達式,但您可能會發現[^/]字符類更容易用於匹配URI中的單個路徑元素。

如果try_files語句的最後一個元素需要重寫,請使用命名的位置。有關更多信息,請參見this document

例如:

location /ttp { 
    root /usr/share/nginx/html; 
    try_files $uri $uri/ @rewrite; 
} 
location @rewrite { 
    rewrite ^(/ttp/[^/]+)/ $1/index.html last; 
    return 404; 
} 

,是以默認動作形式/ttp/foo/xxx的任何URI,將與URI作爲/ttp/foo/index.html重新進入location /ttp塊。 root參數以URI爲前綴形成本地路徑。