2012-05-16 22 views
13

nginx için kullanıcı aracıya göre apache geliyorsun ve ben temelde aşağıdaki yapmak istiyorum yeniden yazın:Nginx vekil veya i yeniyim

user-agent dayanarak

: iPhone: iphone.mydomain.com yönlendirme

android:

facebook android.mydomain.com yönlendirmek: otherdomain.com proxy ters

tüm diğer: ... yönlendirme

.210

ve ona şu şekilde çalıştı:

location /tvoice { 
    if ($http_user_agent ~ iPhone) { 
    rewrite  ^(.*) https://m.domain1.com$1 permanent; 
    } 
    ... 
    if ($http_user_agent ~ facebookexternalhit) { 
    proxy_pass   http://mydomain.com/api; 
    } 

    rewrite  /tvoice/(.*) http://mydomain.com/#!tvoice/$1 permanent; 
} 

Ama şimdi nginx başlatırken i bir hata alıyorum:

nginx: [emerg] "proxy_pass" cannot have URI part in location given by regular expression, or inside named location, or inside "if" statement, or inside "limit_except" 

Ve bunu ya da ne sorun olduğunu nasıl alamadım.

Teşekkür

cevap

18

proxy_pass hedefin '/ API' kısmı hata mesajı bahsediyor URI parçasıdır. Ifs sözde konumlar olduğundan ve uri bölümlü proxy_pass, belirtilen uri ile eşleşen konumu değiştirdiğinden, bir if içinde izin verilmez. Eğer mantıksal olarak bunu tersine çevirirseniz, bunu işe alabilirsiniz:

location /tvoice { 
    if ($http_user_agent ~ iPhone) { 
    # return 301 is preferable to a rewrite when you're not actually rewriting anything 
    return 301 https://m.domain1.com$request_uri; 

    # if you're on an older version of nginx that doesn't support the above syntax, 
    # this rewrite is preferred over your original one: 
    # rewrite^https://m.domain.com$request_uri? permanent; 
    } 

    ... 

    if ($http_user_agent !~ facebookexternalhit) { 
    rewrite ^/tvoice/(.*) http://mydomain.com/#!tvoice/$1 permanent; 
    } 

    proxy_pass   http://mydomain.com/api; 
}