rewrite comprend pas très bien

Par neecride, il y a 9 ans


Bonsoir,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Voila mes URL ressemble a ça :

index.php?page=home
index.php?page=home&id=2

au niveau du Htaccess je fait ça :

RewriteEngine On RewriteBase / RewriteRule ^([a-z0-9]+).php$ index.php?page=$1 [L]

Ce que je veux

Ce que je veut c'est avoir au lieu de cette longue URL je veut juste :

home
home-2

si possible

Ce que j'obtiens

j'obtien erreur 404

voici pour approfondire mon index.php en partie qui est appeler par chacune de mes pages qui ce trouve dans le dossier pages :

$pages = scandir('pages/'); if( isset($_GET['page']) && !empty($_GET['page']) ){ //controll pages exist if(in_array($_GET['page'].'.php',$pages )){ $page = $_GET['page']; }else{ //on redirige si on est pas sur la bonne page //setFlash('<strong>Oh oh!</strong> page non trouver ! <strong> Existe pas ou plus </strong>','warning'); redirect('home'); } }else{ //on redirige si on est pas sur la bonne page //setFlash('<strong>Oh oh!</strong> page non trouver ! <strong> Existe pas ou plus </strong>','warning'); redirect('home'); }

Donc ma home ce trouve dans le dossier pages.

ce n'est vraiment pas ma tasse de thé, surtout que je mis prendre a la toute fin quand mon forum, l'administration et tous le tralala est terminer.

13 réponses

SLK, il y a 9 ans

Salut,

je vais te donner la façon dont moi j'ai utilisé l'URL Rewriting. Je ne sais pas du tout si on peut l'utiliser autrement.
Si quelqu'un sait d'ailleurs... J'écoute ^^

Puisque mon projet est à :
.../xampp/htdocs/work/monSite
J'ai mis un define :

define('BASE_URL', '/work/monSite/');

Aussi,
mon architecture :

  • .../monSite/.htaccess
  • .../monSite/public/index.php

Dans le HTML, j'écris les liens en 'absolu' (en me servant de mon define "BASE_URL") :

<a href="<?= BASE_URL ?>Accueil"></a>

Ça passe par le .htaccess

RewriteRule ^Accueil/?$ public/index.php?p=general.home [L]

Ou par exemple :

<a href="<?= BASE_URL ?>Accueil-2"></a> RewriteRule ^Accueil(-([0-9]+))?/?$ public/index.php?p=general.home&id=&2 [L] // je ne suis pas sur du tout de l'expression régulière...

Est-ce que ça t'aide pour ton problème ?

neecride, il y a 9 ans

bonjour,

Moi j'ai toujours du 404 ou de la redirection infinie.

I-dev, il y a 9 ans

slt
si vous suivi les tuto de grafikart developper un site de A a Z..
la solution est dans conf.php

Router::connect('all_posts/:slug-:id','posts/view/id:([0-9]+)/slug:([a-zA-Z0-9\-]+)');

par example ici j'ai lui dit change posts/view/id:([0-9]+)/slug:([a-zA-Z0-9-] par all_posts/:slug-:id

neecride, il y a 9 ans

I-dev

je n'ai pas suivie ce tuto la mai celui de porfolio en php brut donc rooter::connect je ne vois pas ce que c'est, puis ensuite un fois que j'ai bien compris le système j'ai pris ma propre voie.

neecride, il y a 9 ans

Bonsoir,

Voila j'ai revue un peut le truc maintenant je fait ça :

RewriteEngine On RewriteBase / RewriteRule ^([^\.]+)$ $1.php?page=home [NC,L] RewriteRule home index.php?page=home [L] RewriteRule forum index.php?page=forums [L] //cela marque bien la fin d'une réecriture ?

Donc dans l'URL je met domaine/home pour l'accueil et domaine/forum pour aller sur le forum.

sauf que sur forum si je ne met pas le / j'obtien forum/?page=home qui apparaît dans l'URL

Je sèche donc ! enfin je ne comprend pas pourquoi ça fonctionne sur home et non sur forum ?

AlexJM, il y a 9 ans

Ce que disait @I-dev c'était de faire le rooter non pas dans l'htaccess, mais dans le php, et les deux techniques sont faisables

As-tu essayé de mettre
RewriteRule ^([^.]+)$ $1.php?page=home [NC,L]
En dernier ?

neecride, il y a 9 ans

en faite je préfaire le Htaccess, Grafikart ferai comme ça avec un slug :

RewriteRule ^categorie/([a-z0-9\-]+)$ index.php?category=$1

j'ai compris en faisant comme ça avec le Htaccess jusque la ça fonctionne :

RewriteRule forum forums/index.php?page=forums [NC,L]

je suis presque a la fin mai si j'ai un id en get comme :

forums/index.php?page=forums&id=1

faut faire un truc comme ça ([a-z0-9-]+)$ et &1 mai je sais pas ou le mettre comment remplacer en

forum-id-1 ou comme

je trouve ça moins contraigniant a faire que les slug.

AlexJM, il y a 9 ans

Les règles utilisent les regex, tu peux donc faire qqchose ainsi :

RewriteRule ^forum-id-([0-9]+)$ forums/index.php?page=forums&id=$1 [NC,L]

Il me semble

neecride, il y a 9 ans

Oui merci voila je touche au but ! mai bizarrement ça fonctionne avec forum-id-1 mai ça coince sur la pagination :

RewriteRule ^home-pages-([0-9]+) index.php?page=home&pages=$1 [NC,L]

c'est poutant censé fonctionner mai ça me renvoie toujours sur page 1 et enfin quand j'ajoute $ a la fin de la regex ça renvoie 404 mai sans ça fonctionne.

AlexJM, il y a 9 ans

Ta pagination fonctionne comment ?

neecride, il y a 9 ans

Hola ça va faire long a regarder mai je dirai que c'est une pagination normal :

je n'ai laissai que les bouton prev. next. j'ai pas fini mais elle fonctionne correctement !!

$worksPerPage = $param[2]->param_value; //reglage bdd nbpage $worksTotalesReq = $db->query('SELECT id FROM works'); $worksTotales = $worksTotalesReq->rowCount(); $pagesTotales = ceil($worksTotales/$worksPerPage); if(isset($_GET['pages'])){ $pages = intval($_GET['pages']); }else{ $currentPage = 1; } //si id en get if(isset($pages) AND !empty($page) AND $pages > 0 AND $pages <= $pagesTotales) { $currentPage = $pages; } else { //si p null alors page sera egal 1 $currentPage = 1; //redirect('home&p=1'); } $startPaginat = ($currentPage-1)*$worksPerPage; //star pagination function paginatNumbers(){ global $pagesTotales, $currentPage; $prev = $currentPage - 1; //previous page is page - 1 $next = $currentPage + 1; //next page is page + 1 echo '<ul style="margin: 0 0 20px 0;" class="pager">'; //prev if($currentPage == 1){ echo ''; }else{ echo '<li class="previous"><a href="home-pages-' . $prev . '"><span aria-hidden="true">&larr;</span> Page présédante</a></li>'; } //pagination current /*for($i=1; $i <= $pagesTotales; $i++) { if($i == $currentPage) { echo '<li class="active"><a>'. $i .'</a></li>'; } else { echo '<li><a href="'. WEBROOT .'index.php?page=home&amp;p='.$i.'">' . $i . '</a></li>'; } }*/ //next if(isset($currentPage) && $currentPage == $pagesTotales){ echo ''; }else{ echo '<li class="next"><a href="home-pages-' . $next . '">Page suivant <span aria-hidden="true">&rarr;</span></a></li>'; } echo '</ul>'; } //liste works $req = $db->query(" SELECT works.id, works.name, works.writer, works.content, works.posted, works.date, works.slug, images.name AS image_name, categories.cat_name, users.username, comments.post_id, COUNT(comments.post_id) AS nbcoms FROM works LEFT JOIN users ON users.username = works.writer LEFT JOIN categories ON works.category_id=categories.id LEFT JOIN comments ON comments.post_id = works.id LEFT JOIN images ON images.id = works.image_id WHERE works.posted=1 GROUP BY works.id ORDER BY works.id DESC LIMIT $startPaginat,$worksPerPage "); $results = []; while($rows = $req->fetchObject()){ $results[] = $rows; } return $results;

je t'ai mis toute la page.

Lartak, il y a 9 ans

Bonjour.
Il y a quand même un certain problème avec ton code.
Pour commencer, tu définis deux fois la variable $currentPage pour lui assigner exactement la même valeur, soit 1.
Ensuite, cette variable valant 1, tu lui soustrait 1, ce qui la définit donc à 0 puis tu multiplies sa valeur, alors que tu auras beau la multiplier par ce que tu veux, 0 ne changera jamais.
Tu ne crois pas que tu devrais faire des modifications dans ton code ?

neecride, il y a 9 ans

Non pas vraiment !! j'ai beau regarder pour faire un prev next je suis bien obliger de soustraire a la page courante.

quand je clique on est a +1 si la page courante est egal 1 alors ça donne 2 si elle est diférente de 1 alors le boutton retour apparet et suivant sera toujours a plus +1 au vue de la page courante.

donc en crade ça donne :

function paginatNumbers(){ global $pagesTotales, $currentPage; echo '<ul style="margin:0;" class="pull-right pagination pagination-sm">'; //prev if($currentPage != "1"){ echo '<li><a href="'. WEBROOT .'index.php?page=home&amp;p='; echo $currentPage-1; echo '">&laquo;</a></li>'; }else{ echo '<li class="disabled" /><a>&laquo;</a></li>'; } //pagination current /*for($i=1; $i <= $pagesTotales; $i++) { if($i == $currentPage) { echo '<li class="active"><a>'. $i .'</a></li>'; } else { echo '<li><a href="'. WEBROOT .'index.php?page=home&amp;p='.$i.'">' . $i . '</a></li>'; } }*/ //next last page if($currentPage != $pagesTotales){ echo '<li><a href="'. WEBROOT .'index.php?page=home&amp;p='; echo $currentPage+1; echo '">&raquo;</a></li>'; }else{ echo '<li class="disabled" /><a>&raquo;</a></li>'; } echo '</ul>'; }

j'ai beau regarder la pagination fait bien ce que je veut.