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

Langage PHP Discussion :

Créer via une REGEXP une rediection HTAccess sur Apache [RegEx]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut Créer via une REGEXP une rediection HTAccess sur Apache
    Bonjour

    Je souhaite faire une redirection sur mon serveur Apache via le fichier HTAccess.
    Et RegExp c'est pas ma tasse de thé.

    Pour éviter des problèmes de cache sur le navigateur, je me suis inspiré de ce site https://blog.smarchal.com/mise-en-cache-js-css
    Donc mes fichiers javaScript sont appelés ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <script type="text/javascript" src="MonFichierJS.<?php echo $t ?>.js"></script>
    où $t représente la date du fichier MonFichierJS.js

    Au chargement de la page, le navigateur réclame le fichier MonFichierJS.1569593028.js (qui bien sur n'existe pas).
    Apache doit lui renvoyer MonFichierJS.js

    Pour cela je cherche à mettre en place une expression régulière.

    J'ai fait ce test sur ma page (je n'ai pas accès au HTAccess) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $MonFichier='DAASC.1569593028.js';
    $RegExp='#^([\w-]+)\.\d+\.js#';
    preg_match($RegExp, $MonFichier, $matches);
    echo '<br/>';
    // on obtient DAASC
    print_r($matches);
    echo '<br/>';
    $rempl=preg_replace($RegExp , '$1.js' , $MonFichier);
    echo '<br/>remplacement : '.$rempl.'<br/>'
    J'ai donc bien mon remplacement.

    J'ai fait mettre en place le remplacement dans HTAccess, mais je n'ai pas mon fichier :
    Nom : HTAccess_OutilsDevelop.JPG
Affichages : 147
Taille : 11,7 Ko

    la commande dans HTAccess est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule ^([\w-]+)\.\d+\.js $1.js [L]
    Je suppose qu'il me manque le chemin.
    Je modifie mon test pour intégrer le chemin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $MonFichier='https://maracana.intra.cea.fr:5020/modules/influx/DAASC.1569593028.js';
    echo '<br/>Recherche dans '.$MonFichier;
    $RegExp='#$([\w-]+)\.\d+\.js#';
    preg_match($RegExp, $MonFichier, $matches);
    echo '<br/>';
    print_r($matches);
    echo '<br/>';
    $rempl=preg_replace($RegExp , '$1.js' , $MonFichier);
    Mais il ne trouve rien (donc pas de remplacement).

    Comment dans expression régulière intégrer le chemin ?
    1- pour que l'occurence soit trouvée
    2 -pour que le chemin soit conserver dans le remplacement

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    si le souci est juste de forcer la lecture du fichier à chaque fois (au lieu de prendre celui en cache), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <script src="MonFichierJS.js?v=<?php echo date('Ymd'); ?>"></script>
    Comme date('Ymd') change chaque jour (sinon, on peut utiliser time()), le fichier est toujours vu comme "nouveau".
    "v=" est même facultatif.

    Et là... plus besoin de tripatouiller le .htaccess...

    N.B. C'est d'ailleurs ce qui est indiqué dans ton lien : piste 2: le timestamping
    Dernière modification par Invité ; 02/10/2019 à 17h01.

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Je suggère pour le .htaccess (tout en minuscule précédé par un point)1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteEngine on
    RewriteRule ^((?:[^/]*/)*[\w-]+)\.\d+\.js$ $1.js [L]
    Mais si tu connais par avance le path (ou les paths) à partir de la racine du site où sont situés les fichiers .js, il est préférable de l'inscrire "en toutes lettres" dans la regex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteEngine on
    RewriteRule ^(mon/path/[\w-]+)\.\d+\.js$ $1.js [L]
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    RewriteEngine on
    RewriteRule ^((?:mon/path1/|mon/path2/|etc\./)[\w-]+)\.\d+\.js$ $1.js [L]
    D'une manière générale, la réécriture d'url ne demande pas de notions de regex trés poussées ou farfelues, on reste dans le basique, donc un tutoriel de base sur le sujet et quelques tests sur regex101 devraient venir à bout de ce genre de problème.

    La branche 5.4 de PHP n'est plus supportée depuis le 3 septembre 2015, peut-être faudrait-il envisager de passer à la 7.3 (ou d'attendre début décembre pour la 7.4) et par la même trouver un hébergement mutualisé qui donne la main sur le .htaccess, voire, soyons fou, un serveur virtuel dédié comme kimsufi d'ovh (ce qui demande un peu plus d'investissement, mais qui donne toute liberté quant à sa configuration tout en restant bon marché).


    (1) .htaccess est le nom utilisé par défaut par apache, néanmoins, rien n'interdit dans la configuration d'apache de choisir un nom différent. Autre chose, il est plus performant de ne pas faire appel aux fichiers .htaccess et d'intégrer les règles de réécritures directement dans le fichier de configuration du serveur.



    NB: [^/]*/ est équivalent à [^/]*+/ du fait que PCRE par défaut pratique l'auto-possessivification (traduction bon an mal an de auto-possessification) ce qui, contrairement à ce qu'on pourrait croire de prime abord, n'est pas une pratique sexuelle déviante, mais le fait qu'un caractère ou une classe de caractères répété par un quantificateur et suivi d'un caractère ou d'une classe de caractères qui l'exclut (comme par exemple a*b, [^a]*a, a*[^a]), rend automatiquement ce quantificateur possessif. Donc au final (?:[^/]*/])* n'est pas vraiment différent de (?>[^/]*/)* car tout risque de backtracking à l'intérieur du groupe est écarté. Néanmoins, ce comportement peut être désactivé à la compilation de la bibliothèque PCRE ou en commençant la pattern par la directive (*NO_AUTO_POSSESS) (mais je doute sérieusement que les réécritures d'url d'apache gobent un truc pareil).
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 72
    Points
    72
    Par défaut miracle
    Bonjour
    j'ai testé la RegExp sur ma page PHP.
    Impeccable même si je n'arrive pas à comprendre ce qui a été ajouté à la RegExp.
    J'ai donc fait appliquer celle-ci dans mon HTAccess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RewriteRule ^((?:[^/]*/)*[\w-]+)\.\d+\.js $1.js [L]
    Et cela fonctionne.
    Comme il n'est pas très utile ici de lire la date du fichier puisque je force le rechargement , j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $t1 = filemtime($Fichier);
    par
    Merci bcp

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/05/2015, 18h18
  2. Réponses: 11
    Dernier message: 29/08/2014, 10h42
  3. Ouverture d'une application SWING via une url saisie sur le navigateur web !
    Par lemzo84 dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 18/06/2014, 19h40
  4. Supprimer un objet / text via une macro placée sur un bouton
    Par Lauvira dans le forum VBA PowerPoint
    Réponses: 1
    Dernier message: 17/11/2012, 05h43
  5. executer macro via une liste déroulante sur access
    Par RadioBerkane dans le forum VBA Access
    Réponses: 3
    Dernier message: 10/09/2012, 19h48

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