Initialisation et configuration
Copiez tout l'arbre du site0 dans un dossier appelé site1.
- /cms
- site0
- 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.
- /cms/site1
- includes
- library
- dump.php
- favicon.ico
- robots.txt
- sitemap.xml
- index.php
- .htaccess
Les fichiers pour l'initialisation et la configuration du site sont regroupés dans le dossier includes.
- /cms/site1
- includes
- settings.inc
- config.inc
- includes
Créez les fichiers settings.inc et config.inc dans le dossier includes avec les contenus suivants :
- ini_set('arg_separator.output', '&');
- ini_set('magic_quotes_runtime', 0);
- ini_set('magic_quotes_sybase', 0);
- ini_set('register_globals', 0);
- ini_set('session.cache_expire', 180);
- ini_set('session.cache_limiter', 'none');
- ini_set('session.cookie_lifetime', 0);
- ini_set('session.gc_maxlifetime', 1440);
- ini_set('session.name', '');
- ini_set('session.save_handler', 'files');
- ini_set('session.use_cookies', 1);
- ini_set('session.use_only_cookies', 1);
- ini_set('session.use_trans_sid', 0);
- ini_set('url_rewriter.tags', '');
- ini_set('error_reporting', E_ALL | E_STRICT);
- ini_set('display_errors', 1);
- 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
.
- global $base_url, $base_path, $base_root;
- global $sitename, $webmaster;
- $sitename = 'frasq.org';
- $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 :
- /cms/site1
- library
- bootstrap.php
- unsetglobals.php
- validatehostname.php
- library
- function unset_globals() {
- if (ini_get('register_globals')) {
- $allowed = array('_ENV', '_GET', '_POST', '_COOKIE', '_FILES', '_SERVER', '_REQUEST', 'GLOBALS');
- foreach ($GLOBALS as $key => $value) {
- if (!in_array($key, $allowed)) {
- unset($GLOBALS[$key]);
- }
- }
- }
- }
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.
- function validate_host_name($host) {
- return preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $host);
- }
validate_host_name
retourne true
si l'argument $host
est un nom d'hôte valide, false
dans le cas contraire.
- require_once 'unsetglobals.php';
- require_once 'validatehostname.php';
Charge le code des fonctions unset_globals
et validate_host_name
.
- function bootstrap() {
- global $base_url, $base_path, $base_root;
bootstrap
initialise les variables globales $base_url
, $base_path
et $base_root
.
- if (isset($_SERVER['HTTP_HOST'])) {
- $_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
- if (!validate_host_name($_SERVER['HTTP_HOST'])) {
- header('HTTP/1.1 400 Bad Request');
- exit;
- }
- }
- else {
- $_SERVER['HTTP_HOST'] = '';
- }
Tente de repérer une requête frauduleuse en validant le nom de l'expéditeur avec validate_host_name
.
- unset_globals();
- @include 'settings.inc';
- @include 'config.inc';
Nettoie les variables globales de PHP. Initialise et configure le programme.
- if (isset($base_url)) {
- $base_url = trim($base_url, '/');
- $url = parse_url($base_url);
- if (!isset($url['path'])) {
- $url['path'] = '';
- }
- $base_path = $url['path'];
- $base_root = substr($base_url, 0, strlen($base_url) - strlen($base_path));
- }
- else {
- $base_root = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 'https' : 'http';
- $base_url = $base_root .= '://'. $_SERVER['HTTP_HOST'];
- if ($dir = trim(dirname($_SERVER['SCRIPT_NAME']), '\,/')) {
- $base_path = '/' . $dir;
- $base_url .= $base_path;
- }
- else {
- $base_path = '';
- }
- }
- }
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
:
- define('ROOT_DIR', dirname(__FILE__));
- set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'library');
- set_include_path(get_include_path() . PATH_SEPARATOR . ROOT_DIR . DIRECTORY_SEPARATOR . 'includes');
- require_once 'dump.php';
- require_once 'bootstrap.php';
- bootstrap();
- dump($base_url);
- dump($base_root);
- 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