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 :

[URL REWRITING] Incohérence avec le fichier index ? [Fait]


Sujet :

Apache

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut [URL REWRITING] Incohérence avec le fichier index ?
    Bonjour,

    Pourquoi cette règle fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule (.*)index\.php$ /$1 [R=301,L]
    www.example.com/index.php renvoie vers www.example.com
    C'est à dire que si www.example.com est appelé Apache passe outre cette règle.


    En revanche, si l'on écrit la règle suivante pour capturer tout ce qui pourrait exister comme appel de page ou de dossier.
    Apache plante avec Internal Server Error.
    Parce qu'il doit tourner en boucle étant donné que la redirection vers / appelle pour lui index.php


    Hors si index.php semble être appelé dans ce cas, pourquoi le 1er exemple ne tourne pas en boucle non plus ?

    J'espère avoir été suffisamment clair.

    Ou est la logique ?

    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
    Parce que dans le premier cas (RewriteRule (.*)index\.php$ ...) la règle est explicite pour index.php (index.php apparaît dans l'URL), alors qu'un simple "/repertoire/" appelle bien index.php (grâce à la directive DirectoryIndex) mais ça ne se voit pas dans l'URL.

    Pourquoi ça part en boucle ? Parce que mod_rewrite rejoue N fois les règles de réécriture jusqu'à converger vers une URL qui n'est pas réécrite. Contrairement à ce qu'on croit, [L] va arrêter le cycle de réécriture en cours mais pas le cycle complet. Si on applique ce fonctionnement pour chacune des deux règles que tu donnes :
    • Dans ton premier cas (index.php explicite), tu retires index.php de l'URL. Le résultat de cette réécriture est réinjecté dans mod_rewrite, mais comme aucun RewriteRule n'est activé (pas d'index.php dans l'URL), mod_rewrite est content, il a une URL qui n'a pas bougé donc il s'arrête là.
    • Ta seconde règle matche pour n'importe quoi, y compris le résultat de la première RewriteRule mais aussi et surtout pour son propre résultat. La boucle ne vient pas d'index.php mais du fait que le filtre (.+) est trop large et matche pour son propre résultat.

    Il faut donc que tu rajoutes un RewriteCond ou que tu précises davantage ton second RewriteRule pour faire en sorte que la seconde règle ne s'applique plus passé un moment et donc sortir de la boucle.

  3. #3
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Salut et merci pour ta réponse, oui la solution je l'ai avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{REQUEST_FILENAME} !index.php
    Mais donc qu'est-ce qui est capturé dans le (.+), c'est bien index.php puisque le RewriteCond permet de solutionner le problème ?

    C'est là que je ne comprends pas.

  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
    C'est possible mais si tu mets la règle avec index.php avant celle de .+, c'est peu probable. Pour le savoir, tu peux tenter des trucs du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule (.+) /?rewrite=$1 [R=302,L]
    Ca va faire une redirection navigateur, donc arrêter totalement le cycle de rewrite, et tu verras le résultat dans la barre d'URL.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Voici comment ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RewriteEngine on
     
    RewriteRule (.*)index\.php$ /membre/$1 [R=301,L]
     
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule .+ /membre/ [L]

    Mais ma question reste la même, si index.php semble être appelé dans la seconde règle, pourquoi la 1ere règle ne tourne pas en boucle non plus ?

    Merci

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    397
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 397
    Par défaut
    Merci de prendre de ton temps pour ces tests.
    On avance dans le raisonnement...

    Par contre maintenant, le problème de la question est déporté car...

    Citation Envoyé par dorian53 Voir le message
    Et c'est à ce niveau qu'il ne faut pas me répondre qu'Apache appelle index.php sinon cf règle 1.
    La règle 1 est la suivante :
    Citation Envoyé par dorian53 Voir le message
    Bonjour,

    Pourquoi cette règle fonctionne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule (.*)index\.php$ /$1 [R=301,L]

    Pourquoi cette règle ne tourne pas en boucle quand elles sont mises toutes les 2 ?
    Citation Envoyé par dorian53 Voir le message
    Voici comment ça fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    RewriteEngine on
     
    RewriteRule (.*)index\.php$ /membre/$1 [R=301,L]
     
    RewriteCond %{REQUEST_FILENAME} !index.php
    RewriteRule .+ /membre/ [L]

    Mais ma question reste la même, si index.php semble être appelé dans la seconde règle, pourquoi la 1ere règle ne tourne pas en boucle non plus ?

    Merci

Discussions similaires

  1. [URL rewriting] Condition avec existence de fichier
    Par Fullvisite dans le forum Apache
    Réponses: 3
    Dernier message: 29/05/2010, 21h17
  2. Réponses: 2
    Dernier message: 13/12/2007, 14h45
  3. [URL Rewriting] Problème avec un paramètre
    Par antitrust56 dans le forum Apache
    Réponses: 11
    Dernier message: 07/11/2007, 18h40
  4. Réponses: 3
    Dernier message: 31/07/2007, 16h40
  5. [URL Rewriting] problème avec sous domaine
    Par Booyakha dans le forum Apache
    Réponses: 1
    Dernier message: 31/07/2007, 16h31

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