2014-01-22 52 views
12

我想基於請求中的自定義標頭有條件地從緩存中獲取文件。NGINX具有多個命名位置的try_files

如果請求中存在X-Proxy標頭,則僅在文件存在於緩存中時才返回該文件。否則,如果需要從互聯網上獲取它。

這是我.conf文件:

worker_processes 1; 

events { 
    worker_connections 1024; 
} 

http { 
    proxy_cache_path /home/nginx/proxy levels=1:2 keys_zone=one:15m inactive=7d max_size=1000m; 
    proxy_temp_path /home/nginx/temp; 
    proxy_buffering     on; 
    proxy_set_header X-Real-IP   $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Host     $http_host; 
    proxy_set_header X-NginX-Proxy true; 
    proxy_set_header Connection ""; 
    proxy_http_version 1.1; 

    server { 
     listen  8000; 

     location/{ 
      root /home/nginx/preload; 
      try_files /$uri @local @remote; 
     } 

     location @local { 
      internal; 
      add_header X-Local true; 
      add_header X-Cache $upstream_cache_status; 

      proxy_pass http://$http_host$uri$is_args$args; 
      proxy_cache    one; 
      proxy_cache_key   backend$request_uri; 
      proxy_cache_valid  200 1h; 
      proxy_cache_use_stale error timeout invalid_header; 
     } 

     location @remote { 
      resolver 8.8.8.8; 
      add_header X-Remote true; 
      add_header X-Cache $upstream_cache_status; 

      if ($http_x_proxy) { 
       return 404; 
      } 

      proxy_pass http://$http_host$uri$is_args$args; 
      proxy_cache    one; 
      proxy_cache_key   backend$request_uri; 
      proxy_cache_valid  200 1h; 
      proxy_cache_use_stale error timeout invalid_header; 

     } 

     error_page 500 502 503 504 /50x.html; 
     location = /50x.html { 
      root html; 
     } 
    } 
} 

的問題是,try_files指令總是傳遞到我的@remote位置,即使獲取文件緩存。如何告訴它該文件是從@local返回時找到的?

回答

26

try_files指令只接受一個指定的位置,所以顯然它是用於最後一個。這blog post提出了一個解決方案,適用於你的情況。如果你不將無法讀取整個帖子,你可以在@local塊的結尾處添加以下行:

proxy_intercept_errors on; 
recursive_error_pages on; 
error_page 404 = @remote; 

,改變你的try_files這樣:

try_files /$uri @local; 
+10

_「try_files指令只接受一個命名的位置「_ - 這些信息是黃金的,我不知道這一點,但我在文檔中找不到它。然而,這個技巧的重要部分在'error_page'指令中。非常感謝,現在一切正常! –

+2

是的,文檔根本沒有說,甚至沒有抱怨 - 它只是不會做你所要求的。瘸。 –