je ne comprends pas l'url rewriting

  • Auteur de la discussion Auteur de la discussion bibiyanki
  • Date de début Date de début
WRInaute occasionnel
hello:

je suis en train de finir un site associatif et j'arrive à l'étape de la réécriture des urls.

J'ai intégré dans le site un forum qui marche avec l'url rewriting donc j'ai regardé le code htaccess..

le voici
Code:
RewriteEngine on
# Lecture d'un sujet
RewriteRule ^post-([0-9]+)-p([0-9]+)(?:-(.*))?\.html$  index.php?page=post&ids=$1&pg=$2 [L]
RewriteRule ^post-([0-9]+)(?:-(.*))?\.html$  index.php?page=post&ids=$1 [L]
RewriteRule ^postsond-([0-9]+)-p([0-9]+)(?:-(.*))?\.html$  index.php?page=post&ids=$1&pg=$2&affsond= [L]
RewriteRule ^postsond-([0-9]+)(?:-(.*))?\.html$  index.php?page=post&ids=$1&affsond= [L]

cela à l'air facile mais ça ne fonctionne absolument pas pour mon script de news...
Le fichier htaccess ainsi que le site sont dans un répertoire /projet/ , mon script de news est dans le répertoire /scientifique/

voici un bout de mon script
Code:
 <td bgcolor="<?php echo(($i++ % 2 == 0) ? '#ccc' : '#ececef' ); ?>"><h4 align="center"><a href="./scientifique2.php?id=<?php echo $donnees['id']; ?>"><?php echo $donnees['titre'];?></a></h4></td>
           </tr>

donc je dois faire
Code:
RewriteRule ^post-([0-9]+)(?:-(.*))?\.html$  scientifique2.php?id=$1 [L]

mais cela ne fonctionne pas, pouvez vous m'aider ?
 
WRInaute passionné
Salut,
Pour "dégrossir" un peut la chose :
Code:
<a href="./scientifique2.php?id=<?php echo $donnees['id']; ?>"><?php echo $donnees['titre'];?></a>
donne un lien du style :
Code:
<a href="./scientifique2.php?id=1">Titre de mon poste</a>
Pour obtenir une url du genre :
Code:
<a href="./titre-de-mon-poste-1.php">Titre de mon poste</a>
Il faut transformer l'url en :
Code:
<a href="./<?php echo mafonction($donnees['titre']);?>-<?php echo $donnees['id'];?>.php">Titre de mon poste</a>
ou mafonction() est une fonction permettant de ré écrire correctement le titre inclue dans l'url.
Code:
function mafonction($chaine)
{    
    $chaine=strtolower($chaine);
    
    $accents = Array("/é/", "/è/", "/ê/","/ë/", "/ç/", "/à/", "/â/","/á/","/ä/","/ã/","/å/", "/î/", "/ï/", "/í/", "/ì/", "/ù/", "/ô/", "/ò/", "/ó/", "/ö/");
    $sans = Array("e", "e", "e", "e", "c", "a", "a","a", "a","a", "a", "i", "i", "i", "i", "u", "o", "o", "o", "o");
    
    $chaine = preg_replace($accents, $sans,$chaine);  
    $chaine = preg_replace('#[^A-Za-z0-9]#','-',$chaine);
	
   // Remplace les tirets multiples par un tiret unique
   $chaine = ereg_replace( "\-+", '-', $chaine );
   // Supprime le dernier caractère si c'est un tiret
   $chaine = rtrim( $chaine, '-' );
	
    while (strpos($chaine,'--') !== false) $chaine = str_replace('--','-',$chaine);
    
    return $chaine; 
}

A cela s'ajoute la ligne de rewrite dans le fichier .htaccess qui pourait être :
Code:
RewriteRule  ^(.*)-([0-9]*)\.php$  page.php?titre=$1&id=$2 [L]

Note: dans ce cas précis la page affichant les données se nomme "page.php" et reçoit comme variable "titre" et "id".

En résumé :
1)Utiliser le fichier .htaccess pour le rewriting.
2) Modifier la forme des liens en fonction du rewriting utilisé.
3) Inclure une fonction pour la ré écriture.
 
WRInaute occasionnel
merci de ta réponse

j'ai réussi à avoir un résultat mais ce n'est pas le bon LOL


au lieu d'écrire le titre de ma news, il écrit simplement scientifique.php

j'ai fait ça
dans mon fichier /scientifique/index.php (qui contient le code php de ma liste de news) et la page sur laquel est appelé mon script s'appelle scientifique.php

Code:
<code>function mafonction($chaine)
{    
    $chaine=strtolower($chaine);
    
    $accents = Array("/é/", "/è/", "/ê/","/ë/", "/ç/", "/à/", "/â/","/á/","/ä/","/ã/","/å/", "/î/", "/ï/", "/í/", "/ì/", "/ù/", "/ô/", "/ò/", "/ó/", "/ö/");
    $sans = Array("e", "e", "e", "e", "c", "a", "a","a", "a","a", "a", "i", "i", "i", "i", "u", "o", "o", "o", "o");
    
    $chaine = preg_replace($accents, $sans,$chaine);  
    $chaine = preg_replace('#[^A-Za-z0-9]#','-',$chaine);
   
   // Remplace les tirets multiples par un tiret unique
   $chaine = ereg_replace( "\-+", '-', $chaine );
   // Supprime le dernier caractère si c'est un tiret
   $chaine = rtrim( $chaine, '-' );
   
    while (strpos($chaine,'--') !== false) $chaine = str_replace('--','-',$chaine);
    
    return $chaine; 
}


		?>


      
          <table style="width:100%;">
<tr>
            <td bgcolor="<?php echo(($i++ % 2 == 0) ? '#ccc' : '#ececef' ); ?>"><h4 align="center"><a href="".//scientifique2.php?id=<?php echo mafonction($donnees['titre']);?>-<?php echo $donnees['id'];?>.php"><?php echo $donnees['titre'];?></a></h4></td>
           </tr>
<tr>
<td><?php echo substr($donnees['contenu'], 0, 600);?>...</td>
           </tr>
          </table></code>
 
WRInaute occasionnel
excuse cela marche j'avais oublié

<a href="" ">

trop de "

mais il me redirectionne vers ma page d'erreur, je pense mettre tromper dans mon fichier htaccess

Code:
RewriteEngine on
RewriteRule  ^(.*)-([0-9]*)\.php$  scientifique.php/titre=$1&id=$2 [L]

sachant que ma page qui liste mes news s'appelle scientifique.php et que la page ou est appelé une news s'appelle scientifique2.php

merci de vos aides
 
WRInaute passionné
Ton code ci-dessous est faux :
Code:
<a href="".//scientifique2.php?id=<?php echo mafonction($donnees['titre']);?>-<?php echo $donnees['id'];?>.php"><?php echo $donnees['titre'];?></a>
ça serait plutôt :
Code:
<a href="./<?php echo mafonction($donnees['titre']);?>-<?php echo $donnees['id'];?>.php"><?php echo $donnees['titre'];?></a>
Il est inutile d'utiliser le nom de la page "scientifique2.php" dans ton lien tout comme "?id=".

rewriting.png

Src : http://creer-un-site.fr/directive-du-fichier-htaccess-178.php
et pour le htaccess :
Code:
RewriteRule  ^(.*)-([0-9]*)\.php$  scientifique2.php?titre=$1&id=$2 [L]

C'est dans la page "scientifique.php" qu'il faut ré écrire les lien et insérer la fonction
Code:
<?php
function mafonction($chaine)
{    
	$chaine=strtolower($chaine);
	
	$accents = Array("/é/", "/è/", "/ê/","/ë/", "/ç/", "/à/", "/â/","/á/","/ä/","/ã/","/å/", "/î/", "/ï/", "/í/", "/ì/", "/ù/", "/ô/", "/ò/", "/ó/", "/ö/");
	$sans = Array("e", "e", "e", "e", "c", "a", "a","a", "a","a", "a", "i", "i", "i", "i", "u", "o", "o", "o", "o");
	
	$chaine = preg_replace($accents, $sans,$chaine);  
	$chaine = preg_replace('#[^A-Za-z0-9]#','-',$chaine);

	// Remplace les tirets multiples par un tiret unique
	$chaine = ereg_replace( "\-+", '-', $chaine );
	// Supprime le dernier caractère si c'est un tiret
	$chaine = rtrim( $chaine, '-' );

	while (strpos($chaine,'--') !== false) $chaine = str_replace('--','-',$chaine);
	
	return $chaine; 
}
?>
<table style="width:100%;">
 <tr>
  <td bgcolor="<?php echo(($i++ % 2 == 0) ? '#ccc' : '#ececef' ); ?>">
   <h4 align="center"><a href="./<?php echo mafonction($donnees['titre']);?>-<?php echo $donnees['id'];?>.php"><?php echo $donnees['titre'];?></a></h4>
  </td>
 </tr>
 <tr>
  <td>
   <?php echo substr($donnees['contenu'], 0, 600);?>...
  </td>
 </tr>
</table>
ps : tu devrais remplacer ton tableau par des div +css !
 
WRInaute occasionnel
alors merci beaucoup cela marche super bien et rapidement!

par contre je ne peux pas redéclarer la fonction car j'ai des news scientifique,actualité, presse

il faut peut être juste que je change le nom "mafonction" ? je test :)
 
WRInaute occasionnel
apparemment cela ne marche pas quand on a plusieurs scripts news.

j'ai fait la même chose pour ma page news.php sauf que j'ai renommé la fonction "pomme" et j'ai changé dans le htaccess scientifique2.php par news.php

cela marche pour scientifique2.php

mais pour news.php cela ne m'affiche pas la news mais bien la page...

en faite je crois que c'est parce que ma fonction donnees s'appelle pareil pour le titre mais c'est quand même pas la même page!!
 
WRInaute occasionnel
je rectifie tout marche, c'est juste une erreur humaine (comme d'habitude) dans le htaccess

merci encore, je mets résolu
 
WRInaute passionné
Et bien tant mieux si ça fonctionne ;). Pour la fonction, tu devrais la mettre dans un fichier à part genre "fonctions.php" et tu fais une simple "include"; comme ça tu peux utiliser la même fonction pour tout tes fichiers.
 
Discussions similaires
Haut