2013-06-25 110 views
3

如何僅當我在URL中具有GET參數(查詢字符串)時觸發此規則,否則我將匹配一個別名。Nginx代理傳遞和URL重寫

location ~^/static/photos/.* { 
    rewrite ^/static/photos/(.*)$ /DynamicPhotoQualitySwitch/photos/$1 break; 
    expires  7d; 
    proxy_pass http://foofoofoo.com; 
    include /etc/nginx/proxy.conf; 
    } 
+0

您是指GET參數嗎?例如/static/photos/photo1.png?size=small – GCon

+0

是的,請舉例說明。 – Nicholas

+0

Christophe,由於您沒有接受答案,我認爲該解決方案對您無效。 Nginx非常棒,所以我很樂意幫助解決您可能遇到的任何問題,只要告訴我您是否遇到任何問題。 – hoonto

回答

8

,我知道的是使用正則表達式在$ args參數,像這樣的1路:

if ($args ~ "^(\w+)=") { 

或第二的方法是使用便捷$ is_args像這樣:

if ($is_args != "") { 

請記住,在兩個風格你需要在if和左括號之間放一個空格; 「if(」not「if(」以及右括號和左括號之後的空格;「){」而不是「){」。

使用1號風格上面,nginx.conf完整的示例:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($args ~ "^(\w+)=") { 
      rewrite ^/static/photos/(.*)$ /DynamicPhotoQualitySwitch/photos/$1 break; 
      expires  7d; 
      proxy_pass http://foofoofoo.com; 
    } 
} 

完整的示例使用上面的第二個款式,nginx.conf:

location ~^/static/photos/.* { 
    include /etc/nginx/proxy.conf; 
    if ($is_args != "") { 
      rewrite ^/static/photos/(.*)$ /DynamicPhotoQualitySwitch/photos/$1 break; 
      expires  7d; 
      proxy_pass http://foofoofoo.com; 
    } 
} 

注意,proxy.conf包括超出if語句。

版本:

[[email protected] ~]$ nginx -v 
nginx version: nginx/1.2.6 

而關於的$ args一些信息和$ is_args變量:

http://nginx.org/en/docs/http/ngx_http_core_module.html

讀取文檔總是有用的,我才發現,原來$ QUERY_STRING是相同的作爲$ args,所以在上面我有$ args的地方,你也可以根據文檔使用$ query_string。

重要

然而,值得注意的是,這If can be Evil!

也因此無論是測試徹底或使用中的鏈接提供的建議,上述改變位置語句中的URL的方式類似於此處提供的示例,如下所示:

location ~^/static/photos/.* { 
     error_page 418 = @dynamicphotos; 
     recursive_error_pages on; 

     if ($is_args != "") { 
      return 418; 
     } 

     # Your default, if no query parameters exist: 
     ... 
    } 

    location @dynamicphotos { 
     # If query parameters are present: 
     rewrite ^/static/photos/(.*)$ /DynamicPhotoQualitySwitch/photos/$1 break; 
     expires  7d; 
     include /etc/nginx/proxy.conf; 
     proxy_pass http://foofoofoo.com; 
    }