2012-05-16 8 views
13

i bin neu zu nginx, comming von Apache und ich möchte im Grunde folgendes tun:Nginx Proxy oder neu zu schreiben, je nach User-Agent

Basierend auf user-agent: iPhone: Umleitung zu iphone.mydomain.com

android: redirect

Facebook android.mydomain.com: Reverse Proxy

alle anderen otherdomain.com: Umleitung zu ...

und versuchte es die folgende Art und Weise:

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; 
} 

aber ich habe jetzt einen Fehler, wenn nginx Start:

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" 

und ich nicht bekommen, wie es zu tun oder was das Problem ist.

Dank

Antwort

18

Die ‚/ api‘ Teil des proxy_pass Ziel ist der Teil URI die Fehlermeldung bezieht. Da ifs Pseudopositionen sind und proxy_pass mit einem uri-Teil die übereinstimmende Position durch die angegebene uri ersetzt, ist dies in einem if nicht erlaubt. Wenn Sie nur die Logik von if invertieren, können Sie dies zum Laufen bringen:

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; 
}