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 :

mod_rewrite et redirections "conditionnelles"


Sujet :

Apache

  1. #1
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut mod_rewrite et redirections "conditionnelles"
    Bonjour à tous !!

    J'ai une question assez complexe, tout du moins pour mon piètre niveau avec les regex et les redirections...

    Tout d'abord, les bases :

    Je travaille depuis plus d'une année sur un site qui se veut "communautaire". Ce site gère différents types d'utilisateurs. J'ai des marques, des associations, des magasins, des médias et des utilisateurs standards. Chacun de ces rôles peut être décliné en "sous-rôles" dont certains ont des espaces bien particuliers. Le site a été profondément modifié il y a de celà un mois, pour simplifier certains éléments.

    La première chose à savoir est la suivante :

    marques et associations ont leur espace via une url du type : {nom}/*
    les autres roles ont leur espace via une url du type : {identifiant-unique}/{nom}/*

    exemples :
    • la homepage de la marque "the brand" sera accessible via /the-brand/home
    • la homepage de l'association "the assoc" sera accessible via /the-assoc/home
    • la homepage du média "the media" sera accessible via /1044/the-media/home, sachant que 1044 est l'identifiant unique du média sus-cité.


    Je vais illustrer mon problème avec les marques, mais je peux le retrouver avec d'autres rôles utilisateurs. Dans le système, j'ai des marques qui sont "partenaires", et d'autres qui ne le sont pas (idem pour les associations, médias et magasins).

    Une marque "partenaire" possède un espace avec plusieurs pages :

    /home
    /profile
    /history
    /official-products
    /community-products
    /network
    /...

    Une marque non-partenaire, quant à elle, ne possède qu'une seule page :

    /home



    Le souci est le suivant : L'ancien site autorisait plusieurs pages pour les acteurs non-partenaires, exemple :

    /home
    /profile
    /official-products
    /community-products


    Aujourd'hui, la page de profil a été supprimée, les produits officiels et communautaires également, et tout se retrouve sur la page /home, qui affiche les différentes données.

    Ce que j'aimerai, c'est pouvoir faire des redirections pour les pages qui n'existent plus. Malheureusement, j'imagine que je ne peux pas faire une simple redirection du genre (pseudo code, hein... chuis une brèle en regex...) :

    /[a-zA-Z0-9]/profile => /{$1}/home

    Puisque les marques partenaires possèdent toujours une page /profile... Si je fais ça, lorsque je voudrais aller voir le profil d'une marque partenaire, je serais automatiquement redirigé vers sa page d'accueil, et bien entendu son profil ne sera plus jamais accessible...

    Toutes ces explications pour en arriver à la grande question que je me pose... :

    Est-ce qu'il est possible de poser une condition pour dire :

    si /{name}/profile n'existe pas, alors redirection vers /{name}/home, sinon on ne change rien.


    En gros :

    • si la page "/ma-marque-partenaire/profile" existe alors on ne fait rien
    • sinon si la page "/ma-marque-non-partenaire/profile" n'existe pas alors on redirige vers "/ma-marque-non-partenaire/home"


    Oui, ça fait bcp d'explication pour pas grand chose, mais je préfère que ça soit bien clair... J'ai trouvé un petit bout de code qui utilisait 2 RewriteCond dont une avec un argument -U qui semble dire "si l'url existe" et à priori, ça ressemblerai à ce que je veux, mais par contre je ne sais pas trop comment écrire les règles nécessaires car les regex, c'est vraiment pas mon fort

    Un petit coup de pouce serait donc vraiment bienvenu. En vous remerciant d'avance d'avoir pris la peine de me lire jusqu'au bout :-)


    Cordialement.

    Thierry

  2. #2
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    J'imagine qu'en fait que quand tu dis "la page xxx existe", il n'existe aucun fichier qui s'appelle xxx, que c'est un CMS ou ton programme qui va chercher des trucs en base de données etc. Et si c'est bien ça, ben c'est juste pas possible avec Apache. Apache ne peut vérifier que la présence de fichiers ou de répertoires et donc s'il n'y en a pas, Apache ne peut rien faire. Il faut gérer ça dans ton appli.

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  3. #3
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Salut _Mac_ et merci pour ta réponse.

    Je ne sais pas si c'est exactement ça...
    Je vais essayer de donner un peu plus d'informations. Tout d'abord, j'utilise Drupal, donc oui, ça tourne bien avec un CMS.

    Drupal possède un mécanisme de réécriture automatique des URL's, qui va transformer des urls du type index.php?q=node/55 en /node/55. ça s'appelle "clean url's".

    Ensuite, un module nommé "path" (en relation avec un second module nommé "pathauto" permet quant à lui de réécrire proprement les urls :

    de "/node/55", je vais par exemple passer à "/content/le-titre-de-mon-node-ayant-pour-id-55".

    Maintenant, je parles bien d'URL's et non de fichiers. Pour prendre un autre exemple, une marque partenaire possède une homepage ayant pour "clean url" /user/{user-id}/dashboard. Cette clean url est transformée en {nom-de-la-marque}/home.

    Une marque non partenaire ne possède pas de homepage de type "dashboard", je fais simplement en sorte de remplacer /user/{user-id}/view (la page de profil utilisateur dans drupal) par /{nom-de-la-marque}/home


    Donc selon si je suis une marque partenaire ou non, l'utilisateur est redirigé soit vers la page de profil utilisateur standard (non partenaire), soit vers une page spéciale implémentée par un module particulier (partenaire).


    Maintenant, il m'avais semblé qu'en utilisant l'argument -U, il contrôlait bien si une URL existait, pas un fichier (argument -F, vu dans la doc apache ici : http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html).


    Donc au final, je ne sais pas vraiment si mes redirections sont possibles ou pas...

    Voici les règles inclues dans le fichier .htaccess situé à la racine, qui permettent de réécrire façon "clean url" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      # Rewrite URLs of the form 'x' to the form 'index.php?q=x'.
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_URI} !=/favicon.ico
      RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    Alors maintenant, la question serait : est-ce qu'il serait nécessaire que je travaille sur les urls "non clean", c'est à dire sur le format index.php?q=x/y/z ?

    Ou bien est-il possible de rajouter des règles "après" les premières et ça pourrait le faire ?? La gestion des redirections est un domaine que je ne maîtrise pas, peut-être que mes questions semblent basiques mais malheureusement ça reste très obscur pour moi...


    En tout cas, merci pour ta réponse, même si elle à tendance à m'enfoncer :p

  4. #4
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    -U ou pas, URL clean ou pas, ça ne change rien car seul Drupal sait réellement si l'URL existe ou pas. Le -U et le -F s'appuient sur la configuration d'Apache pour savoir si une URL existe. Dans ton cas, la réponse est toujours "oui" car pour Apache toutes les URL mènent à Drupal. Je persiste donc à dire qu'il faut gérer ça dans l'appli (Drupal).

    Tu as regardé si un module Drupal comme path_redirect ferait l'affaire ?

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  5. #5
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Salut _Mac_ !

    Merci pour ta réponse. Je commence à bien comprendre ou se situe le problème... J'avais déjà jeté un oeil sur le module path_redirect mais ce dernier m'impose un autre problème...

    Premièrement, j'ai plus de 3000 utilisateurs dans ma base de données... Si on multiplie ça par le nombre de pages à rediriger (selon le rôle utilisateur) je vais me trouver avec des dizaines de milliers de redirections... J'ai un peu peur qu'en terme de performance, ça se ressente...

    Deuxièmement, même si je mets en place une routine permettant de générer automatiquement toutes les redirections nécessaires, le vrai souci va se trouver lorsqu'un utilisateur va changer de statut (de non-partenaire, je le passe à partenaire). Je vais devoir aller supprimer les redirections pour cet utilisateur en particulier. Et bien entendu, ce n'est pas moi qui m'occupe de ce genre de détail (changement de statut) mais un des employés de la boîte pour laquelle je travaille. Et ce dernier n'y comprend rien à rien en terme de configuration, codage, etc... Il fait juste de la gestion de contenu. ça implique rapidement une source d'erreur assez problématique. Car d'un utilisateur non partenaire dont on redirige /profile vers /home, on passe à un utilisateur partenaire qui possède bien une page /profile. Et la redirection continuera surement à être effective tant que je ne serai pas passé derrière lui pour supprimer celles qui ne sont plus nécessaires pour cet utilisateur particulier.

    Par contre, il semblerai que les redirections soient possible (au vu de ce que j'ai pu lire ici : http://drupal.org/node/16084). Et si j'essaye d'accéder à une page innexistante, je me retrouve bien avec une erreur 404. Mais il me manque surtout la syntaxe pour pouvoir tester, et c'est là que j'y comprends vraiment rien.


    Je prends un exemple simple :

    /ma-marque/profile => /ma-marque/home, mais uniquement si /ma-marque/profile n'existe pas...

    Voilà ce que j'aurai tendance à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteCond ^(a-zA-Z0-9)/profile$ !-U
    RewriteRule ^(.*)$ http://www.mon-site.com/$1/home [R=301,L]
    Mais bon... J'imagine que tu vas rigoler en te disant "c'est quoi ce truc" :p Mais j'ai prévenu, les regex et moi, on n'est vraiment pas copains...


    Bon bon bon... Je viens d'essayer ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule ^mamarque/profile$ http://www.site.com/mamarque/home [R=301,L]
    Et ça a fonctionné... J'en déduis donc que c'est peut-être possible... Me manque toujours la syntaxe qui me permettrai de généraliser le concept, malheureusement... Je vais continuer mes tests. J'ai l'impression que c'est déjà une avancée ;-)

  6. #6
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Bon, ben j'ai l'impression que c'est le test !-U qui ne passe pas...

    J'ai fais différentes tentatives de ce genre :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    RewriteCond ^/mamarque/profile$ !-U
    RewriteRule . http://www.site.com/mamarque/home [R=301,L]

    Mais ça ne passe jamais, que je teste avec une marque qui possède une page profil ou non... J'espérais que ça serait ok, mais soit ma syntaxe est mauvaise, soit ça bloque pour les raisons que tu as cité...

    Pourtant si je vais sur la page de profil d'une marque qui n'en possède pas, j'ai bien une erreur 404...

    Je ne désespère pas totalement... J'ai également posé la question sur les forums drupal.org. On verra bien...

    En tout cas, merci d'avoir pris le temps de me répondre ;-)

    a++


    Thierry

  7. #7
    Rédacteur
    Avatar de _Mac_
    Profil pro
    Inscrit en
    Août 2005
    Messages
    9 601
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 9 601
    Points : 12 977
    Points
    12 977
    Par défaut
    Pourquoi ne pas écrire ton propre module ? Car j'ai l'impression que ton besoin est très spécifique surtout avec ton histoire de changement de statut et je persiste à dire que -U ne peut pas être utilisé (mais l'erreur est humaine, je peux me tromper).

    Du détail, du détail, du détail !!!
    Revenons à la source : lisons la documentation et les fichiers de trace, la réponse à notre problème s'y trouve sans doute

  8. #8
    Membre averti Avatar de titouille
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    353
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 353
    Points : 356
    Points
    356
    Par défaut
    Citation Envoyé par _Mac_ Voir le message
    Pourquoi ne pas écrire ton propre module ?
    C'est ce que j'ai fini par faire. ça m'embêtais un peu de le faire car ça rajoute encore une couche supplémentaire et il en a déjà bien assez, mais quand y a pas d'autres moyens, ben voilà... Au moins ça permet de gérer les cas vraiment spécifiques. Heureusement qu'il n'y en a pas trop car ça devient vite une prise de tête.

    Merci bien pour tes réponses à mes questions, à bientôt !!

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

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