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 :

Réécriture d'URL selon un programme externe


Sujet :

Apache

  1. #1
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut Réécriture d'URL selon un programme externe
    Bonjour,

    J'ai vu sur la doc d'apache qu'il est possible d'utilser un programme (fait en n'importe quel language) pour récrire une URL.
    Le principe est :
    demande d'URL faite par le client (ex : /article/toto-mange-une-pomme) => reception de la demande par apache => apache fait tourner le programme en lui passant en argument la chaine => le programme fait son office => le programme retourne la chaine URL (ex : index.php?type=article&id=96) le résultat peut être cherche partout, je cherche bien évidemment à ce que la recherche se fasse sur un BDD sql.

    Voila, je sais que c'est possible, et comme ça correspond à mon besoin, j'ai cherché sur le net. Mais dommage je n'ai rien trouvé (qui fonctionne ), j'ai beau essayé.

    Après mes moultes recherches, je viens voir du côté des pros si je peux trouver de l'aide
    parce que moi je sèche :oops

  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
    Points : 12 977
    Points
    12 977
    Par défaut
    Tel que tu le décris, pour moi, ce n'est pas possible mais je peux me tromper. Tu peux donner tes sources ?

  3. #3
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    C'est possible avec RewriteMap mais c'est plutôt lourd (un exemple avec un script PHP).

  4. #4
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    Comme le dit julp avec un RewriteMap

    @julp : qu'entend tu par lourd ?
    l'artillerie lourde ?
    d'accord, mais c'est sur un serveur qui ne fait qu'office de serveur Web (dédié OVH)
    lourd en terme de perf ?
    à voir des bench, pour voir si cette solutions vaut le coup de la mise en place
    pour juger de l'intéret d'une telle réalisation en fonction de la performance / aide au développement ....

    pourrais tu m'indiquer comment le faire, si possible ?

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Oui, en perf. C'est bien pour ça qu'on se contente de faire figurer les informations nécessaires à la ressource cible directement dans l'URL, ce n'est pas spécialement gênant. Évidemment, l'aspect mise en place, pour un dédié, n'est plus un problème.

    Comment faire quoi ?
    Un bench ? Il y a des outils pour ça.
    Un programme destiné à RewriteMap ? Ça dépend pour commencer du langage dudit "programme" et de ce qu'il est censé faire.

    Un exemple :
    • Mettre en place RewriteMap (au niveau d'Apache) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      # Il faut impérativement, en plus, activer la réécriture au niveau du VH
      RewriteEngine On
       
      RewriteLock /var/run/rewritemap.lock
       
      # Unixoïde (FreeBSD ici)
      # Avec shebang :
      RewriteMap article "prg:/usr/local/etc/apache22/rewritemap.php"
      # Sans shebang :
      #RewriteMap article "prg:/usr/local/bin/php -f /usr/local/etc/apache22/rewritemap.php"
      # Windows (retirer le shebang)
      #RewriteMap article "prg:C:/AMP/php5/php.exe -f C:/AMP/rewritemap.php"
       
      # Pour test/comparaison
      RewriteMap toupper "int:toupper"
    • Ensuite les règles de réécriture (par .htaccess ici) :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      <IfModule mod_negotiating.c>
          Options -MultiViews
      </IfModule>
       
      RewriteEngine On
      RewriteRule ^(articles)/([^/]+)$ /index.php?type=${toupper:$1}&id=${article:$2|0} [R]
      Le 0 derrière la barre oblique indique la valeur par défaut (absence de correspondance notamment)
    • La base (MySQL ici) :
      Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      CREATE TABLE `articles`(
          `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
          `nom` VARCHAR(80) NOT NULL,
          PRIMARY KEY(`id`),
          UNIQUE KEY(`nom`)
      );
      INSERT INTO `articles`(`nom`) VALUES('bananes');
    • Le script de conversion :
      Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      #!/usr/local/bin/php
      <?php
      ini_set('display_errors', FALSE);
       
      define('DSN', 'mysql:host=localhost;dbname=developpez');
      define('LOGIN', 'developpez');
      define('MOT_DE_PASSE', 'developpez');
      define('LOG', '/var/log/rewritemap.log');
      $options = array(
          PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
      );
       
      try {
          $dbh = new PDO(DSN, LOGIN, MOT_DE_PASSE, $options);
          $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
       
          $map = $dbh->prepare('SELECT id FROM articles WHERE nom = ?');
          $map->bindParam(1, $input, PDO::PARAM_STR);
          $map->bindColumn(1, $output, PDO::PARAM_INT);
       
          set_file_buffer(STDOUT, 0);
          while (!feof(STDIN)) {
              $input = rtrim(fgets(STDIN), "\n");
              $map->execute();
              if ($map->rowCount() === 1) {
                  $map->fetch();
                  fputs(STDOUT, "$output\n");
              } else {
                  fputs(STDOUT, "NULL\n"); // S'il n'y a pas de correspondance, Apache attend 'NULL'
              }
          }
      } catch (Exception $e) {
          file_put_contents(LOG, sprintf('[%s:%d] %s: %s' . PHP_EOL, $e->getFile(), $e->getLine(), date('d/m/Y H:i:s'), $e->getMessage()), FILE_APPEND);
      }


    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    http://localhost/articles/bananes => http://localhost/index.php?type=ARTICLES&id=1
     
    http://localhost/articles/poires => http://localhost/index.php?type=ARTICLES&id=0

  6. #6
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    merci julp pour ces précieuses informations

    je vais essayer de faire cela réecriture d'URL depuis une base et je vais changer en utilsant un dbm ou autre, si je trouve des pbs de performances


    enfait si j'avais déjà eu un bench URL database rewrite VS dbm rewrite ou un truc du genre ça aurait été pas mal (et très intéressant)

    mais là ça me suffit amplement, je vais le mettre en place et me faire ma propre idée
    en tout cas merci pour tes réponses, je galérait a essayé de trouvé ça

    PS : je pense qu'avec d'autre languages, les perfs ne sont pas aussi catastrophique qu'en php
    je pense a perl (porter ensuite en C) ou python
    vu que cette appli n'est pas comme un site Web (bcp moins d'évolution).

    merci encore

    PS :
    j'ai jsute une petite question
    pourquoi mettre un [R] comme flag pour la récriture d'URL

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    C'est une question de dynamisme après : une base de type dbm serait plutôt statique (qu'Apache peut gérer nativement) contrairement à un "programme" externe qui offre bien plus de souplesse. Quand au langage de ce programme, il sera probablement plus facile d'avoir un script que du compilé (encore que c'est potentiellement discutable) - sans tenir compte des performances.

    Citation Envoyé par sliderman
    pourquoi mettre un [R] comme flag pour la récriture d'URL
    C'était simplement pour voir l'URL finale (la flemme de recompiler PHP en module ou CGI), ça peut donc parfaitement être supprimé.

  8. #8
    Membre confirmé
    Homme Profil pro
    Technophile Web
    Inscrit en
    Mai 2007
    Messages
    930
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Technophile Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 930
    Points : 467
    Points
    467
    Par défaut
    j'ai essayé ton exemple
    et rine n'a lair de fonctionner chez moi

  9. #9
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Tout y est normalement.

    Il faut :
    1. Commencer par tester le programme en l'exécutant en ligne de commande
    2. Déterminer si la réécriture fonctionne (avec une fonction RewriteMap de base comme toupper par exemple)
    3. Déterminer si le programme est bien appelé par Apache et si celui-ci se déroule normalement (l'écriture de traces dans un log en PHP peut être utile)

    Éventuellement chercher des informations dans les journaux d'erreur (en activant au besoin celui de la réécriture).

Discussions similaires

  1. Comment exécuter un programme externe ?
    Par spikto dans le forum Langage
    Réponses: 12
    Dernier message: 27/06/2005, 16h18
  2. faire un test sur un programme externe
    Par marieheraud dans le forum Windows
    Réponses: 3
    Dernier message: 02/09/2004, 18h32
  3. [Kylix] pb d'appel de programme externe
    Par wizwiz dans le forum EDI
    Réponses: 2
    Dernier message: 27/08/2004, 09h29
  4. [Debutant(e)]Execution d'un programme externe
    Par saidi_chahrat dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 26/08/2004, 11h35
  5. appel programme externe depuis pl/sql
    Par txouki dans le forum PL/SQL
    Réponses: 6
    Dernier message: 11/05/2004, 18h35

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