Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Serveurs (Apache, IIS,...) > Apache
Apache Forum d'entraide Apache. Avant de poster : Cours Apache, FAQ Apache
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2012, 16h33   #1
Membre éclairé
 
Avatar de titouille
 
Inscription : juin 2005
Messages : 342
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Suisse

Informations forums :
Inscription : juin 2005
Messages : 342
Points : 311
Points : 311
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
titouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 18h31   #2
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 302
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 302
Points : 8 587
Points : 8 587
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
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 21h54   #3
Membre éclairé
 
Avatar de titouille
 
Inscription : juin 2005
Messages : 342
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Suisse

Informations forums :
Inscription : juin 2005
Messages : 342
Points : 311
Points : 311
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 :
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
titouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 21h47   #4
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 302
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 302
Points : 8 587
Points : 8 587
-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
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h43   #5
Membre éclairé
 
Avatar de titouille
 
Inscription : juin 2005
Messages : 342
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Suisse

Informations forums :
Inscription : juin 2005
Messages : 342
Points : 311
Points : 311
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 :
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 :
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 ;-)
titouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 13h52   #6
Membre éclairé
 
Avatar de titouille
 
Inscription : juin 2005
Messages : 342
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Suisse

Informations forums :
Inscription : juin 2005
Messages : 342
Points : 311
Points : 311
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 :
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
titouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 21h38   #7
Rédacteur/Modérateur
 
Avatar de _Mac_
 
Inscription : août 2005
Messages : 8 302
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 8 302
Points : 8 587
Points : 8 587
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
_Mac_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 10h41   #8
Membre éclairé
 
Avatar de titouille
 
Inscription : juin 2005
Messages : 342
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Suisse

Informations forums :
Inscription : juin 2005
Messages : 342
Points : 311
Points : 311
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 !!
titouille est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h12.


 
 
 
 
Partenaires

Hébergement Web