[Résolu] Aide URL Rewriting

Aide URL Rewriting [Résolu] - PHP - Programmation

Marsh Posté le 02-09-2017 à 15:51:15    

Bonjour,
 
Voilà, étant en plein développement d'un projet Web, j'aurais besoins d'aide pour la configuration du .htaccess au niveau de l'URL Rewriting.
 
Voici les URL que l'on peut trouver :  
 
 
http://forum.localhost/?P=2a9e0
http://forum.localhost/?P=bbdbe&C=1
http://forum.localhost/?P=bbdbe&F=1
http://forum.localhost/?P=ee11c&U=Modo
 
Pour le premier paramètre, un simple RewriteRule ^([a-zA-Z0-9]+)\.htm$  ?P=$1  [L,QSA] me permet d'avoir mes liens sous cette forme :  
 
http://forum.localhost/2a9e0.htm
http://forum.localhost/bbdbe.htm?C=1
http://forum.localhost/bbdbe.htm?F=1
http://forum.localhost/ee11c.htm?U=Modo
 
Mais j'aimerais obtenir ceci :
 
http://forum.localhost/bbdbe-C-1.htm
http://forum.localhost/bbdbe-F-1.htm
http://forum.localhost/ee11c-U-Modo.htm
 
Tout en conservant le deuxième paramètre. Et si il pourrait y avoir plus de deux paramètres, un simple [QSA] me suffira pour les récupérer, pas besoins que je les réécrive.
 
J'ai essayé de mettre  
 
RewriteRule ^([a-zA-Z0-9]+)\.htm$  ?P=$1  [QSA]
RewriteRule "^-([^/]+)-([^/]+)\.htm" "htm?$1=$2" [L,QSA]
 
Mais sans succès :/ (Erreur 404)
 
Et toutes les autres variantes que j'ai pu essayer m'ont donné une jolie page 500 ...
 
Si quelqu'un pouvait m'aider svp, merci d'avance :)


Message édité par dwarfdog le 02-09-2017 à 21:04:58
Reply

Marsh Posté le 02-09-2017 à 15:51:15   

Reply

Marsh Posté le 02-09-2017 à 16:58:59    

Qui gère réellement ces adresses ? (le destinataire final)
 
Parce que personnellement, si c'était destiné à un seul et même script (PHP ou peu importe), je laisserais le soin à ce dernier le parsing de ces URL, ce qui ne ferait qu'une règle générique voire un FallbackResource, ce serait bien plus simple et maîtrisable. Avec PHP, avec un coup d'explode sur - de $_SERVER['REQUEST_URI'] (ou je ne sais plus quelle variable car $_SERVER['REQUEST_URI'] peut notamment contenir la query string si je ne m'abuse) ?
 
Avec Apache, ça pourrait être possible avec quelque chose comme ça :

Code :
  1. RewriteCond %{REQUEST_FILENAME} -f [OR]
  2. RewriteCond %{REQUEST_FILENAME} -d
  3. RewriteRule ^ - [L]
  4. # Ne pas mettre de Last sur la règle qui suit
  5. RewriteRule ^([^-]+)(.*) $2?P=$1
  6. RewriteRule ([^-]+)-([^-.]+) index.php?$1=$2&%{QUERY_STRING} [N]


?


Message édité par pluj le 02-09-2017 à 19:14:06
Reply

Marsh Posté le 02-09-2017 à 18:06:24    

Tout d'abord, merci pour cette réponse très rapide pluj :)
 
Qu'entends tu par

Citation :

Qui gère réellement ces adresses ? (le destinataire final)


 
Car là, le premier paramètre gère la page, et les suivants les actions dans la page appelée. (Le premier paramètre a cet aspect car il est chiffré par mesure de sécurité)
Ensuite, grâce à cette séparation, je peux gérer chaque action dans la page concernée.
Utilisant en plus Smarty, cette indexation des variables m'est plus à l'aise à mettre en place.
 
Je viens de tester ce que tu viens de mettre (à un détail prêt, j'ai juste retiré index.php à la dernière ligne, car il n'est jamais pointé explicitement dans l'adresse)
 
J'obtiens des URL comme ceci :  
 
http://forum.localhost/bbdbe-F-1.xyz
http://forum.localhost/bbdbe-F-1.php
http://forum.localhost/bbdbe-F-1.htm
http://forum.localhost/bbdbe-F-1
 
Donnant toutes sur la page voulue.
 
Avec un paramètre supplémentaire, cela donne:  
 
http://forum.localhost/bbdbe-F-1&PAGE=3.htm
http://forum.localhost/bbdbe-F-1&PAGE=3
 
Donnant également sur la page voulu.
 
L'idéal serait d'avoir systématiquement
 
http://forum.localhost/bbdbe-F-1.htm
http://forum.localhost/bbdbe-F-1.htm&PAGE=3
ou
http://forum.localhost/bbdbe-F-1-PAGE-3.htm
 
Merci encore pour l'aide et la disponibilité :)
 

Reply

Marsh Posté le 02-09-2017 à 19:08:47    

Que tu pourrais faire la même chose sur index.php en PHP.
 
A moins d'avoir une redirection, index.php ne doit pas apparaître côté client.
 
Je n'ai pas compris "l'histoire" de ton paramètre supplémentaire (l'URL de départ) parce que si ton utilisateur tape bbdbe-F-1-PAGE-3.htm ce serait réécrit (l'URL réelle) index.php?P=bbdbe&F=1&PAGE=3, non l'inverse ?
 
J'en suis là :

Code :
  1. # On coupe court la réécriture si ça existe physiquement
  2. RewriteCond %{REQUEST_FILENAME} -f [OR]
  3. RewriteCond %{REQUEST_FILENAME} -d
  4. RewriteRule ^ - [L]
  5. # Sinon, 1 première passe pour gérer le paramètre P (A-<...>.html devient <...>?P=A)
  6. RewriteRule ^([^-]+)(-.+)?\.htm$ $2?P=$1 [QSA]
  7. # Tant que l'URL contient -B-C<...>, on la modifie en <...>?B=C
  8. RewriteRule -([^-]+)-([^-]+)(.*) $3?$1=$2 [QSA,N]


Message édité par pluj le 02-09-2017 à 19:20:41
Reply

Marsh Posté le 02-09-2017 à 21:04:29    

Merci encore la rapidité et l'aide apportée :)
 
Effectivement, index.php n’apparaît jamais, même avec les redirections
 
Pour le paramètre supplémentaire, certaines pages (celles avec pagination) m'impose l'utilisation d'un 3ème paramètre.
Or avec le script précédant, il n'était pas pris en compte. Avec bbdbe-F-1-PAGE-3.htm, j'avais un 404
 
Mais avec ton dernier script, peu importe le nombre de paramètres, c'est pris compte.
 
Je te remercie beaucoup pour ton aide. Je comprends tout ce qui est fait, mais je suis pas encore à même de le faire par moi même :/
 
Encore merci :)
 
Pour ce qui est de le faire en php, hors mis en passant par :
 
ErrorDocument 404 /rewriting.php (par exemple)
 
Puis dans rewriting.php gérer l'URL et/ou l'erreur, je ne vois pas comment procéder sans avoir d'erreur 404.
M'enfin là n'est pas la question ^^
 
Je passerai peut-être par le php si je dois changer les - par des / ce qui n'est pas le cas pour le moment.
 
En tout cas, merci pour ton aide :)

Reply

Marsh Posté le 02-09-2017 à 23:32:40    

Il faut vraiment préférer une réécriture ou la directive FallbackResource que j'ai précédemment évoquée pour renvoyer ce qui n'existe pas physiquement vers PHP (chose par ailleurs à éviter tant que possible, vu que c'est plus coûteux) à l'usage de ErrorDocument 404.
 
Par réécriture, j'entends cette règle :

Code :
  1. RewriteCond %{REQUEST_FILENAME} !-f
  2. RewriteCond %{REQUEST_FILENAME} !-d
  3. RewriteRule .* /rewriting.php [L]


 
Bref, quoi qu'il en soit et si j'ai compris, c'est à ton script PHP d'indiquer le statut final de la réponse HTTP, le plus simple étant via un appel à la fonction http_response_code.


Message édité par pluj le 02-09-2017 à 23:33:16
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed