8796 sujets

Développement web côté serveur, CMS

Bonjour,

Je suis en train de créer mon portfolio "à la main" sans passer par un CMS.

J'utilise cette syntaxe apprise en cours :

<body>

<div id="page">



     <div id="header">
	    <?php include('inc/header.php');?>
	 </div> 
	  
	  <div id="menu">
	  <?php include('inc/menu.php');?>
	 </div>
               
                  <div id="contenu">
                       <?php
		                  if (empty($_GET["contenu"])) include ('pages/accueil.php');
    	                  else include('pages/'. $_GET['contenu'].'.php'); 						
	                   ?>  
                  </div>       
     
 <div id="footer">
      <?php include('inc/footer.php');?>
  </div>  
</div>
              
</body>


Et mes différentes pages s'affiche à la place de la page d'accueil donc.

Du coup mes urls ressemble à ça : http://localhost/portfolio/index.php?contenu=portfolio, http://localhost/portfolio/index.php?contenu=contact

J'aimerai pouvoir à la place mettre "portfolio" par exemple. Je sais qu'il faut créer un .htaccess à la racine du site.

J'ai parcouru différents tuto sur internet, mais j'en ai trouvé aucun qui m'explique vraiment ce qu'il faut mettre dans .htaccess, à chaque fois je ne comprend rien Smiley decu

Si quelqu'un à un bon tuto à me conseiller, ou si quelqu'un peut m'expliquer concrètement...

Mille merci!

Bonne journée
Bah ce n'est pas très compliqué, si mod_rewrite est installé il suffit juste de l'activer avec la directive RewriteEngine et ensuite ce ne sont que des expressions régulières.

RewriteEngine on
RewriteRule ^(.+)$ portfolio/index.php?contenu=$1 [L]


PS : à chaque fois que tu écris des choses comme cela, des bébés innocents meurent. S'il te plaît, arrête. Smiley bawling

<?php 
                          if (empty($_GET["contenu"])) include ('pages/accueil.php'); 
                          else include('pages/'. $_GET['contenu'].'.php');                          
                       ?>
Bonjour,

Merci pour ta réponse.

Des bébés innocents meurent à cause de mon code? Smiley decu

<?php 

                          if (empty($_GET["contenu"])) include ('pages/accueil.php'); 

                          else include('pages/'. $_GET['contenu'].'.php');                          

                       ?>


Le code n'est pas bon? Pourtant c'est un formateur qui nous a appris cette syntaxe...On peut pas faire comme ça??

Dans ce cas, peux tu m'aider et me dire qu'elle est la bonne syntaxe?

Mille merci

Bonne journée

PS: Pour le .htaccess j'ai mis les lignes que tu m'as dit mais j'ai ce message qui s'affiche à la place de mon site :

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator, admin@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.

Il manque des choses dans mon .htaccess? le rewrite-module est bien coché dans apache.

Merci
Modifié par bizerte77 (11 Mar 2011 - 16:43)
Derien.

C'est une des failles de sécurité basique.
Tu ne dois JAMAIS faire une inclusion à partir d'une donnée fournie par l'internaute.

Imagine que l'on tape cette adresse par exemple :

http://monportfolio.com/index.php?contenu=..%2Fadmin%2Fconfidentiel%2Flancement_des_ogives_nucleaires

Ta page va donc faire

include('pages/../admin/confidentiel/lancement_des_ogives_nucleaires.php');


Et la c'est le drame !

Pour sécuriser il faut que tu vérifie que $_GET['contenu'] est bien une valeur autorisée.

Par exemple en faisant :


$pagesAutorisees = array('portfolio', 'cv', 'blog');

if (!empty($_GET["contenu"]) && in_array($_GET["contenu"], $pagesAutorisees)) include('pages/'. $_GET['contenu'].'.php');
else include ('pages/accueil.php');
Essaye de spécifier la RewriteBase, c'est peut être obligatoire, je ne suis pas sûr.


RewriteEngine on
RewriteBase /
RewriteRule ^(.+)$ portfolio/index.php?contenu=$1 [L]


Si cela ne marche toujours pas, utilise phpinfo() pour obtenir la version exacte de apache et vérifier si mod_rewrite est bien installé et si oui quelle version.
Pour le code que tu m'as dit : $pagesAutorisees = array('portfolio', 'cv', 'blog');

Si j'ai bien compris, ici je liste toutes mes pages de mon portfolio ?

Dans mon cas j'ai un menu : Accueil - portfolio - photoshop - flash - contact (les pages en le même nom)
et dans mon footer : plan du site (ma page s'appelle plan) - actu

Donc je devrai faire : $pagesAutorisees = array('accueil ', 'portfolio ', 'flash ', 'contact', 'plan', 'actu'); ?


Pour le .htaccess, je vais essayer ce que tu m'as dit mais j'ai une petite question concernant la ligne : RewriteRule ^(.+)$ portfolio/index.php?contenu=$1 [L] , je ne comprends pas très bien le sens et aussi comment il sait comment je veux nommer ma page?

Merci

Edit: Apache Version : Apache/2.2.11 (Win32) PHP/5.2.9-1
Loaded Modules : il y a une liste de modules dont mod_rewrite

Et sinon j'ai toujours la même erreur même en ajoutant la ligne que tu m'as dit.
Modifié par bizerte77 (11 Mar 2011 - 17:07)
Oui, dans pages autorisées tu met toutes les pages que ton utilisateur à le droit de voir. Comme ça si quelqu'un essaye d'accéder à une autre page, comme elle ne sera pas dans la liste des pages autorisées, il sera redirigé vers l'accueil.

Pour l'instruction RewriteRule, voici une petite explication :

RewriteRule ^(.+)$ portfolio/index.php?contenu=$1 [L]

RewriteRule
Indique à Apache une nouvelle règle de réécriture à suivre

^(.+)$
Ceci est une expression régulière, un schéma. Si ton url correspond à ce schéma, alors la réécriture sera appliquée.

portfolio/index.php?contenu=$1
Destination vers laquelle ton url sera réécrite

[L]
Flag d'Apache, cette option indique à Apache, que si la condition (l'expression régulière) a été remplie, alors il doit s'arrêter ici, et na pas faire plusieurs réécriture à la suite.


La partie compliquée, c'est l'expression régulière. Les expressions régulières sont un langage très puissant, mais aussi très complexe, il faut du temps pour arriver à bien les maîtriser.
Heureusement celle-ci est très simple :
^(.+)$

^ --> Début de string
() --> Groupe de capture, mémorise tout ce qui sera entre les parenthèses
. --> N'importe quel caractère
+ --> Entre 1 et n fois
$ --> Fin de String

Donc si tu combine tout cela, tu peux en déduire que :
^(.+)$ --> Entre le début et la fin de la fin de la string mémorise tout les caractères quels qu'ils soient et quels que soit leur nombre du moment qu'il y en a au moins un.

Donc si ta condition est remplie (ce n'est pas très dur il suffit d'avoir au moin une lettre dans ton adresse) ton adresse sera réécrite :
portfolio/index.php?contenu=$1 ou $1 est le premier groupe de capture (les caractères "mémorisés" entre parenthèses)

Quelques examples :
monsite.com/blog --> portfolio/index.php?contenu=blog
monsite.com/videos --> portfolio/index.php?contenu=videos
monsite.com/telechargements --> portfolio/index.php?contenu=telechargements
monsite.com/ --> rien du tout car tu as 0 caractères et donc la condition de base ^(.+)$ n'est pas honorée.
Modifié par Ywg (11 Mar 2011 - 17:19)
Pour ton erreur 500, à priori je ne vois pas.
Le code que je t'ai indiqué marche chez moi, je l'ai déjà appliqué sur pas mal de sites.

Peut être que tu ne l'as pas mis au bon endroit.

Tu peux éventuellement poster ta configuration d'apache ? (fichiers .htaccess, httpd.conf, vhost.conf et autres fichiers éventuels, en faisant gaffe qu'il n'y ait pas d'informations sensibles dedans bien sûr).
Pour la configuration apache, je ne sais pas où exactement trouver ça...

J'ai la version: Version de Apache: 2.2.11

Pour le httpd.conf, c'est le fichier qu'on trouve dans wamp>>apache ? Si oui, je peux faire un copier coller du fichier en entier, il n'y a pas d'info sensible puisque je suis en local?

Par contre vhost.conf, je ne sais pas du tout où je peux le trouver...

Pour le .htaccess, je l'ai mis à la racine et dedans il y a :

RewriteEngine on

RewriteBase /

RewriteRule ^(.+)$ portfolio/index.php?contenu=$1 [L]

Encore une fois merci pour l'aide.
Bon on va essayer plus simple, supprime le fichier .htaccess à la racine
Vas dans ton répertoire portfolio et crée ce fichier .htaccess

RewriteEngine on
RewriteRule ^(accueil)$ index.php?contenu=$1 [L]
RewriteRule ^(portfolio)$ index.php?contenu=$1 [L]
RewriteRule ^(flash)$ index.php?contenu=$1 [L]
RewriteRule ^(contact)$ index.php?contenu=$1 [L]
RewriteRule ^(plan)$ index.php?contenu=$1 [L]
RewriteRule ^(actu)$ index.php?contenu=$1 [L]


Ensuite tape l'url http://localhost/portfolio/flash
Cela devrait te rediriger vers http://localhost/portfolio/index.php?contenu=flash

Si ça ne marche toujours pas, bah moi je donne ma langue au chat. Smiley langue
Quand je tape : http://localhost/portfolio/flash l'url se transforme en http://localhost/portfolio/flash/?contenu=flash

Et sur cette page, il y a la liste de tous les documents qu'il y a dans mon dossier flash (images jpg + animation swf).


upload/25191-aa.jpg

C'est bizarre...

Si tu sais pas c'est pas grave, un grand merci pour avoir essayé de m'aider Smiley biggrin et en plus j'ai appris un nouveau truc sur a sécurité Smiley smile

Bon week-end

PS: si tu as 5min, j'ai posté un autre post sur le forum et peut être que tu peux m'aider : http://forum.alsacreations.com/topic-1-54371-1-Symfony--integration-du-design.html

Si non c'est pas grave.

Mille merci!
Bonjour,

J'ai toujours ce problème... J'ai essayé avec d'autres tuto trouvé sur le net mais toujours sans succès...

J'ai oublié d'activer quelque chose? je m'y prend mal? je comprends rien?

Merci de me guider...

Bonne journée