2016-09-30 97 views
0

所以,這是我的情況。我有一個網站有一些自定義邏輯來自一個單獨的上游應用程序。我現在有這個工作沒有問題,儘管我的直接解決方案有點冗長。我將很快添加更多這些自定義位置,並添加以大寫和小寫方式訪問這些位置的功能。我的解決方案將起作用,但地點列表很快就會變得笨拙,我想重新考慮我的解決方案。Nginx規則的大小寫位置

因此,我們假設我的上游文件被稱爲「myupstream」,並已在文件中定義。我的自定義位置將是一,二,三和四。 (真實位置名稱因其自身保護而更改)。

所以這些URL:

http://mysite/one http://mysite/two http://mysite/three http://mysite/four

在我的nginx.conf:

location /one { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 
    location /two { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/two; 
      proxy_set_header Host $http_host; 
    } 
… 
etc. 

所有的位置是除了位置的名稱相同。

現在,位置的數量是現在的幾個,但可能會增長到幾十個。然後,添加以大寫和小寫訪問位置的功能。所以:

http://mysite/one http://mysite/ONE http://mysite/two http://mysite/TWO 等等

如果我有20個地點,使用我目前的戰略我要創建我的nginx.conf裏面40點不同位置的塊。所以,我正在尋找一種更有活力的方式。有些事情是這樣的:

location /(one|two|three) { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/$1; 
      proxy_set_header Host $http_host; 
    } 

當然,我希望它只適用於特定的條目,所以一個寬敞的規則是行不通的。另外,我也想檢測大寫字母,但在調用上游時,它需要小寫。例如:

location /ONE { 
      log_request_speed_filter on; 
      log_request_speed_filter_timeout 1000; 
      proxy_pass http://myupstream/one; 
      proxy_set_header Host $http_host; 
    } 

所以問題1:

有沒有更好的方式nginx的做到這一點?怎麼樣?

問題2:

哪種方式更具資源/流程效率?

在此先感謝您。

回答

2

使用不區分大小寫的location匹配:

location ~* /(one|two|three) { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream/$1; 
    proxy_set_header Host $http_host; 
} 

還有一個辦法 - 使用模板:

/etc/nginx/host.tmpl

log_request_speed_filter on; 
log_request_speed_filter_timeout 1000; 
proxy_pass http://myupstream/$host_loc; 
proxy_set_header Host $http_host; 

/etc/nginx/vhost.d/somehost.conf

location /one { 
    set $host_loc "one"; 
    include host.impl; 
} 

請注意,Nginx不支持位置URI中的變量。

我建議你基準不同的配置,以選擇最有效的。

編輯

如果你想傳遞/FOUR請求http://myupstream/four以及 /FoUr請求http://myupstream/four等等,那麼你應該使用一個 模塊,如Perl module,因爲目前Nginx的未建成用於URI的小寫版本的變量,或用於將位置URI轉換爲小寫的內置函數。

/etc/nginx/nginx.conf

http { 
    perl_set $uri_lc 'sub { return lc shift->uri; }'; 
} 

在子程序中,我們:

結果被分配給$uri_lc Nginx的變量。

/etc/nginx/vhost.d/somehost.conf

location ~* ^/(one|two|three)$ { 
    log_request_speed_filter on; 
    log_request_speed_filter_timeout 1000; 
    proxy_pass http://myupstream$uri_lc; 
    proxy_set_header Host $http_host; 
} 

的標記^(開始)和$(完)是很重要的。

+0

在上面的例子中,如果有人調用http://example.com/FOUR,傳遞給上游的值是「四」還是「四」?我需要它是「四」。 –

+0

@ R.Smith,我已經更新了答案 –

+0

謝謝!這正是我所需要的。 –