Redirection htaccess id=slug vers slug.php

fury_fatal
Invité n'ayant pas de compte PHPfrance

04 juil. 2020, 11:10

Bonjour,

J'aimerais rediriger :

?id=slug-article-1234-exemple

vers

slug-article-1234-exemple.php

Je n'arrive pas :

Code : Tout sélectionner

RewriteEngine on RewriteRule ^([-a-z]+)\.php$ ?id=$([-a-z]+) [L]
Il faut aussi que ça soit uniquement sur le dossier, et non les sous-dossiers.

Avatar du membre
Mammouth du PHP | 1609 Messages

04 juil. 2020, 16:54

Salut, en fait la réécriture d'url c'est plutôt le contraire. Dans le code html tu fais des liens comme ça slug-article-1234-exemple.html, que la réécriture redirige vers le bon fichier php.

Ta règle devarit plutôt ressembler à ça :

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.html$ fichier.php?id=$1 [L]
Développeur web depuis + de 20 ans

fury_fatal
Invité n'ayant pas de compte PHPfrance

04 juil. 2020, 18:21

Cela ne marche pas non plus.
C'est peut-etre parce que slug-article-1234-exemple.php n'existe pas encore ?

Par défaut, j'ai que des adresses du genre : index.php?id=slug-article-1234-exemple

J'aimerai supprimer index.php?id= et ajouter .php.

Avatar du membre
Mammouth du PHP | 1609 Messages

04 juil. 2020, 18:42

Il faudrait lire bien attentivement le code proposé pour l'adapter convenablement à ce que tu souhaites faire.

Déjà j'ai mis un .html au lieu d'un .php car pour moi il est plus logique quand on fait une réécriture d'utiliser l'extension html pour une page html.

Et deuxièmement j'ai mit fichier.php et non index.php ne sachant quel était le nom de ton fichier php cible.

As tu arrangé le code comme nécessaire ?

PS : après pour tester c'est pas compliqué, directement dans la barre d'adresse du navigateur, avec bien évidement la bonne adresse et un slug qui existe (et l'extension que tu as choisi ^^) :
http://address/slug-article-1234-exemple.html

PPS : tu pourrais aussi éventuellement avoir un problème de RewriteBase si tu es dans un sous répertoire ou derrière un alias. Tu peux vérifier le log d'accès du serveur web pour voir si tu n'y trouverais pas des informations intéressantes.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

05 juil. 2020, 10:13

Salut:

Code : Tout sélectionner

RewriteRule ^slug-article-([0-9]+)-exemple$ index.php?id=slug-article-$1-exemple [L]

fury_fatal
Invité n'ayant pas de compte PHPfrance

05 juil. 2020, 11:22

Il faudrait lire bien attentivement le code proposé pour l'adapter convenablement à ce que tu souhaites faire.

Déjà j'ai mis un .html au lieu d'un .php car pour moi il est plus logique quand on fait une réécriture d'utiliser l'extension html pour une page html.

Et deuxièmement j'ai mit fichier.php et non index.php ne sachant quel était le nom de ton fichier php cible.

As tu arrangé le code comme nécessaire ?

PS : après pour tester c'est pas compliqué, directement dans la barre d'adresse du navigateur, avec bien évidement la bonne adresse et un slug qui existe (et l'extension que tu as choisi ^^) :
http://address/slug-article-1234-exemple.html

PPS : tu pourrais aussi éventuellement avoir un problème de RewriteBase si tu es dans un sous répertoire ou derrière un alias. Tu peux vérifier le log d'accès du serveur web pour voir si tu n'y trouverais pas des informations intéressantes.
C'est bon, ça marche avec :

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.html$ index.php?id=$1 [L]
Mais pas :

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.php$ index.php?id=$1 [L]
C'est bizarre.

Je préfère obtenir une extension .php, parce que cela me permet de mettre une redirection 301 le jour où je renomme les slugs.

Avatar du membre
Mammouth du PHP | 1564 Messages

05 juil. 2020, 12:14

si ta redirection 301 est en PHP, html ou php, c'est pareil, c'est la base de ton fichier qui sera en mesure d’exécuter du code PHP ou non (ici c'est index.php donc oui)

Perso je met pas d'extension à mes redirection, pour le "style" :)

mais je rejoins tout à fait la logique de Saian qui en mettant .html reconnait le type de fichier

fury_fatal
Invité n'ayant pas de compte PHPfrance

06 juil. 2020, 20:30

Quelqu'un saurait m'expliquer pourquoi cela ne marche pas avec l'extension .php ?

Avatar du membre
Mammouth du PHP | 1609 Messages

06 juil. 2020, 21:22

Y a pas de raison que ça ne marche pas du moment que tu mets bien .php dans la barre d'adresse également, sinon forcément l'expression ne match pas.
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1564 Messages

07 juil. 2020, 10:15

pour:

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.html$ index.php?id=$1 [L]
c'est:
http://address/slug-article-1234-exemple.html

et pour:

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.php$ index.php?id=$1 [L]
c'est:
http://address/slug-article-1234-exemple.php

logique mais il est parfois bon de le préciser

fury_fatal
Invité n'ayant pas de compte PHPfrance

07 juil. 2020, 13:53

J'ai peut-être l'explication pour laquelle, cela ne marche pas avec .php :

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.php$ index.php?id=$1 [L]
Tous les fichiers .php dans le même dossier sont devenus innaccessibles. Y compris index.php avec ou sans id. C'est la raison pour laquelle, cela ne marche pas.

Si je fais :

Code : Tout sélectionner

RewriteRule ^([\w\d-]+)\.php1$ index.php?id=$1 [L]
alors ça marche. Mais je n'ai pas envie d'une extension .php1

Mammouth du PHP | 2703 Messages

07 juil. 2020, 14:06

index.php répond à ^([\w\d-]+)\.php$ d'où une possible boucle infinie.
avec ^([\w\d-]+-[0-9]+-[\w\d-]+)\.php$ index.php ne répond plus.

Avatar du membre
Mammouth du PHP | 1564 Messages

07 juil. 2020, 15:10

je fais comme ceci pour éviter les confusions; je rajoute un mot avant la suite du lien, ex:

Code : Tout sélectionner

RewriteRule ^article-([a-z0-9-]+)$ index.php?id=$1 [L]
pour suivre votre exemple:

Code : Tout sélectionner

RewriteRule ^article-([a-z0-9-]+).php$ index.php?id=$1 [L]
Pour information j'utilise plus l'anti-slash aux points, ça fonctionne quand même et c'est mieux lisible

Avatar du membre
Mammouth du PHP | 1609 Messages

07 juil. 2020, 15:16

Bien vu, index.php répondant au pattern forcément ça posait problème comme souligné par or1. Et effectivement tous les fichiers php que tu pouvais avoir aussi.
Développeur web depuis + de 20 ans

fury_fatal
Invité n'ayant pas de compte PHPfrance

07 juil. 2020, 20:02

Cela explique pourquoi je ne vois jamais d'extension .php sur un site dynamique, mais uniquement .html ou sans extension.

Merci pour l'astuce RewriteRule ^article-([a-z0-9-]+)$

Je peux aussi faire comme ça :

Code : Tout sélectionner

RewriteRule ^article/([a-z0-9-]+)$ index.php?id=$1 [L]
Cela ressemble à du Regex. Je peux faire ceci ?

Code : Tout sélectionner

RewriteRule ^article/([\w-]+)$ index.php?id=$1 [L]
au lieu de

Code : Tout sélectionner

RewriteRule ^article/([\w\d-]+)$ index.php?id=$1 [L]
\w c'est déjà pour les caractères alpha-numériques ? Pourquoi mettre \d ?