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 :

Problème avec mod_rewrite sur une redirection des requêtes PUT


Sujet :

Apache

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 23
    Par défaut Problème avec mod_rewrite sur une redirection des requêtes PUT
    Bonjour,

    J'ai depuis plusieurs jours un problème que je n'arrive pas à résoudre avec modRewrite.
    J'ai simplifié il y a 1 semaine les URL de mon site web en suppriment un niveau (on accède plus au site via www.monsite.com/bla/start mais directement via www.monsite.com/start). Je redirige les utilisateurs utilisant les anciens URL via un RedirectMatch 301.
    Cependant des acteurs externes upload des fichiers sur mon serveur via la requête HTTP PUT et ils ne supportent pas la redirection via un statut 301 et ne peuvent pas modifier les URL avant un long moment.

    J'ai donc essayé d'utiliser mod_rewrite pour pouvoir continuer à recevoir les fichiers mais sans succès...

    J'ai déjà posé ma question sur StackOverflow mais je n'ai toujours pas résolu mon problème.

    Voici l'URL pour avoir plus de détail sur le problème et sur mes tests :
    http://stackoverflow.com/questions/2...or-put-request


    Cela serait super si quelqu'un pouvait me donner quelques pistes à essayé. J'ai déjà fait le tour des docs du mod rewrite de Apache sans succes...

    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
    Le comportement observé est parfaitement normal et même attendu : la spec HTTP ne dit rien de précis en ce qui concerne le comportement d'un navigateur (quel qu'il soit) s'il reçoit une réponse de redirection sur un POST ou PUT, tout simplement parce que le navigateur, avec une demande de redirection, de savoir si la redirection est le résultat normal de sa requête POST ou PUT ou si c'est une erreur. Les navigateurs qui reçoivent une réponse 301 ou 302 sur un POST ou un PUT font donc un GET comme requête suivante.

    Ton problème peut être corrigé avec mod_rewrite de la manière suivante : on ne redirige sur les URL sans le bla pour les requêtes qui ne sont pas des PUT. Cette règle remplace le RedirectMatch. Mais avant de donner la solution complète, il me manque un élément : quand tu dis que tu as simplifié les URL, c'est parce que le répertoire bla n'existe plus où bien c'est parce que tu as une RewriteRule qui rajoute le /bla manquant ?

  3. #3
    Membre averti
    Inscrit en
    Février 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 23
    Par défaut
    Salut,

    Le répertoire bla existe toujours dans le serveur. J'ai fait une migration de serveur et le serveur host maintenant plus que 1 seul site. C'est pourquoi je souhaitais faire la simplification sans pour autant changer la structure de fichier sur le serveur.

    Le répertoire "bla" correspond au repertoire "test" sur ma question sur StackOverflow.

    J'ai déjà commencé à faire des essais avec mod_rewrite (comme tu peux le voir sur StackOverflow) mais pour l'instant sans succès. Je suis en effet passé d'une status 301 à une erreur 404...

    Merci pour ton aide!

  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
    Si je reprends la conf que tu donnes sur stackoverflow, il faut mettre ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    RewriteEngine on
     
    # Redirection si on vient avec /bla... et que ce n'est pas une requete PUT
    # Remplace le RedirectMatch
    RewriteCond %{REQUEST_METHOD} !PUT
    RewriteCond %{REQUEST_URI} ^/bla
    RewriteCond %{QUERY_STRING} !internal_redirect=1
    RewriteRule ^/bla/?(.*) /$1 [R=301,L]
     
    # Reecriture sur /bla
    RewriteCond %{REQUEST_URI} !^/bla
    RewriteRule (.*) /bla$1?internal_redirect=1 [QSA,L]
    Dans ce cas, s'il y a une requête PUT, l'ancienne URL en /bla continuera de fonctionner. A TESTER.

  5. #5
    Membre averti
    Inscrit en
    Février 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 23
    Par défaut
    Merci beaucoup!

    Je vais tester cela.
    Je ne comprend pas bien à quoi correspond les lignes avec "internal_redirect".

    Pourrais tu m'éclairer?

  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
    Ben je pense que si on ne met pas un truc pour faire la différence entre les requêtes sur /bla venant d'un navigateur et venant d'une réécriture interne, toutes tes pages vont partir en redirection infinie. Il faut savoir que ce n'est pas parce qu'on met un [L] que mod_rewrite arrête son boulot : il rejoue n fois (n = 10 au maximum par défaut) les règles jusqu'à aboutir à une URL qui n'est plus réécrite. Donc si tu demandes /toto, par exemple, la première règle n'est pas activée car ça ne commence pas par /bla et la seconde est activée car justement ça commence pas par /bla. On obtient donc /bla/toto. Maintenant, on recommence la bazar avec ce /bla/toto. Si on n'a pas pris soin de mettre le internal_redirect=1, la première va être activée. En effet, ce n'est pas une requête PUT, l'URL commence par /bla et elle n'a pas l'internal_redirect par hypothèse. Résultat : redirection du navigateur. CQFD. Pour t'amuser et vérifier le raisonnement, tu peux retirer le internal_redirect de la seconde règle. Et n'oublie pas de vider le cache du navigateur après tes tests

Discussions similaires

  1. [MySQL] [MySQL] Problème d'update sur une redirection
    Par Boons49 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 09/03/2009, 15h16
  2. Problème avec coun(*) sur une requête
    Par Kaoru-tabris dans le forum Requêtes
    Réponses: 1
    Dernier message: 10/03/2007, 15h00
  3. [CSS] Problème avec cadre sur une image lien
    Par Strix dans le forum Mise en page CSS
    Réponses: 7
    Dernier message: 24/12/2006, 10h09
  4. Problème export excel sur une requete avec critère
    Par eddyG dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 20/09/2006, 11h46
  5. Problème avec DBI sur une bd access
    Par tfdarklink dans le forum SGBD
    Réponses: 2
    Dernier message: 01/08/2006, 19h08

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