Url rewriting, en fonction des infos de la base de données

Eléphant du PHP | 337 Messages

25 sept. 2016, 10:21

Bonjour à tous,

Je me penche actuellement sur l'url rewriting, mais j'ai beau lire des tas de trucs, des tutos, etc., je ne trouve pas mon bonheur (ni ne comprend tout, l'un n'excluant d'ailleurs pas l'autre...)

Bref, ce que j'aimerais, c'est un truc comme par exemple sur le site www.lemonde.fr : transformer une url de type "page.php?id=XXX" en quelque chose du genre "les-infos-de-la-base-correspondant-a-l-id-de-l-url.html"

Je voudrais faire ça sans faire une règle htaccess pour chaque url, évidemment, mais je n'ai trouvé nulle part comment récupérer les infos de la base dans le fichier htacess pour faire ses règles de réécriture.

Et enfin, j'ai lu plusieurs fois qu'il fallait ensuite modifier à la main chaque url du site : mais c'est particulièrement contre-productif, puisque si je fais ça, je dois contourner plein de trucs du code php (toutes les boucles utilisées pour afficher des articles, des catégories, etc.).

Y a-t-il un pro de l'url rewriting qui hante ces lieux ?

Merci pour votre aide :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

25 sept. 2016, 12:32

En fait le principe c'est de faire une règle de redirection générique dans ton .htaccess de type :
tout ce qui match "/(.+)\.html" (en gros n'importe quelle url qui termine par .html) et de le redéiriger vers page.php?titre=$1 où $1 correspondra au nom normalisé de ta page (le titre sans caractères spéciaux)
Et ensuite c'est ton fichier page.php qui va chercher dans la base de données à quel page ça correspond, exactement de la même façon que tu le fait déjà sur l'ID.

Important : je te préconise d'enregistrer le titre "normalisé"d e ta page dans ta bdd comme une métadonnées de l'article (comme l'ID en gros) afin : 1) de vérifier qu'il n'y ait pas de doublon dans tes url 2) de gagner en rapidité pour faire la correspondance quand tu chercheras en base de données à quoi correspond un titre normalisé.
Quand tout le reste a échoué, lisez le mode d'emploi...

Mammouth du PHP | 2703 Messages

25 sept. 2016, 13:56

la fin d'une url du site du monde :
du-trafic-parisien_5002550_4497271.html
donc il y a bien l'id dans l'url. on peut ne pas le mettre mais il faut s'assurer qu'il n'y aura pas de doublon dans le texte choisi pour definir une page.

et ensuite, il faut bien modifier son code php pour changer tous les liens pour pointer vers les nouvelles urls.

Eléphant du PHP | 337 Messages

26 sept. 2016, 00:14

Merci pour vos réponses, je vais m'y atteler sérieusement.
Question subsidiaire : comment faire pour tester l'url rewriting en local ? (je bosse avec easyPhp, et windows refuse de renommer un fichier en ".htaccess")

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

26 sept. 2016, 01:23

Utilises un éditeur de code qui permet de nommer un fichier .htaccess
Par exemple, ça ne pose pas de problème pour Sublime Text ou Scite.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 337 Messages

26 sept. 2016, 13:13

Super, ça marche, merci @rthur :)

Eléphant du PHP | 337 Messages

26 sept. 2016, 15:10

Bon eh bien ça fonctionne, mais ça oblige à compliquer le code pour générer des url qui correspondent. Pas fastoche de penser à tout !

Une ultime question que je n'arrive pas à résoudre : comment faire fonctionner l'url rewriting en local ? J'ai pourtant vérifié dans httpd.conf, et la ligne du module url_rewriting est bien décommentée...

Eléphant du PHP | 337 Messages

26 sept. 2016, 15:58

Et les commandes à base de basename fonctionneront-elles toujours correctement ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

26 sept. 2016, 18:41

Bonjour,

Pour nommer un fichier .htaccess, vous pouvez également :
- ouvrir votre fichier texte avec le bloc note, faire "enregistrer sous" et saisir le nom du fichier : ".htaccess" (avec les guillemets).
- il semblerait qu'avec windows 7, il soit aussi possible de juste ajouter un point à la fin du nom .htacess. pour que cela fonctionne.

Pour basename() il te retournera toujours le dernier élément du chemin qui lui est passé en argument. Si la valeur de l'url ou du chemin spécifié n'est plus la même, le retour sera également différent... tout dépend alors à quoi et comment tu utilises cette fonction.

Et pour le htacess en local, il faut que l'attribut "AllowOverride" du dossier dans lequel se trouve ton site (ou un sous dossier) soit à "All" afin d'autoriser ces fichiers à surcharger la configuration du serveur :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 337 Messages

26 sept. 2016, 22:59

Merci pour ta réponse Ryle, mais j'arrive toujours pas à faire fonctionner le htaccess en local.

"AllowOverride All", je l'ai trouvé dans le fichier data\conf\apache_alias.conf, et il est bien configuré sur All (mais est-ce le bon fichier ?).
En fait, autant je commence à me débrouiller en php et être moins ignorant, autant je mesure l'étendue de ma nullité sur tout ce qui concerne les serveurs, configurations, et tout ce qui fait tourner le php en fond :roll:

Quant à la commande basename, je ne peux plus l'utiliser de façon sûre si je comprends bien : si je fais des conditions comme ceci par exemple :
// La condition porte sur le fichier "de base", celui qui n'a pas été modifié pour l'url rewriting
if(basename(.....) == "page.php")
{

}
...dans ce cas, la condition ne marchera plus ?


Bref, tout ça pour dire qu'en fait, c'est pas vraiment de l'url rewriting tout ça non ? Moi je pensais que qu'on pouvait réécrire à la volée des urls pour leur donner une forme plus explicite. Ce qui m'embête beaucoup, c'est le fait de devoir revoir tout le code pour changer toutes les url, c'est un boulot de dingue ! :afraid: