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 et variables


Sujet :

Apache

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut .htaccess et variables
    Bonjour,

    J'ai un .htaccess qui gère plusieurs sites qui sont dans plusieurs sous-dossiers. Jusque là, pas de problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    # Directories
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} www\.(.*)
    RewriteRule ^(assets|css|js|images)/(.+)?$ /templates/%1/$1/$2 [L]
    Ceci me donne par exemple /templates/domain.com/css/styles.css

    Le problème que je rencontre maintenant est que j'aimerais pouvoir tester la condition d'existence de fichier ou dossier de la même façon.

    J'ai essayé comme ceci, mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # Directories
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} www\.(.*)
    RewriteCond %{DOCUMENT_ROOT}/templates/%1/%{REQUEST_FILENAME} !-f
    RewriteRule ^(assets|css|js|images)/(.+)?$ /templates/%1/$1/$2 [L]

    J'avais à la base essayé sans le %{DOCUMENT_ROOT} mais j'ai lu quelque part qu'il était obligatoire. Quoi qu'il en soit, avec ou sans ça ne fonctionne pas.


    Quand j'essaye d'accéder à mon fichier via l'URL : http://mondomain.com/monfichier.ext il me retourne une erreur 404.
    Ce fichier se trouve dans /templates/domain.com/monfichier.ext

    Pourriez-vous m'aider ?

  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
    Pourquoi tu veux tester l'existence du fichier ? En fait, c'est déjà fait : la première fois que l'URL est réécrite vers /tempate/..., Apache recommence la réécriture. Du coup, il repasse par les 2 premières RewriteCond qui font d'ailleurs que la réécriture s'arrête vraiment si le fichier /template/... existe. Là, tu te retrouves avec une erreur 500 si le fichier n'existe pas ?

  3. #3
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Je veux tester l'existence du fichier car il me sort une erreur 404 (interceptée par ErrorDocument 404 /404.html)

    En fait, ça me permettrait également de simplifier la règle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteRule ^(assets|css|js|images)/(.+)?$ /templates/%1/$1/$2 [L]
    Vu que jusqu'à présent, je dois définir les mots clés de redirections, or c'est un vieux serveurs avec plusieurs développeurs, ici pour l'exemple j'ai simplifié mais en réalité j'ai bien plus de "dossiers" (assets, css, js, images) que ces 4 là dans la règle de réécriture
    Et du coup pour l'instant, chaque fois que je remarque qu'un truc ne marche pas, j'ajoute le dossier manquant à cette règle... c'pas génial :s

    Et sinon, non le test d'existence du fichier ne se fait pas car le .htaccess est dans /www/ et non pas dans le dossier /www/templates/domain.com/ donc il test l'existence du fichier à partir du root et non pas du dossier, donc si j'écris http://domain.com/fichier.ext il me dit -forcément- que le fichier n'existe pas car /www/fichier.ext n'existe pas ! Pour preuve, si j'écris : http://www.domain.com/templates/domain.com/fichier.ext j'arrive bien à télécharger mon fichier

    Ce que je voudrais c'est pouvoir tester l'existence du fichier dans le dossier /www/templates/domain.com/ depuis le fichier /www/.htaccess

    (pour certaines raisons, je ne peux pas supprimer le redirect error 404 du fichier .htaccess dans /www/ je suis donc obligé de faire une règle parfaite)


    EDIT :

    Après avoir réfléchi un peu, je me suis rendu compte que j'étais très con
    Bien que je n'ai pas encore résolu mon problème, j'ai réussi à simplifier la fameuse ligne avec (assets|css|js|images|etc...) qui me dérangeait

    Voici mon code actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # Directories
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} www\.(.*)
    #RewriteCond %{DOCUMENT_ROOT}/templates/%1/%{REQUEST_FILENAME} -f
    RewriteRule ^(.+)$ /templates/%1/$1 [L]
    Comme on peut le voir, j'ai commenté la ligne qui me pose problème et au lieu de !-f j'ai mis -f vu qu'en réfléchissant je voudrais tester que le fichier EXISTE plutôt que N'EXISTE PAS. Malheureusement, si je décommente cette ligne, plus rien ne fonctionne :<

  4. #4
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Avec ce dernier code, ça fonctionne... PRESQUE !

    Effectivement, maintenant j'arrive à télécharger mon fichier malheureusement, j'ai d'autres règles d'écritures (en gros domain.com/nom-de-page), ce qui fait qu'avec le code ci-dessous mes fichiers se chargent bien par contre je ne peux plus naviguer sur les sites :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Directories
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} www\.(.*)
    RewriteRule ^(.+)$ /templates/%1/$1 [L]
    Voici un petit correctif :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Directories
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{HTTP_HOST} www\.(.*)
    RewriteRule ^(.+)\.[a-z]{2,4}$ /templates/%1/$1 [L]
    En gros, j'ai rajouté le fait de tester que s'il y une extension, on considère l'url comme menant à un fichier. Malheureusement, si un dev ici décide de faire un site avec domain.com/nom-de-page.html mon code tombe à l'eau.

    Bref, j'aimerais vraiment pouvoir tester l'existence du fichier avant de servir l'URL ! Est-ce que je peux vraiment utiliser %1 dans mon RewriteCond ? Je ne l'ai jamais vu faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RewriteCond %{DOCUMENT_ROOT}/templates/%1/%{REQUEST_FILENAME} -f

  5. #5
    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
    %1 n'aura de sens que s'il y a une RewriteCond précédente avec des parenthèses dans le second membre. Donc si tu fais ça, oui, ça marchera. C'est assez classique de mettre une première RewriteCond pour calculer des %1, %2, etc.

    Méfie-toi : %{REQUEST_FILENAME} correspond au chemin complet sur le système local du fichier théorique demandé par l'URL. Par exemple, si tu demandes http://site.com/nimporte/quoi.html, ce fichier nimporte/quoi.html existe réellement ou pas dans le document root, et que le document root est /var/www par exemple, alors %{REQUEST_FILENAME} vaut /var/www/nimporte/quoi.html. Donc RewriteCond %{DOCUMENT_ROOT}/templates/%1/%{REQUEST_FILENAME} -f est toujours faux.

  6. #6
    Membre Expert Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 1 895
    Par défaut
    Merci Mac !

    C'était bien vu =) haaa la magie des copier/coller, on ne réfléchi même pu ^^

    J'ai pas encore tout testé à fond mais ça semble fonctionner donc je vais marquer le sujet en [résolu], au pire je changerai si je constate une anomalie ^^

    Voici le code final :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    RewriteCond %{REQUEST_URI} /.+
    RewriteCond %{HTTP_HOST} www\.(.*)
    RewriteCond %{DOCUMENT_ROOT}/templates/%1%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}/templates/%1%{REQUEST_URI} -d
    RewriteRule ^(.+)$ /templates/%1/$1 [QSA,L]

Discussions similaires

  1. .htaccess et variables de session
    Par SpaceFrog dans le forum Apache
    Réponses: 6
    Dernier message: 26/03/2013, 21h31
  2. htaccess et variable d'environnement
    Par splash44 dans le forum Apache
    Réponses: 9
    Dernier message: 06/08/2009, 15h30
  3. [PHP-JS] Définir une variable dans le htaccess
    Par Ikaly dans le forum Langage
    Réponses: 2
    Dernier message: 09/03/2007, 18h09
  4. [Sécurité] htaccess en fonction de variables PHP
    Par myomyo dans le forum Langage
    Réponses: 14
    Dernier message: 13/06/2006, 11h00
  5. Réponses: 4
    Dernier message: 30/12/2005, 11h07

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