Réécriture de l’URL et création d’une nouvelle URL dans la barre d’adresse

J’utilise le code ci-dessous pour réécrire quelques URL:

RewriteEngine On Options +FollowSymlinks RewriteBase / RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/ 

Gardez à l’esprit qu’il y a aussi cette règle en dessous de cela ..

 RewriteRule ^([a-zA-Z]{2})/ state.php?state=$1 [L] 

Maintenant, ce que je veux réaliser, c’est si quelqu’un va par exemple:

 www.mydomain.com/New_Hampshire/index.html 

Je veux que la barre de localisation affiche:

 www.mydomain.com/NH/ 

D’habitude, je suis capable d’atteindre cet objective en utilisant le drapeau [R] à la fin, mais dans ce cas, cela ne fonctionne pas, ce que je suppose que cela peut avoir quelque chose à voir avec la règle secondaire.

Est-ce possible?

Aussi, comment puis-je changer cela pour qu’il redirige aussi:

 www.mydomain.com/New_Hampshire/ 

Comme vous pouvez le voir, ce qui précède ne contient pas de référence à index.html .

Enfin, si je voulais réaliser ces redirections 301 , ferais-je quelque chose comme ça?

 RewriteRule ^New_Hampshire/[a-zA-Z0-9_+\-\s]*\.html$ NH/ [R=301] 

Vous devez comprendre la différence entre la réécriture d’URL (réalisée dans votre cas par le mod_rewrite d’Apache) et la redirection, qui fait partie de la spécification HTTP et est obtenue en envoyant un en-tête HTTP standard et un code d’état au client (navigateur).

Avec la réécriture d’URL, lorsqu’une requête est traitée par le serveur Web, vous avez la possibilité de mapper une URL demandée envoyée par le client vers une ressource locale représentée par un chemin local différent. Cela se fait pour diverses raisons, comme la possibilité de présenter des URL propres et courtes à un utilisateur, de masquer la structure interne des ressources sur le serveur, de protéger certaines ressources, etc.

Le navigateur ne sait généralement pas qu’une URL a été réécrite par le serveur (sauf indication contraire) et affichera toujours l’URL demandée d’origine dans la barre d’adresse. Il n’est pas possible de manipuler à distance l’URL demandée par le client sans que le client le sache.

La redirection HTTP, d’autre part, fait partie de la spécification HTTP et permet de dire au client que l’URL demandée peut être trouvée à un autre endroit. Le serveur Web le fait en envoyant un en-tête “Location” avec l’URL redirigée et un code d’état HTTP qui indique au client ce qui s’est passé. Il existe plusieurs codes de statut 30x pour cela, les plus couramment utilisés étant 301 pour indiquer au client que la ressource a été déplacée de manière permanente et doit être adressée par la nouvelle URL désormais et 302 pour indiquer au navigateur que la ressource a été trouvée mais temporaire réside sous une nouvelle URL (l’implémentation d’Apache utilise 302 par défaut lorsque vous spécifiez l’indicateur R dans la règle).

Le client recevra une réponse HTTP avec le nouvel emplacement et le code d’état et émettra une nouvelle requête HTTP à la nouvelle URL. Il remplacera également l’emplacement dans la barre d’adresse s’il s’agit de la requête principale (c’est-à-dire pas une demande secondaire à une ressource telle qu’une image ou un script).

Voir http://httpd.apache.org/docs/current/rewrite/flags.html#flag_r

Notez que la documentation d’Apache conseille d’utiliser l’indicateur L avec l’indicateur de redirection (par exemple [R, L] ou [R = 301, L]) ou vous pouvez obtenir des résultats inattendus (car il continuera à traiter les règles suivantes). C’est probablement pourquoi votre drapeau R ne fonctionne pas.

Donc, vous pouvez faire quelque chose comme ça (juste un exemple):

 RewriteRule ^New_Hampshire.* NH/ [R=301, L] 

Ceci redirecta le client de n’importe quel préfixe / New_Hampshire (avec ou sans l’URL * .html) vers NH / et changera la barre d’adresse.

Ensuite, la règle suivante:

 RewriteRule ^NH/? state.php?state=NH [L] 

Ou plus générique:

 RewriteRule ^([a-zA-Z]{2})/? state.php?state=$1 [L] 

Cela attrape l’URL NH (ou autre état) et la réécrit dans la ressource réelle appropriée (state.php).

MAIS , ce n’est qu’un exemple pour vous montrer les règles. Vous devez probablement gérer la logique de la première règle. Parce que quelque chose doit faire correspondre les noms d’états complets (New_Hampshire) aux raccourcis (NH), sauf si vous voulez écrire une règle pour chaque état.