8797 sujets

Développement web côté serveur, CMS

Bonjour,

J'utilise ce code php pour inclure des fichiers php dans ma page principale afin de garder partout la même structure :

$include = 'accueil'; 
$pages = array('contact', 'croquis', 'peintures', 'tarifs', 'erreur', 'plan'); 
$page = !empty($_GET['page']) ? trim($_GET['page']) : ''; 
if(in_array($page, $pages)) { 
    $include = $page; 
}
include($include.'.php'); 


J'utilise aussi ce code dans un fichier .htaccess pour affichier le point html :


Options +FollowSymlinks
RewriteEngine on
RewriteRule   ^contact.html$   /index.php?page=contact  [L]
RewriteRule   ^croquis.html$   /index.php?page=croquis  [L]
RewriteRule   ^peintures.html$   /index.php?page=peintures  [L]
RewriteRule   ^tarifs.html$   /index.php?page=tarifs  [L]
RewriteRule   ^plan.html$   /index.php?page=plan  [L]


Mon problème est que pour un de mes sites, je souhaiterais pouvoir ajouter des pages sans toucher à ces deux pages. Des pages du style 01.html, 02.html, ... jusque 400.html par exemple.

Y aurait-il moyen d'ajouter à ces 2 codes une ligne qui prendrait compte de ces pages de 01 à 400.html ou est-ce que je dois chaque fois ajouter les pages à la main dans les 2 fichiers ?

Merci d'avance pour votre aide!

Sub
Modifié par subran (20 Jul 2011 - 13:40)
Modérateur
Et l'eau,

Je pense que ceci devrait t'aider dans un premier temps : dir
Modifié par niuxe (07 Jul 2011 - 00:37)
Ok, je regarde ca.

Petite question : j'essaye d'ajouter un fichier php qui se trouve dans un répertoire de mon site et ce code ne l'accepte pas :


$include = 'accueil';  
$pages = array('[b]formulaire/contact[/b]', 'croquis', 'peintures', 'tarifs', 'erreur', 'plan');  
$page = !empty($_GET['page']) ? trim($_GET['page']) : '';  
if(in_array($page, $pages)) {  
    $include = $page;  
} 
include($include.'.php');  


Le fichier "contact.php" se trouve dans le répertoire "formulaire" de mon site et dans le code php j'ai donc ajouté le nom de son répertoire mais cela ne fonctionne pas ... il ne trouve pas le fichier "contact.php"

Suis-je obligé de mettre le fichier "contact.php" dans le répertoire de base de mon site avec les autres (croquis.php, peintures.php, ...) ? Je voudrais le laisser dans son répertoire tout en utilisant ce code.

Nb: j'ai aussi essayé /formulaire/contact et ../formulaire/contact

En espérant que ce soit possible... merci d'avance pour votre aide,

Sub
Modérateur
C'est logique puisque $_GET['page'] te sortira : contact et non pas formulaire/contact
Sinon pour le premier souci il faut que tu fasses comme les CMS

stocke dans une base de données la correspondance entre URL simple et ta page
tu peux aussi gérer avec des tableaux php + algorithme

c'est ton index.php qui s'occupera de traduire l'URL simple en URL compliqué

grâce à une redirection générique :

 # The Friendly URLs part
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
niuxe a écrit :
C'est logique puisque $_GET['page'] te sortira : contact et non pas formulaire/contact


Ok, comment pourrais-je faire pour qu'il prenne en compte que quelques-unes des pages se trouvent dans un dossier ?

Merci pour ton aide Smiley smile
Alors...

Pour ta règle de réécriture, tu utilises une version générique (comme l'a dit Ariala) :


<IfModule mod_rewrite.c>
	RewriteEngine On

	RewriteBase /

	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule ^(.*)$ index.php?page=$1 [L,QSA]
</IfModule>


Et pour le code de ta page index.php (si tu as des questions dessus, n'hésite pas) :


<?php

// Chemin absolu vers le dossier où se trouve les pages
define('PAGES_DIR', '/home/user/www/pages/');

// Si page n'est pas renseigné alors on tente de charger la home
if (empty($_GET['page']))
{
	$file = PAGES_DIR . 'accueil.php';
}
else
{
	// Sinon on récupére le chemin et le nom de la page depuis l'URL

	$matches = Array();
	$res = preg_match('#^([a-z0-1\-_\/]+\/)?([a-z0-1\-_]+)$#', $_GET['page'], $matches);

	// Si on a trouvé quelque chose...
	if ($res === 1) {
		if (count($matches) === 3)
		{
			$file = PAGES_DIR . $matches[1] . $matches[2] . '.php';
		} else {
			$file = PAGES_DIR . $matches[1] . '.php';
		}
	}
}

if (file_exists($file) && $res !== FALSE)
{
 require $file; // Charge la page si elle existe
}
else
{
 require PAGES_DIR . '404.php'; // Sinon affiche la page 404
}


Et dans tes pages tu écris des URL du genre :


ma-page
dossier/ma-page
formulaire/contact
articles/article-01
etc...


Tes URL peuvent contenir des lettres minuscules de a à z (sans accents), des chiffres, des tirets, des tiret-bas et des slash (pour les dossiers).
Modifié par jb_gfx (07 Jul 2011 - 15:18)
Si si ça devrait fonctionner avec les pages qui sont dans des sous-dossiers aussi, c'est fait pour. Smiley smile

J'ai écris le code sans le tester alors j'ai peut être laissé passer un truc.

A tester :

- RewriteBase / si ton site est dans un sous-dossier, par exemple toto tu dois mettre RewriteBase /toto/
- Fais un echo de la variable $file juste avant la fonction include pour voir si le chemin est bon.
- Tu as bien renseigné le chemin vers le dossier où sont stockées tes pages (PAGES_DIR) ?
Modifié par jb_gfx (07 Jul 2011 - 18:30)
jb_gfx a écrit :

- Fais un echo de la variable $file juste avant la fonction include pour voir si le chemin est bon.

Cela donne :
/home/public_html/accueil.php


jb_gfx a écrit :

- RewriteBase / si ton site est dans un sous-dossier, par exemple toto tu dois mettre RewriteBase /toto/

Le site est à la racine ainsi que la page accueil.php mais la page qui ne s'affiche pas "page2.php" se trouve dans un dossier. Peut-être dois-je copier le index.php dans ce dossier ou dois je renseigner ce dossier ...


jb_gfx a écrit :

- Tu as bien renseigné le chemin vers le dossier où sont stockées tes pages (PAGES_DIR) ?

J'ai renseigné /home/public_html/ mais pas le dossier des pages qui sont dans un dossier.

Vois-tu mon erreur?

ps: merci pour ton aide !
Je viens de tester et ça fonctionne très bien avec des pages dans des sous dossier.

Y'avait quelques notices qui s'affichaient alors j'ai corrigé ça et un peu optimisé. Voilà la nouvelle version.


<?php

// Chemin absolu vers le dossier où se trouve les pages
define('PAGES_DIR', dirname(__FILE__) . '/pages/');

$res = TRUE;
$file = PAGES_DIR;

// Si page n'est pas renseigné alors on tente de charger la home
if (empty($_GET['page']))
{
	$file .= 'home.php';
}
else
{
	// Sinon on récupére le chemin et le nom de la page depuis l'URL

	$matches = Array();
	$res = preg_match('#^([a-z0-1\-_\/]+\/)?([a-z0-1\-_]+)$#', $_GET['page'], $matches);

	// Si on a trouvé quelque chose...
	if ($res === 1) {
		if (count($matches) === 3)
		{
			$file .= $matches[1] . $matches[2] . '.php';
		} else {
			$file .= $matches[1] . '.php';
		}
	}
}

if ($file !== PAGES_DIR && file_exists($file) && $res !== FALSE)
{
	// Charge la page si elle existe
	require $file;
}
else
{
	// Sinon affiche la page 404
	require $file . '404.php';
}


Si tu veux mes fichiers de test envoi moi ton adresse email en message privé et je te passerai l'archive.
Merci beaucoup ! Ton archive m'a beaucoup aidé, j'ai changé l'arboresence de mon site Smiley smile

Vraiment TOP !

Encore une petite question : est-ce qu'il serait possible que mes pages soit accessibles avec l'extension *.html ? Pour l'instant c'est comme ceci www.monsite.be/contact

A l'époque, j'avais lu que c'était mieux d'avoir cette extension html pour le référencement si mes souvenirs sont bons... mais je ne sais pas ce que tu en penses ..

Merci encore en tout cas !
jb_gfx a écrit :
L'extension .html ne change absolument rien pour le référencement. Smiley cligne


Ok, mais ca doit être psychologique alors Smiley lol
J'ai essayé en rajoutant :
RewriteRule ^([^.]*[^./])$ /$1.html [R=301,L]

Au fichier .htaccess mais cela ne fonctionne pas Smiley decu
jb_gfx a écrit :
Ne touche pas au .htacces.


J'ai transformer la dernière ligne du .htacces en :

RewriteRule ^(.*)\.html$ index.php?suby=$1 [L,QSA]


Cela fonctionne en .html maintenant mais vu ta mise en garde, je voulais tout de même l'écrire ici pour être sûr que je n'ai pas fais d'erreurs.
Oui, parce que la règle dans le .htaccess est complètement générique, donc l'idée c'est de ne jamais y toucher et gérer la réécriture directement dans le code PHP. Ce que font les frameworks et CMS modernes.

Dans ton cas il suffisait de modifier l'expression régulière comme ceci :


$res = preg_match('#^([a-z0-1\-_\/]+\/)?([a-z0-1\-_]+)\.html$#', $_GET['page'], $matches);