Nginx

nginx:直接從位置發送到另一個命名位置

  • May 10, 2022

在我的 nginx1.12.2配置文件中,我有:

upstream app {
 server unix:/tmp/app.sock  fail_timeout=0;
}

server {
 listen 443 deferred;

 root /some/dir;

 try_files $uri @app;

 # If the request is for the naked domain, just serve the index bundle
 # without going through Rails
 #
 location = / {
   try_files /index.html =404;
 }

 # If the request if for the /api prefix, go directly to Rails.
 # This location block is not strictly required, but it could be a handy
 # customization hook for extra headers and settings.
 #
 location /api/ {
   # Extra conf!
   try_files @app;
 }

 # The location directory allows very creative configurations.
 # http://nginx.org/en/docs/http/ngx_http_core_module.html#location
 #
 # This is just a named location to be used in try_files.
 location @app {
   proxy_pass_request_headers on;
   proxy_set_header ...
   proxy_pass http://app;
 }
}

在那裡,這並不正確,因為它只有一個參數:

 location /api/ {
   # Extra conf!
   try_files @app;
 }

…但它很好地傳達了我想要實現的目標。我想我可以try_files通過在最後一個參數之前添加一個非 esitent 文件來開始工作。

try_files唯一的方法,還是有另一個更慣用的指令?

你的方案行不通。當nginx確定最後一個location塊來處理請求時,它將使用範圍內的“設置和標頭”,這可能是從周圍的塊繼承的,但不會包括來自同級塊的任何“額外的標頭和設置” -與找到最終location塊的過程無關。有關更多資訊,請參閱此文件

如果您有適用於多個位置的通用語句,則可以將它們解除安裝到單獨的文件中,並在必要時包含它們。例如:

location / {
   try_files $uri @app;
}
location /api/ {
   # Extra conf!
   include my/proxy/conf;
}
location @app {
   include my/proxy/conf;
}

有關更多資訊,請參閱此文件

引用自:https://serverfault.com/questions/908086