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 :

[.htaccess] Hériter des règles de ré-écriture du niveau supérieur


Sujet :

Apache

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut [.htaccess] Hériter des règles de ré-écriture du niveau supérieur
    Bonjour,

    Il me semble qu'il n'y pas possible de faire d'include avec les .htaccess

    Est-il néanmoins possible d'hériter des règles de ré-écriture du niveau supérieur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    /example/.htaccess
    /example/2/.htaccess
    Concrètement, que le .htaccess du répertoire 2 hérite des règles du répertoire example ?

    Utile notamment pour des règles génériques telle que "supprimer la page index de l'URL".

    Merci

  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
    Par défaut
    Ben, dans le .htaccess parent, tu écris une règle suffisamment générique pour retirer le index.php de toutes les pages, quelles qu'elles soient, et comme ça rien à mettre dans les .htaccess des sous-répertoires

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Ca ne marche pas justement, le .htaccess du niveau inférieur annule les règles du niveau supérieur. Non ?

    J'ai des règles "métier" qui sont spécifiques au sous-répertoire.

    Entre parenthèses l'index n'était qu'un exemple.

    À l'heure actuelle je copie et colle toutes ces lignes génériques dans le répertoires inférieurs. C'est assez lourd.

    Une solution, j'ai pensé à mettre les règles génériques coté code en PHP.

    En attendant je cherche une solution si elle existe.

  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
    Par défaut
    Tu as essayé d'ajouter "RewriteOptions inherit" dans le .htaccess enfant ?

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Oui mais sans succès et c'est qu'après coup que je me suis dit que de toute façon c'est hériter que je veux pas l'inverse.

  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
    Par défaut
    Citation Envoyé par dorian53 Voir le message
    Oui mais sans succès et c'est qu'après coup que je me suis dit que de toute façon c'est hériter que je veux pas l'inverse.
    Comprends pas : c'est le but de "RewriteOptions inherit" que de forcer l'héritage Quand je parle de .htaccess enfant, je parle du .htaccess des sous-répertoires (/example/2/.htaccess), pas de celui du répertoire parent (/example/.htaccess).

    Si ça ne marche pas, peux-tu nous donner les règles de tous tes .htaccess ?

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Autant pour moi, merci _Mac_, de plus ce n'est pas la première fois que l'on échange sur un sujet.

    Je m'en suis en effet sorti avec des RewriteOptions inherit et RewriteBase.

  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
    Par défaut
    Pas de souci

  9. #9
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Et mince, j'ai l'impression que j'en reviens au même problème que sur ce sujet.
    http://www.developpez.net/forums/d67...fichier-index/

    Je veux :
    1/ que tous les appels de page avec index.php soit redirigé vers la racine du dossier (exemple/index.php -> exemple/)
    2/ que tous les appels sans extension et sans slash final soient redirigés vers la racine du dossier (exemple -> exemple/)

    A ce niveau cela semble fonctionner (voir .htaccess à la racine ci-dessous).

    Maintenant pour que ces règles soient appliquées partout, je fais un RewriteOptions inherit dans les .htaccess des répertoires enfants (sachant que les règles héritées s'exécutent après les règles du répertoire courant).

    Et enfin la règle qui pose problème :
    3/ je veux que tous mes appels soient redirigés en interne vers index.php qui gère les rewrites (voir .htaccess du répertoire enfant membre ci-dessous).



    .htaccess à la racine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    RewriteEngine on
    RewriteBase /
     
    # Redirige les URL sans slash à la fin
    RewriteCond %{REQUEST_URI} !\..+$
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1/ [R=301,L]
     
    # Redirige vers la page index.php
    RewriteCond %{REQUEST_URI} (.*)index\.php$
    RewriteRule .* %1 [R=301,L]
    .htaccess du répertoire enfant membre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RewriteEngine on
    RewriteOptions inherit
    RewriteBase /membre/
     
    RewriteCond %{REQUEST_URI} !index.php$
    RewriteRule .* index.php [L]
    Ca boucle.
    J'ai essayé plein de choses sans succès... j'espère que la problématique est correctement posée.
    Une idée ? Merci.

  10. #10
    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
    Par défaut
    C'est normal que ça boucle :
    • Tu demandes /membre/
    • Premier cycle de rewrite : dans le .htaccess de membre, la règle est activée car la condition est vérifier (/membre/ ne se termine pas par index*php), donc on rajoute index.php : /membre/index.php. Fin du premier cycle
    • Second cycle : /membre/index.php vérifie les règles du fichier .htaccess parent, donc redirection du navigateur sur /membre/. Fin du second cycle et redirection
    • Ton navigateur demande /membre/
    • etc.

    Ca marche tout ça, finalement : exactement comme c'est dit dans ta conf

    Trêve de moquerie : il faut faire en sorte que mod_rewrite sache faire la différence entre les demandes sur index.php venant des navigateurs et les demandes sur index.php issues d'une redirection faite par lui-même. Pour cela, il faut ajouter un paramètre d'URL fictif (par exemple internal_redirect=1) que tu vérifies dans le .htaccess parent :
    .htaccess parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    RewriteEngine on
    RewriteBase /
    
    # Redirige les URL sans slash à la fin
    RewriteCond %{REQUEST_URI} !\..+$
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1/ [R=301,L]
    
    # Redirige vers la page index.php
    RewriteCond %{QUERY_STRING} !internal_redirect=1
    RewriteCond %{REQUEST_URI} (.*)index\.php$
    RewriteRule .* %1 [R=301,L]
    .htaccess de membre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RewriteEngine on
    RewriteOptions inherit
    RewriteBase /membre/
    
    RewriteCond %{REQUEST_URI} !index.php$
    RewriteRule .* index.php?internal_redirect=1 [QSA,L]

  11. #11
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Comment peut-il y avoir un second cycle puisque la règle du .htaccess de membre à [L] ?

    Merci.

  12. #12
    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
    Par défaut
    Citation Envoyé par dorian53 Voir le message
    Comment peut-il y avoir un second cycle puisque la règle du .htaccess de membre à [L] ?
    Je t'invite à relire la discussion que tu as indiquée 2 posts plus haut, notamment ma première réponse.

  13. #13
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Exact merci, autre point.

    Tel que c'est là, si on veut accéder à

    /membre/example1/example2

    Le slash final n'est pas rajouté parce que c'est capturé dans la règle de /membre/


    Je suis obligé de ré-écrire les règles inverses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    RewriteEngine on
    RewriteOptions inherit
    RewriteBase /membre/
     
    RewriteCond %{REQUEST_URI} !index.php$
    RewriteCond %{REQUEST_URI} \..+$ [OR]
    RewriteCond %{REQUEST_URI} /$
    RewriteRule .* index.php?internal_redirect=1 [QSA,L]
    Je ne trouve vraiment pas ça pratique bien que cela fonctionne.

  14. #14
    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
    Par défaut
    C'est logique car comme les règles du sous-répertoire sont appliquées en premier, après le premier cycle, on se retrouve avec l'URL /membre/index.php?internal_redirect=1 qui ne valide pas les conditions pour rajouter le / à la fin. Tu as fait exactement ce qu'il faut faire, pas de problème en fait.

  15. #15
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Dans le but de tester, saurais-tu m'expliquer pourquoi cette solution ne fonctionne pas ?

    J'ai ajouté RewriteCond %{IS_SUBREQ} false afin d'éviter de boucler sur les cycles suivants mais ça ne fonctionne pas ?

    Saurais-tu m'expliquer quel est vraiment le rôle de cette condition.

    Merci.


    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
    RewriteEngine on
    RewriteBase /
     
    #RewriteCond %{HTTP_HOST} !^www\.yepla\.com [NC]
    #RewriteRule (.*) http://www.yepla.com/$1 [R=301,L]
     
    # Redirige les URL sans slash à la fin
    RewriteCond %{REQUEST_URI} !\..+$
    RewriteCond %{REQUEST_URI} !/$
    RewriteRule (.*) $1/ [R=301,L]
     
    # Redirige vers la page index.php
    RewriteCond %{IS_SUBREQ} false
    RewriteCond %{REQUEST_URI} (.*)index\.php$
    RewriteRule .* %1 [R=301,L]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    RewriteEngine on
    RewriteOptions inherit
    RewriteBase /membre/
     
    RewriteCond %{REQUEST_URI} !index.php$
    RewriteCond %{REQUEST_URI} \..+$ [OR]
    RewriteCond %{REQUEST_URI} /$
    RewriteRule .* index.php [L]

  16. #16
    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
    Par défaut
    La doc Apache n'est pas forcément claire sur le sujet mais une sous-requête est une requête issue d'un autre module (mod_alias par exemple). Un cycle de réécriture n'est pas une sous-requête.

  17. #17
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Ok merci.

    J'en reste avec la première solution.

    À plus tard

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

Discussions similaires

  1. Liste des règles à respecter
    Par Community Management dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/02/2013, 23h19
  2. [IMPORTANT] Rappel des règles
    Par Community Management dans le forum C++
    Réponses: 4
    Dernier message: 12/12/2006, 00h11
  3. [IMPORTANT] Rappel des règles
    Par Geronimo dans le forum Outils pour C & C++
    Réponses: 3
    Dernier message: 21/08/2005, 10h05

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