3 votes

Nginx proxy pass et réécriture d'URL

Comment déclencher cette règle uniquement lorsque j'ai des paramètres GET (chaîne de requête) dans l'URL, sinon je ferai correspondre un alias.

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

8voto

hoonto Points 1648

La 1ère façon que je connais d'utiliser regex contre le paramètre $args est la suivante :

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

Ou la 2ème manière est d'utiliser le pratique $is_args comme ceci :

    if ($is_args != "") {  

N'oubliez pas que dans les deux styles vous devez mettre un espace entre le if et la parenthèse ouvrante; "if (" pas "if(" ainsi qu'un espace après la parenthèse fermante et l'accolade ouvrante; ") {" plutôt que "){".

Exemple complet utilisant le 1er style ci-dessus, 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; 
    }
}

Exemple complet utilisant le 2ème style ci-dessus, 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; 
    }
}

Notez que l'inclusion proxy.conf va en dehors de l'instruction if.

Version :

[nginx@hip1 ~]$ nginx -v
nginx version: nginx/1.2.6 

Et quelques informations sur les variables $args et $is_args :

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

Lire la documentation est toujours utile, je viens de découvrir que $query_string est la même que $args, donc là où j'ai utilisé $args ci-dessus, vous pourriez aussi utiliser $query_string selon la documentation.

IMPORTANT

Il est toutefois important de noter que If can be Evil!

Et donc, testez minutieusement ou utilisez la recommandation fournie dans le lien ci-dessus pour changer l'URL à l'intérieur de l'instruction location d'une manière similaire à l'exemple fourni là, quelque chose comme :

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

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

        # Votre défaut, si aucun paramètre de requête n'existe :
        ...
    }

    location @dynamicphotos {
        # Si des paramètres de requête sont présents :
        rewrite ^/static/photos/(.*)$  /DynamicPhotoQualitySwitch/photos/$1  break;
        expires     7d;
        include /etc/nginx/proxy.conf; 
        proxy_pass http://foofoofoo.com; 
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X