Url rewriting

Résolu/Fermé
naruto-94 Messages postés 865 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 20 décembre 2012 - 19 oct. 2010 à 23:23
naruto-94 Messages postés 865 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 20 décembre 2012 - 20 oct. 2010 à 20:59
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

1 réponse

avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 505
20 oct. 2010 à 14:16
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 :
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();
}
2
naruto-94 Messages postés 865 Date d'inscription mercredi 17 août 2005 Statut Membre Dernière intervention 20 décembre 2012 188
20 oct. 2010 à 20:59
superbe réponse , merci :)
0