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] Tester l'existence d'un fichier


Sujet :

Apache

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Points : 91
    Points
    91
    Par défaut [URL Rewriting] Tester l'existence d'un fichier
    Bonjour,

    je suis passé à l'URL Rewriting sur mon site.
    Celui-ci étant vieux (fin 90) j'ai évidemment des 10aines et des 10aines de liens morts qui nécessitent d'être supprimer.

    GWT m'en indique près de 200, certains n'ayant d'ailleurs jamais existé ce qui m'étonne.

    Pour mon URL RW, je me suis basé sur ce que faisait WordPress.
    J'ai donc un htaccess assez dépouillé de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # BEGIN WordPress
    <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php [L]
    </IfModule>
    # END WordPress
    Si j'ai bien compris, cela veut dire que si le fichier OU dossier avec son path complet existe physiquement, on les prends, sinon on appelle index.php à la racine du site.

    Ma question est donc, comment et où dois-je intercaler des conditions pour rediriger les pages mortes.
    Je pense que je dois faire des 301.

    Exemple d'URL :
    http://www.monsite.com/dossier/actua...r=3536&t=2&d=0
    Note : j'ai bcp de pages PHP, néanmoins, je ne peux pas les traiter en vrac car l'administration de mon site n'est pas URL RW. Par conséquent, si je traite les php en vrac (*.php sauf index.php) je vais au devant de grave désillusion

    Sur mon Mac, je me suis amusé à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php?q=%{REQUEST_FILENAME} [L]
    Je ne comprends pas ce que contient "q".
    Si http://www.monsite.com/dossier/actualites.php
    Alors q= /<monpath>/www/site/dossier
    Si http://www.monsite.com/dossier/toto/actualites.php
    Alors q= /<monpath>/www/site/dossier
    Alors q= /<monpath>/www/site/dossier aussi !

    Pour moi, et d'après le tuto sur ce site, ça devrait contenir tout le path jusqu'au non de fichier non ?


    Ceci dit, je cherche donc l'écriture pour faire :
    si <file>.php existe dans le répertoire proposé OU à la racine du site alors on le traite.
    sinon en "redirige" par /index.php

    J'ai pensé à tester REQUEST_URI avec une regex pour extraire le nom de fichier PHP mais c'est tellement dur à tester...

    Merci d'avance pour votre aide,
    cordialement

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 98
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    tout d'abord, désolé Mac pour le code. Je pensais l'avoir fait, faut croire que non.

    Sinon j'ai creusé le problème. J'avance mais je suis bloqué un poil plus loin.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    RewriteEngine On
    RewriteBase /
    RewriteRule ^index\.php$ - [L]
    RewriteCond %{REQUEST_URI} ([^/]*\.php)
    RewriteRule . /%1 [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.php?q=%{DOCUMENT_ROOT}__%{REQUEST_FILENAME}__%{REQUEST_URI} [L]
    J'ai intercalé la condition et la "rule" en gras.
    Elle signifie que si j'ai un fichier php dans mon URL, je redirige vers la racine.
    La capture fonctionne puisqu'en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule . /index.php?q=%1
    je vois bien écrit le fichier php trouvé.

    Mais il y a un hic. J'ai une Internal Server Error. J'ai lu que cela pouvait venir du fait que ma règle fait boucler mon script et que par conséquent, Apache coupe tout.
    Ce que j'ai cru comprendre aussi est que [L] ne voulait pas dire que le script s'arrêtait là véritablement (pas un exit PHP par analogie). Il semblerait qu'une fois qu'une règle est appliquée, l'ensemble du script est ré-exécuté (récursif donc) pour voir s'il n'y a pas d'erreur ou pire quelque chose de contraire à la sécurité.
    Ceci pourrait expliquer que lors de la récursivité du script, je pars en boucle infinie et booom
    A me relire, ca se tient.
    Si par exemple mon url est toto/mapage.php, je redirige vers /mapage.php.
    Lors du second passage, %{REQUEST_URI} vaut /mapage.php et donc est redirigé vers /mapage.php etc etc etc... boucle infinie.

    Si quelqu'un, expert en URL RW par Apache, peut me conseiller il m'ôterait une aiguille à tricoter du pied

    merci
    Bonne soirée

  3. #3
    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
    Pour moi, les deux lignes que tu as ajoutées ne servent à rien à part ajouter un / devant le / qui commence la request URI. Du coup, d'un cycle de réécriture à un autre, ton URI change (pour contenir un / devant en plus à chaque fois) sans jamais se stabiliser (i.e. ne plus être réécrite). Tu pars donc en effet en boucle infinie et au bout d'un moment, Apache en a marre et arrête.

    J'en reviens à poser la question initiale : que veux-tu faire ? Que voudrais-tu que le paramètre d'URL q contienne ?

    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

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. tester l'existance d'un fichier a partir d'un URL
    Par ach718 dans le forum VBScript
    Réponses: 1
    Dernier message: 02/02/2009, 12h23
  3. [File]Tester l'existence d'un fichier
    Par florantine dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 23/11/2005, 10h45
  4. tester l existence d un fichier sous turbo pascal
    Par Newllite dans le forum Turbo Pascal
    Réponses: 5
    Dernier message: 25/01/2004, 12h47
  5. Peut on tester l'existence d'un fichier ?
    Par Alamassepointcom dans le forum Flash
    Réponses: 2
    Dernier message: 10/10/2002, 12h10

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