262

Initialisation et configuration

Copiez tout l'arbre du site0 dans un dossier appelé site1.

  1. /cms
    1. site0
    2. site1

Dans ce chapitre, nous allons organiser la configuration et le démarrage du site.

Pour tester le résultat en ligne, entrez http://www.frasq.org/cms/site1 dans la barre d'adresse de votre navigateur. La sortie montre comment l'URL est analysée par le programme.

Créez les dossiers includes et library dans le dossier site1. Déplacez dump.php dans library.

  1. /cms/site1
    1. includes
    2. library
      1. dump.php
    3. favicon.ico
    4. robots.txt
    5. sitemap.xml
    6. index.php
    7. .htaccess

Les fichiers pour l'initialisation et la configuration du site sont regroupés dans le dossier includes.

  1. /cms/site1
    1. includes
      1. settings.inc
      2. config.inc

Créez les fichiers settings.inc et config.inc dans le dossier includes avec les contenus suivants :

  1. ini_set('arg_separator.output',     '&');
  2. ini_set('magic_quotes_runtime',     0);
  3. ini_set('magic_quotes_sybase',      0);
  4. ini_set('register_globals',         0);
  5. ini_set('session.cache_expire',     180);
  6. ini_set('session.cache_limiter',    'none');
  7. ini_set('session.cookie_lifetime',  0);
  8. ini_set('session.gc_maxlifetime',   1440);
  9. ini_set('session.name',             '');
  10. ini_set('session.save_handler',     'files');
  11. ini_set('session.use_cookies',      1);
  12. ini_set('session.use_only_cookies', 1);
  13. ini_set('session.use_trans_sid',    0);
  14. ini_set('url_rewriter.tags',        '');
  15.  
  16. ini_set('error_reporting',          E_ALL | E_STRICT);
  17. ini_set('display_errors',           1);
  18. ini_set('log_errors',               0);

settings.inc redéfinit des paramètres de PHP qui sont configurés dans le fichier du système php.ini.

IMPORTANT : Changez la configuration du site une fois mis en exploitation pour ne plus afficher les erreurs et les enregistrer dans un journal en mettant le paramètre display_errors à 0 et le paramètre log_errors à 1.

  1. global $base_url, $base_path, $base_root;
  2.  
  3. global $sitename, $webmaster;
  4.  
  5. $sitename = 'frasq.org';
  6. $webmaster = 'nobody@frasq.org';

config.inc est réservé aux paramètres globaux du programme.

L'initialisation du programme est effectuée par une fonction appelée bootstrap qui a besoin des fonctions unset_globals et validate_host_name. Chaque fonction est définie dans un fichier distinct. Ajoutez les fichiers bootstrap.php, unsetglobals.php et validatehostname.php dans le dossier library avec les contenus suivants :

  1. /cms/site1
    1. library
      1. bootstrap.php
      2. unsetglobals.php
      3. validatehostname.php
  1. function unset_globals() {
  2.     if (ini_get('register_globals')) {
  3.         $allowed = array('_ENV', '_GET', '_POST', '_COOKIE', '_FILES', '_SERVER', '_REQUEST', 'GLOBALS');
  4.         foreach ($GLOBALS as $key => $value) {
  5.             if (!in_array($key, $allowed)) {
  6.                 unset($GLOBALS[$key]);
  7.             }
  8.         }
  9.     }
  10. }

unset_globals efface une série de variables globales potentiellement dangereuses initialisées par PHP quand le paramètre register_globals est à true. On a demandé à Apache dans .htaccess avec la directive SetEnv REGISTER_GLOBALS 0 et à PHP dans settings.inc avec un appel à init_set de mettre ce paramètre à 0, mais un fournisseur internet peut très bien configurer Apache et/ou PHP pour qu'ils rejettent toute tentative de modification de ce paramètre.

  1. function validate_host_name($host) {
  2.     return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $host);
  3. }

validate_host_name retourne true si l'argument $host est un nom d'hôte valide, false dans le cas contraire.

  1. require_once 'unsetglobals.php';
  2. require_once 'validatehostname.php';

Charge le code des fonctions unset_globals et validate_host_name.

  1. function bootstrap() {
  2.     global $base_url, $base_path, $base_root;

bootstrap initialise les variables globales $base_url, $base_path et $base_root.

  1.     if (isset($_SERVER['HTTP_HOST'])) {
  2.         $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
  3.         if (!validate_host_name($_SERVER['HTTP_HOST'])) {
  4.             header('HTTP/1.1 400 Bad Request');
  5.             exit;
  6.         }
  7.     }
  8.     else {
  9.         $_SERVER['HTTP_HOST'] = '';
  10.     }

Tente de repérer une requête frauduleuse en validant le nom de l'expéditeur avec validate_host_name.

  1.     unset_globals();
  2.  
  3.     @include 'settings.inc';
  4.     @include 'config.inc';

Nettoie les variables globales de PHP. Initialise et configure le programme.

  1.     if (isset($base_url)) {
  2.         $base_url = trim($base_url, '/');
  3.  
  4.         $url = parse_url($base_url);
  5.  
  6.         if (!isset($url['path'])) {
  7.             $url['path'] = '';
  8.         }
  9.  
  10.         $base_path = $url['path'];
  11.         $base_root = substr($base_url, 0, strlen($base_url) - strlen($base_path));
  12.     }
  13.     else {
  14.         $base_root = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
  15.  
  16.         $base_url = $base_root .= '://'. $_SERVER['HTTP_HOST'];
  17.  
  18.         if ($dir = trim(dirname($_SERVER['SCRIPT_NAME']), '\,/')) {
  19.             $base_path = '/' . $dir;
  20.             $base_url .= $base_path;
  21.         }
  22.         else {
  23.             $base_path = '';
  24.         }
  25.     }
  26. }

Si la variable globale $base_url a été définie dans config.inc, en extrait la partie chemin d'accès de l'URL pour initialiser les variables globales $base_path et $base_root. Sinon, calcule les valeurs de $base_root et de $base_path à partir des variables PHP $_SERVER['HTTPS'], $_SERVER['HTTP_HOST'] et $_SERVER['SCRIPT_NAME'], puis fabrique $base_url en les concaténant.

Modifiez index.php pour proprement initialiser le programme avec bootstrap :

  1. define('ROOT_DIR', dirname(__FILE__));
  2.  
  3. set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'library');
  4. set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'includes');
  5.  
  6. require_once 'dump.php';
  7.  
  8. require_once 'bootstrap.php';
  9.  
  10. bootstrap();
  11.  
  12. dump($base_url);
  13. dump($base_root);
  14. dump($base_path);

index.php commence par ajouter les répertoires library et includes au chemin de PHP. Après avoir chargé le code de dump et de bootstrap, index.php appelle bootstrap. Le reste du programme affiche les variables globales $base_url, $base_root et $base_path qui ont été initialisées dans bootstrap.

Entrez http://localhost/cms/site1/search?q=foobar dans la barre d'adresse de votre navigateur.

string(32) "http://localhost/cms/site1"

string(22) "http://localhost"

string(10) "/cms/site1"

Mettez $base_url à http://localhost/cms/site1 dans config.inc et rechargez la page. Vérifiez que l'affichage est identique.

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].