Url rewriting
Résolu
naruto-94
Messages postés
904
Statut
Membre
-
naruto-94 Messages postés 904 Statut Membre -
naruto-94 Messages postés 904 Statut Membre -
Bonsoir,
je n'ai jamais pratiquer l'url rewriting mais j'ai lu des tutos par-ci par-là quand j'en trouve par hasard et je me demandais (peut-être que ça me servira un jour) si c'était possible par exemple de récupérer un libelle pour le mettre dans l'url au lieu de l'id .
par exemple pour /article.php?id=42 au lieu de /article-42.html je voudrais /article-sur-l-url-rewriting.html (qui correspondrait à l'id 42 dans la bdd)
Merci d'avance
je n'ai jamais pratiquer l'url rewriting mais j'ai lu des tutos par-ci par-là quand j'en trouve par hasard et je me demandais (peut-être que ça me servira un jour) si c'était possible par exemple de récupérer un libelle pour le mettre dans l'url au lieu de l'id .
par exemple pour /article.php?id=42 au lieu de /article-42.html je voudrais /article-sur-l-url-rewriting.html (qui correspondrait à l'id 42 dans la bdd)
Merci d'avance
1 réponse
Salut.
Sur la table contenant les articles, tu peux ajouter un champ nommé "titre_canonique" (par exemple).
Ce champ contiendra le titre transformé pour pouvoir être affiché dans une URL, grâce à cette fonction.
Au niveau du .htaccess, ça ressemblera à ceci :
Dans article.php, il suffira de compter le nombre d'entrée « WHERE id = $_GET['id'] ». S'il y en a aucune, tu affiches une erreur 404, sinon, tu récupères les données de cet article. Si $_GET['canonique'] est égal à $resultat_mysql['url_canonique'], alors tu affiches l'article, sinon, tu fais une redirection vers la bonne adresse.
En PHP, ça donne ceci :
Sur la table contenant les articles, tu peux ajouter un champ nommé "titre_canonique" (par exemple).
Ce champ contiendra le titre transformé pour pouvoir être affiché dans une URL, grâce à cette fonction.
Au niveau du .htaccess, ça ressemblera à ceci :
RewriteRule ^article-([0-9]+)-(.+)$ /article.php?id=$1&canonique=$2
Dans article.php, il suffira de compter le nombre d'entrée « WHERE id = $_GET['id'] ». S'il y en a aucune, tu affiches une erreur 404, sinon, tu récupères les données de cet article. Si $_GET['canonique'] est égal à $resultat_mysql['url_canonique'], alors tu affiches l'article, sinon, tu fais une redirection vers la bonne adresse.
En PHP, ça donne ceci :
<?php
require 'config.php';
if(!isset($_GET['canonique']) || !isset($_GET['id'])) {
header('HTTP/1.1 404 Not Found');
include 'views/http_errors/404.php';
exit();
}
$pdo = new PDO('mysql:host='.DB_HOST.';dbname='.DB_NAME, DB_USER, DB_PASS);
$sql = 'SELECT COUNT(*) AS nb FROM articles WHERE id = '.(int) $_GET['id'];
$req = $pdo->query($sql);
$data = $req->fetch();
if($data['nb'] > 0) {
$sql = 'SELECT * FROM articles WHERE id = '.(int) $_GET['id'];
$req = $pdo->query($sql);
$article = $req->fetch();
if($_GET['canonique'] != $article['url_canonique']) {
header('HTTP/1.1 301 Moved Permanently');
header('Location: /article-'.$article['id'].'-'.$article['url_canonique']);
} else {
include 'views/news/news_single.php';
}
} else {
header('HTTP/1.1 404 Not Found');
include 'views/http_errors/404.php';
exit();
}
naruto-94
Messages postés
904
Statut
Membre
188
superbe réponse , merci :)