IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Apache Discussion :

Utilisation de variables dans une RewriteRule


Sujet :

Apache

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Utilisation de variables dans une RewriteRule
    Bonjour à tous, alors voila je suis en train de réfléchir sur un système très simple de mise en cache pour une API Rest.

    Les seuls éléments variables sont les suivants:
    - le "Content-Type" qui peut être soit (application/json) ou (application/xml)
    - Le "Accept-Language" qui peut être fr, es, en ou de

    Le principe est le suivant:
    - on demande un fichier a mon API, je vérifie qu'il n'est pas déjà créé sur le disque dur (= mis en cache)
    si c'est le cas je le sert, sinon je le génère à la volée, sauvegarde sur le disque et le sert.

    Voici ce que j'ai écris dans le vhost:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # API Cache
        SetEnvIf Content-Type "(application/json)" REQUEST_TYPE=json
        SetEnvIf Content-Type "(application/xml)" REQUEST_TYPE=xml
        SetEnvIf Accept-Language "(fr)" REQUEST_LANG=fr
        SetEnvIf Accept-Language "(es)" REQUEST_LANG=es
        SetEnvIf Accept-Language "(de)" REQUEST_LANG=de
        SetEnvIf Accept-Language "/^((?!fr|es|de).)*$/" REQUEST_LANG=en
     
        RewriteRule ^/v[0-9]/lodgings/([0-9]) /api_cache/0/0/0/0/0/0/$1/lodgings/%{REQUEST_LANG}/$1.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9]) /api_cache/0/0/0/0/0/$1/$1$2/lodgings/%{REQUEST_LANG}/$1$2.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9]) /api_cache/0/0/0/0/$1/$2/$1$2$3/lodgings/%{REQUEST_LANG}/$1$2$3.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9]) /api_cache/0/0/0/$1/$2/$3/$1$2$3$4/lodgings/%{REQUEST_LANG}/$1$2$3$4.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9]) /api_cache/0/0/$1/$2/$3/$4/$1$2$3$4$5/lodgings/%{REQUEST_LANG}/$1$2$3$4$5.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9]) /api_cache/0/$1/$2/$3/$4/$5/$1$2$3$4$5$6/lodgings/%{REQUEST_LANG}/$1$2$3$4$5$6.%{REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9]) /api_cache/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7/lodgings/%{REQUEST_LANG}/$1$2$3$4$5$6$7.%{REQUEST_TYPE} [L]
     
    ErrorDocument 404 /cachingScript.php
    Le problème c'est les variables REQUEST_TYPE et REQUEST_LANG ne sont pas assignées, j'ai pourtant essayé plusieurs manières de les écrire, mais elles sont toujours vide.

    Je trouve ceci dans les logs rewrite:
    local path result: /api_cache/0/0/0/0/0/0/1/lodgings//1.

    Comme on peut le voir, les variables n'ont pas été renseignées.

    Savez vous comment je peut déclarer et utiliser des variables dans un fichier de conf vhost ?

    Merci d'avance et bonnes fêtes

  2. #2
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Après de nombreuses recherches j'ai finalement réussi à faire fonctionner ceci

    Donc première erreur très vilaine : omission du charactère "$" indiquant la fin de la chaîne dans le regex.

    Effectivement avec ce charactère on match beaucoup mieux au niveau des routes et on peut avancer un peu plus loin !

    Seconde erreur, un simple problème de syntaxe au niveau de l'utilisation des variables précedemment créées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SetEnvIf dummy .* REQUEST_TYPE=json
        #SetEnvIfNoCase Content-Type "(json)" REQUEST_TYPE=json
        SetEnvIfNoCase Content-Type "(xml)" REQUEST_TYPE=xml
     
        SetEnvIf dummy .* REQUEST_LANG=en
        SetEnvIfNoCase Accept-Language "(fr)" REQUEST_LANG=fr
        SetEnvIfNoCase Accept-Language "(es)" REQUEST_LANG=es
        SetEnvIfNoCase Accept-Language "(de)" REQUEST_LANG=de
     
        RewriteRule ^/v[0-9]/lodgings/([0-9])$ /api_cache/0/0/0/0/0/0/$1/lodgings/%{ENV:REQUEST_LANG}/$1.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])$ /api_cache/0/0/0/0/0/$1/$1$2/lodgings/%{ENV:REQUEST_LANG}/$1$2.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])$ /api_cache/0/0/0/0/$1/$2/$1$2$3/lodgings/%{ENV:REQUEST_LANG}/$1$2$3.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])$ /api_cache/0/0/0/$1/$2/$3/$1$2$3$4/lodgings/%{ENV:REQUEST_LANG}/$1$2$3$4.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9])$ /api_cache/0/0/$1/$2/$3/$4/$1$2$3$4$5/lodgings/%{ENV:REQUEST_LANG}/$1$2$3$4$5.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])$ /api_cache/0/$1/$2/$3/$4/$5/$1$2$3$4$5$6/lodgings/%{ENV:REQUEST_LANG}/$1$2$3$4$5$6.%{ENV:REQUEST_TYPE} [L]
        RewriteRule ^/v[0-9]/lodgings/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])$ /api_cache/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7/lodgings/%{ENV:REQUEST_LANG}/$1$2$3$4$5$6$7.%{ENV:REQUEST_TYPE} [L]
    Donc je récapitule pour enlever les fausses croyances !
    D'après ce que j'ai pu tester, il apparait que SetEnvIf / SetEnvIfNoCase s'utilisent pour matcher une condition (regex possible) selon laquelle on va affecter à une variable (pas forcément système ou apache, mais aussi que l'on vient d'inventer) une valeur qui peut soit faire parti du regex ou bien écrite en dur comme dans mon cas.

    *Notez que les "SetEnvIf dummy ......" ne sont la que pour établir des valeurs par défaut car parfois certains navigateurs ne retournent pas de header "Content-Type" donc, je n'avais pas de valeur, or par défaut il me faut du json.

    Voila Happy coding à tous et merry Xmas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation de variables dans une Expression régulière
    Par Bonjovi51 dans le forum Langage
    Réponses: 4
    Dernier message: 13/03/2008, 11h19
  2. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  3. [SQL] Utilisation de variables dans une requête SQL
    Par heteroclite dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/09/2006, 22h38
  4. [SQL] Utilisation de variables dans une requête SQL
    Par heteroclite dans le forum Langage
    Réponses: 8
    Dernier message: 07/09/2006, 22h38
  5. utilisation de variable dans une requete
    Par JUSTIN Loïc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/07/2006, 08h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo