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 :

rewriterule pour zapper un dossier


Sujet :

Apache

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut rewriterule pour zapper un dossier
    Salut,

    j'ai un site avec une archi du style :


    appli/
    -- model/
    -----model1.php
    -----model2.php
    -- module/
    -----module1/
    -------action1.php
    -------action2.php
    -------view/
    ---------action1.view.php
    ---------action2.view.php
    -----module2/
    -------action1.php
    -------action2.php
    -------view/
    ---------action1.view.php
    ---------action2.view.php
    public/
    -- index.php

    a la base ca marche donc comme ca :
    site.com/dir/public/index.php?module=module1&action=action1

    grace a quelques regles de rewriting dans un .htaccess a la racine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule public/(\w+)/(\w+)$					public/index.php?module=$1&action=$2 [L]
    si je vais sur :
    www.site.com/dir/public/module1/action1

    ca marche parfaitement

    cependant j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule dir/(\w+)/(\w+)$					public/index.php?module=$1&action=$2 [L]
    pour avoir :
    www.site.com/dir/module1/action1
    (pour zapper le /public/)
    Mais ca ne marche pas. Sauriez vous me dire comment je dois m'y prendre svp?

    ps: je suis sur un serveur mutualisé

  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
    "ça ne marche pas" veut dire quoi ? Erreur 404 ? Erreur 500 ?

    Ta règle qui ne marche pas, tu l'as mise dans un .htaccess qui se trouve dans quel répertoire ?

    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 du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut
    La regle je l'ai mise dans le meme .htaccess donc dans dir/

    en fait en physique j'ai :
    www/dir/

    et dans dir/ j'ai l'arbo que j'ai donné au dessus :

    appli/
    -- model/
    -----model1.php
    -----model2.php
    -- module/
    -----module1/
    -------action1.php
    -------action2.php
    -------view/
    ---------action1.view.php
    ---------action2.view.php
    -----module2/
    -------action1.php
    -------action2.php
    -------view/
    ---------action1.view.php
    ---------action2.view.php
    public/
    -- index.php


    Donc mon .htaccess est dans www/dir/.htaccess

    La regle "ne marche pas" car si je vais sur www.site.com/dir/module1/action1 j'ai une erreur 404 (not found).

    J'ai essayé en modifiant les regles comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    RewriteRule /(\w+)/(\w+)/(\d+)$ public/index.php?module=$1action=$2&id=$3 [L]
    RewriteRule /(\w+)/(\w+)/(\w+)$ public/index.php?module=$1&action=$2user=$3 [L]
    RewriteRule /(\w+)/(\w+)$	public/index.php?module=$1&action=$2 [L]
    RewriteRule /(\w+)$	public/index.php?module=pages&action=$1 [L]
    et si je tape
    www.site.com/dir/nimporteKelModule/action1

    il me renvoit sur ma page d'accueil home.php (par defaut si il ne trouve pas le module et l'action).

    ca signifie qu'il trouve bien ma page d'index.php à /dir/public/index.php.

    En modifiant home.php j'affiche $_GET[] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [module] => pages [action] => action1)
    Donc je ne sais pas pour quel raison il utilise la regle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule /(\w+)$	public/index.php?module=pages&action=$1 [L]
    Plutot que la regle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule /(\w+)/(\w+)$	public/index.php?module=$1&action=$2 [L]
    dont il ne tiens pas compte (meme si je ne met que cette règle là) .

    C'est comme si il lancait la regex uniquement sur le dernier element.

    et si j'essai de mettre comme regle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule dir/(\w+)/(\w+)$  public/index.php?module=$1&action=$2 [L]
    RewriteRule dir/(\w+)$	  public/index.php?module=pages&action=$1 [L]
    la j'ai une erreure 404..


    Il faudrait que je puisse réglé le debut de du motif de recherche de la regex sur dir/, pour le moment ca commence sur dir/dir+1/

  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
    Le problème c'est simplement que si le .htaccess est dans le répertoire dir, tu n'as besoin de mettre dir dans le pattern des RewriteRule. Essaie simplement avec ceci, ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule (\w+)/(\w+)$  public/index.php?module=$1&action=$2 [L]
    RewriteRule (\w+)$	  public/index.php?module=pages&action=$1 [L]

    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 du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut
    Helas non j'ai deja essayé ca et ca ne marche pas mieux.
    Si je fais ca il m'affiche encore une fois la page home.php et $_GET donne :
    Array ( [module] => pages [action] => php )

    pour une requete :
    www.site.com/dir/module1/action1
    donc encore une fois il utilise la meme regle et la il me sort php comme action de je sais pas ou...

    les regles:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule (\w+)/(\w+)$				public/index.php?module=$1&action=$2 [L]
    RewriteRule (\w+)$						public/index.php?module=pages&action=$1 [L]

  6. #6
    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
    Il sort le php de la réécriture du résultat de la première règle : si tu passes public/index.php?module=module1&action=action1 à la moulinette de tes deux règles, ça matche sur la deuxième règle car ton pattern précise seulement "request uri qui se termine par un mot" : php étant le dernier mot de public/index.php, ça passe et crack, php.

    En rajoutant un ^ devant tes patterns, ça devrait aller mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule ^(\w+)/(\w+)$				public/index.php?module=$1&action=$2 [L]
    RewriteRule ^(\w+)$						public/index.php?module=pages&action=$1 [L]

    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

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut
    Ok alors avec l'accent circonflexe www.site.com/dir/module1/action1 marche bien!

    Serait il possible que tu details un peu? j'ai un peu de mal a saisir

    pour :
    www.site.com/dir/module1/action1
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteRule (\w+)/(\w+)$				public/index.php?module=$1&action=$2 [L]
    RewriteRule (\w+)$						public/index.php?module=pages&action=$1 [L]
    tu veux dire que la regle 1 transforme l'url en :
    site.com/dir/public/index.php?module=module1&action=action1

    et que la regle 2 part de ce résultat et me prend le php??

    j'en conclu donc que les motifs ne tiennent pas compte des arguments (?bla=bla&bu=blu) et que mon [L] ne sert a rien puisque meme quand la premiere regle est appliquée la seconde l'est aussi! Tu me confirmes?

    Sinon le ^ j'ai un peux de mal a comprendre ce qu'il signifie et pourquoi il regle le probleme, je connais surtout les regex en php et ^ indique le début d'un mot je crois en php. Or là on est au milieu d'un url ?!

    Sinon pour faire pointer site.com/dir/ sur site.com/dir/public/, j'ai fais ca du coup :

    RewriteRule ^$ public/index.php [L]

    ca a l'air de marcher , est ce correct?

    je dois avouer que tout ca est assez obscure et meme avec la doc j'ai du mal!

    Merci infiniment pour ton aide en tous les cas mac!

  8. #8
    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
    Citation Envoyé par eilijah Voir le message
    tu veux dire que la regle 1 transforme l'url en :
    site.com/dir/public/index.php?module=module1&action=action1
    Oui

    Citation Envoyé par eilijah Voir le message
    et que la regle 2 part de ce résultat et me prend le php??
    Oui, mais parce que cette URL n'a pas matché la première règle. On ne le répètera jamais assez, le [L] n'arrête pas complètement la réécriture, mais uniquement le cycle de réécriture en cours. Apache exécute n fois les RewriteXxx jusqu'à ce qu'il tombe sur une URL qui ne peut plus être réécrite. Alors, dans ton cas, tu demandes /module1/action1 qui matche la première règle (\w+)/(\w+)$ (chemin d'URL se terminant par 2 mots séparés par un /) donc mod_rewrite réécrit cette URL en public/index.php?module=module1&action=action1. Le [L] fait qu'on arrête là cette première boucle de réécriture, mais on recommence la réécriture avec cette nouvelle URL public/index.php?module=module1&action=action1 qui se trouve matcher la seconde règle (\w+)$ (chemin d'URL se terminant par un mot : php). Le mot repéré par ce filtre est PHP d'où que finalement on a au final public/index.php?module=pages&action=php. Le [L] fait qu'on arrête le cycle mais on recommence une nouvelle fois. Là, par un heureux hasard, cette URL public/index.php?module=pages&action=php (le chemin en fait) se trouve matcher de nouveau la deuxième règle, donc on réécrit mais coup de chance, le résultat de la réécriture donne la même URL que celle utilisée au début de ce cycle : public/index.php?module=pages&action=php donc on s'arrête là.

    Citation Envoyé par eilijah Voir le message
    j'en conclu donc que les motifs ne tiennent pas compte des arguments (?bla=bla&bu=blu)
    Oui : sauf bidouille, un RewriteRule ne fonctionne que sur le chemin d'une URL, pas ses paramètres.

    Citation Envoyé par eilijah Voir le message
    et que mon [L] ne sert a rien puisque meme quand la premiere regle est appliquée la seconde l'est aussi! Tu me confirmes?
    Faux : le [L] arrête le cycle de réécriture courant mais pas la réécriture globale. Le résultat de la réécriture est utilisée pour commencer un autre cycle de réécriture et ce jusqu'à obtention d'une URL "immuable". Si on ne peut pas obtenir d'URL immuable, Apache lève une erreur.

    Citation Envoyé par eilijah Voir le message
    Sinon le ^ j'ai un peux de mal a comprendre ce qu'il signifie et pourquoi il regle le probleme, je connais surtout les regex en php et ^ indique le début d'un mot je crois en php. Or là on est au milieu d'un url ?!
    C'est la même chose qu'en PHP : c'est le marqueur de début de chaîne. Pourquoi ça règle le problème ? Tout simplement parce qu'on passe d'une règle "chemin se terminant par un mot" en "chemin étant un mot" et ça fait toute la différence. Alors quid du "dir/" qu'on a retiré ? Et bien tout simplement parce que le .htaccess se trouve dans le répertoire dir et que par conséquent le "dir/" fait implicitement parti de l'URL et donc est retiré par mod_rewrite des URL à réécrire. Si le .htaccess s'était retrouvé dans le répertoire parent, il aurait été nécessaire de mettre ce "dir/". Je ne sais pas si je suis bien clair, là

    Citation Envoyé par eilijah Voir le message
    Sinon pour faire pointer site.com/dir/ sur site.com/dir/public/, j'ai fais ca du coup :

    RewriteRule ^$ public/index.php [L]

    ca a l'air de marcher , est ce correct?
    Oui

    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

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 62
    Points
    62
    Par défaut
    Merci beaucoup mac, je pense avoir tout compris !

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

Discussions similaires

  1. Code pour verouiller un dossier sous Windows XP
    Par PHIL45 dans le forum Delphi
    Réponses: 2
    Dernier message: 26/12/2006, 13h01
  2. Probleme pour renommer un dossier
    Par blondelle dans le forum C++Builder
    Réponses: 3
    Dernier message: 14/09/2006, 23h07
  3. Script pour créer un dossier
    Par trihanhcie dans le forum Shell et commandes GNU
    Réponses: 8
    Dernier message: 23/08/2006, 17h14
  4. Probleme pour lister un dossier
    Par quentingsc dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 13/08/2006, 09h36
  5. Réponses: 2
    Dernier message: 20/01/2006, 17h08

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