Jump to content

Règles Nginx rewrite Prestashop 1.5


Gehasia

Recommended Posts

Les règles de rewrite pour prestashop 1.4 et nginx ne fonctionnaient pas correctement pour plusieurs raisons :

J'ai des urls avec accents (nouveauté de prestashop 1.5, les accents des noms de produits ne sont pas enlevés lors de l'enregistrement de link_rewrite en base de donnée)

Il n'y a plus X controllers, mais plus que index.php auquel on passe une variable GET "controller=xxx". Donc en gros, avec les accents ça ne matchait pas les règles, et avec le coup des controllers ça rewritait vers des controllers voués à disparaitre.

 

J'ai donc modifié les règles comme suit et les posts ici, ça pourrait peut-être en intéresser quelques uns:

 

	rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
	rewrite "^/c/([0-9]+)(\-[_a-zA-Z0-9-]*)/(.*)\.jpg$" /img/c/$1$2.jpg last;
	rewrite "^/c/([_a-zA-Z-]+)/(.*)\.jpg$" /img/c/$1.jpg last;
	rewrite "^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2$3.jpg last;
	rewrite "^/([0-9]+)\-([0-9]+)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2.jpg last;
	rewrite "^/([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$1$2.jpg last;
	rewrite "^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$1$2$3.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$1$2$3$4.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg last;
	rewrite "^/([0-9]+)\-(\P{M}\p{M}*)+\.html(.*)$" /index.php?controller=product&id_product=$1$3 last;
	rewrite "^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=category&id_category=$1$3 last;
	rewrite "^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$" /index.php?controller=product&id_product=$2$4 last;
	rewrite "^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$" /index.php?controller=supplier&id_supplier=$1$3 last;
	rewrite "^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$" /index.php?controller=manufacturer&id_manufacturer=$1$3 last;
	rewrite "^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms=$1$3 last;
	rewrite "^/content/category/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms_category=$1$3 last;
rewrite "^/module/([_a-zA-Z0-9-]*)/([_a-zA-Z0-9-]*)$" /index.php?fc=module&module=$1&controller=$2 last;


	rewrite ^/page-non-trouvee$ /index.php?controller=404 last;
	rewrite ^/adresse$ /index.php?controller=address last;  
	rewrite ^/adresses$ /index.php?controller=addresses last;
	rewrite ^/authentification$ /index.php?controller=authentication last;
	rewrite ^/meilleures-ventes$ /index.php?controller=best-sales last;
	rewrite ^/panier$ /index.php?controller=cart last;
	rewrite ^/contactez-nous$ /index.php?controller=contact-form last;
	rewrite ^/bons-de-reduction$ /index.php?controller=discount last;
	rewrite ^/suivi-commande-invite$ /index.php?controller=guest-tracking last;
	rewrite ^/historique-des-commandes$ /index.php?controller=history last;
	rewrite ^/identite$ /index.php?controller=identity last;
	rewrite ^/manufacturers$ /index.php?controller=manufacturer last;
	rewrite ^/mon-compte$ /index.php?controller=my-account last;
	rewrite ^/nouveaux-produits$ /index.php?controller=new-products last;
	rewrite ^/commande$ /index.php?controller=order last;
	rewrite ^/details-de-la-commande$ /index.php?controller=order-follow last;
	rewrite ^/commande-rapide$ /index.php?controller=order-opc last;
	rewrite ^/avoirs$ /index.php?controller=order-slip last;
	rewrite ^/mot-de-passe-oublie$ /index.php?controller=password last;
	rewrite ^/promotions$ /index.php?controller=prices-drop last;
	rewrite ^/recherche$ /index.php?controller=search last;
	rewrite ^/plan-du-site$ /index.php?controller=sitemap last;
	rewrite ^/magasins$ /index.php?controller=stores last;  
	rewrite ^/supplier$ /index.php?controller=supplier last;

	rewrite ^/page-not-found$ /index.php?controller=404 last;
	rewrite ^/address$ /index.php?controller=address last;  
	rewrite ^/addresses$ /index.php?controller=addresses last;
	rewrite ^/authentication$ /index.php?controller=authentication last;
	rewrite ^/best-sales$ /index.php?controller=best-sales last;
	rewrite ^/cart$ /index.php?controller=cart last;
	rewrite ^/contacts$ /index.php?controller=contact-form last;
	rewrite ^/discount$ /index.php?controller=discount last;
	rewrite ^/guest-tracking$ /index.php?controller=guest-tracking last;
	rewrite ^/order-history$ /index.php?controller=history last;
	rewrite ^/identity$ /index.php?controller=identity last;
	rewrite ^/manufacturers$ /index.php?controller=manufacturer last;
	rewrite ^/my-account$ /index.php?controller=my-account last;
	rewrite ^/new-products$ /index.php?controller=new-products last;
	rewrite ^/order$ /index.php?controller=order last;
	rewrite ^/order-follow$ /index.php?controller=order-follow last;
	rewrite ^/quick-order$ /index.php?controller=order-opc last;
	rewrite ^/order-slip$ /index.php?controller=order-slip last;
	rewrite ^/password-recovery$ /index.php?controller=password last;
	rewrite ^/prices-drop$ /index.php?controller=prices-drop last;  
	rewrite ^/search$ /index.php?controller=search last;
	rewrite ^/sitemap$ /index.php?controller=sitemap last;
	rewrite ^/stores$ /index.php?controller=stores last;  
	rewrite ^/supplier$ /index.php?controller=supplier last;


 

(j'ai aussi fait une pastebin :

http://pastebin.com/W1Kpn4W9

)

 

C'est loin d'être parfait, je pense que ça risque déconner avec des "manufacturer" ou "supplier" avec des accents, mais comme je ne les utilises pas, je n'ai pas adapté spécifiquement les règles.

 

En gros les règles du type :

([a-zA-Z0-9]*)

ne match pas les caractères accentués en utf-8

Il faut soir les remplacer par un (.*) qui prend tout...soit par un

(\P{M}\p{M}*)*

utf ready (que je ne pense pas être parfait, mais moi et les regexp ça fait deux...)

Edited by Gehasia (see edit history)
  • Like 1
Link to comment
Share on other sites

Les règles de rewrite pour prestashop 1.4 et nginx ne fonctionnaient pas correctement pour plusieurs raisons :

J'ai des urls avec accents (nouveauté de prestashop 1.5, les accents des noms de produits ne sont pas enlevés lors de l'enregistrement de link_rewrite en base de donnée)

Il n'y a plus X controllers, mais plus que index.php auquel on passe une variable GET "controller=xxx". Donc en gros, avec les accents ça ne matchait pas les règles, et avec le coup des controllers ça rewritait vers des controllers voués à disparaitre.

 

J'ai donc modifié les règles comme suit et les posts ici, ça pourrait peut-être en intéresser quelques uns:

 

	rewrite ^/api/?(.*)$ /webservice/dispatcher.php?url=$1 last;
	rewrite "^/c/([0-9]+)(\-[_a-zA-Z0-9-]*)/(.*)\.jpg$" /img/c/$1$2.jpg last;
	rewrite "^/c/([_a-zA-Z-]+)/(.*)\.jpg$" /img/c/$1.jpg last;
	rewrite "^/([a-z0-9]+)\-([a-z0-9]+)(\-[_a-zA-Z0-9-]*)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2$3.jpg last;
	rewrite "^/([0-9]+)\-([0-9]+)/(\P{M}\p{M}*)*\.jpg$" /img/p/$1-$2.jpg last;
	rewrite "^/([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$1$2.jpg last;
	rewrite "^/([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$1$2$3.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$1$2$3$4.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$1$2$3$4$5.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$1$2$3$4$5$6.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$1$2$3$4$5$6$7.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$1$2$3$4$5$6$7$8.jpg last;
	rewrite "^/([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])(\-[_a-zA-Z0-9-]*)?/(\P{M}\p{M}*)*\.jpg$" /img/p/$1/$2/$3/$4/$5/$6/$7/$8/$1$2$3$4$5$6$7$8$9.jpg last;
	rewrite "^/([0-9]+)\-(\P{M}\p{M}*)+\.html(.*)$" /index.php?controller=product&id_product=$1$3 last;
	rewrite "^/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=category&id_category=$1$3 last;
	rewrite "^/([a-zA-Z0-9-]*)/([0-9]+)\-([a-zA-Z0-9-]*)\.html(.*)$" /index.php?controller=product&id_product=$2$4 last;
	rewrite "^/([0-9]+)__([a-zA-Z0-9-]*)(.*)$" /index.php?controller=supplier&id_supplier=$1$3 last;
	rewrite "^/([0-9]+)_([a-zA-Z0-9-]*)(.*)$" /index.php?controller=manufacturer&id_manufacturer=$1$3 last;
	rewrite "^/content/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms=$1$3 last;
	rewrite "^/content/category/([0-9]+)\-([a-zA-Z0-9-]*)(.*)$" /index.php?controller=cms&id_cms_category=$1$3 last;

 

(j'ai aussi fait une pastebin :

http://pastebin.com/0jy1iCCh

)

 

C'est loin d'être parfait, je pense que ça risque déconner avec des "manufacturer" ou "supplier" avec des accents, mais comme je ne les utilises pas, je n'ai pas adapté spécifiquement les règles.

 

En gros les règles du type :

([a-zA-Z0-9]*)

ne match pas les caractères accentués en utf-8

Il faut soir les remplacer par un (.*) qui prend tout...soit par un

(\P{M}\p{M}*)*

utf ready (que je ne pense pas être parfait, mais moi et les regexp ça fait deux...)

 

Ben écoute moi je dis que c'est une excellente entrée en matière et que même si tu indiques que ça ne résoud pas tout , tu as le mérite d'apporter une solution .

Congrats then !

Link to comment
Share on other sites

Ben écoute moi je dis que c'est une excellente entrée en matière et que même si tu indiques que ça ne résoud pas tout , tu as le mérite d'apporter une solution .

Congrats then !

 

Hehe merci ;) !

 

Pour la peine j'ai ajouté plein de règles manquantes dans le premier post, donc cela devrait être maintenant 100% fonctionnel (il manquait tous les rewritings du genre mon-compte ou historique-de-commandes etc.). J'ai vérifié au passage, prestashop 1.5 ne met pas les accents dans les urls pour les fabricants et marques, donc pas de soucis de ce côté-là comme je pouvais le penser.

C'est actuellement en test sur ma plateforme, et pour le moment pas de soucis à priori. Y'a juste les règles pour les modules dont je ne suis pas certain (je ne sais pas comment prestashop passe les paramètres dans certains cas), donc ça marche avec les modules de paiements standards en tout cas, mais il est possible que ça ne passe pas pour certains modules frontend (mais bon la logique voudrait que ça passe).

 

Je répète par contre, ce sont des règles pour prestashop >=1.5.0

  • Like 1
Link to comment
Share on other sites

  • 3 months later...

Hehe merci ;) !

 

Pour la peine j'ai ajouté plein de règles manquantes dans le premier post, donc cela devrait être maintenant 100% fonctionnel (il manquait tous les rewritings du genre mon-compte ou historique-de-commandes etc.). J'ai vérifié au passage, prestashop 1.5 ne met pas les accents dans les urls pour les fabricants et marques, donc pas de soucis de ce côté-là comme je pouvais le penser.

C'est actuellement en test sur ma plateforme, et pour le moment pas de soucis à priori. Y'a juste les règles pour les modules dont je ne suis pas certain (je ne sais pas comment prestashop passe les paramètres dans certains cas), donc ça marche avec les modules de paiements standards en tout cas, mais il est possible que ça ne passe pas pour certains modules frontend (mais bon la logique voudrait que ça passe).

 

Je répète par contre, ce sont des règles pour prestashop >=1.5.0

 

Un grand merci à toi. Je pense que tu as fait gagner un temps précieux à plus d'un !

Link to comment
Share on other sites

  • 2 months later...

Je viens de monter un nouveau server pour un nouveau site.

mais cette fois si avec les derniers version de nginx 1.2.8 et prestashop 1.5.4.1

 

J'ai problème avec cette entrée, nginx la refuse alors qu'avant avec les rules ci-dessus ca fonctionnais bien!?

 

(\P{M}\p{M}*)*

 

C'est peut etre du au ngx_pagespeed ?! mais sans les rules ca fonctionne bien

 

Ou alors un changement sous Presstashop, car j'ai remarquer que les ID des langues avais changer et cela crée quelques perturbations.

Si vous avez une mise à jours des ces rules pour prestashop 1.5.4.1 c'est Welcome!

Link to comment
Share on other sites

  • 1 year later...

Bonjour,

Ceci n'est pas une bonne solution de configuration avec nginx. Car cela obligera a modifier le fichier de configuration nginx a chaque ajout d'url s'implifié.

Pour le rendre fonctionnelle :

Il faut tout d'abord ajouter dans le fichier de configuration du pool php-fpm,

env[HTTP_MOD_REWRITE] = "on"

C'est la variable qu'attend prestashop pour tester si le rewrite est bien actif.

Ensuite dans le fichier nginx, server ajouter :

location / {
try_files $uri $uri/ /index.php?q=$request_uri;
}

ainsi en cas de 404, il va tester le passage au controler et si une redirection existe elle sera appliquée.

cdlt

David

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...