Il faut que tu mettes cette règle tout en haut de ton fichier.
Version imprimable
Il faut que tu mettes cette règle tout en haut de ton fichier.
je l'ai mise tout au début mais ça ne change rien, quand je tape https://www.moroccan-arts.com/uk/account ça me redirige toujours vers https://www.moroccan-arts.com/account/?tld=uk
tu ne penses pas que quelque chose cloque avec cette ligne:
voici mon htaccess en entier:Code:RewriteRule ^([a-z]{2})/(.*)$ /$2?tld=$1 [QSA,L]
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 # some PHP rules are set in an .htaccess file in / ## activate rewriting rules RewriteEngine on ## force trailing slash RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} -d RewriteRule .*[^/]$ /$0/ [L,R=301] ## rewriting rules for the .com, keep only moroccan-arts.com as an official URL for international english RewriteCond %{HTTP_HOST} \.com$ RewriteCond %{HTTP_HOST} !www\.moroccan-arts\.com$ RewriteRule (.*) http://www.moroccan-arts.com/$1 [L,R=301] ## rewriting rules for the .co.uk, redirect all to moroccan-arts.com/uk/ RewriteCond %{HTTP_HOST} \.co\.uk$ RewriteRule (.*) http://www.moroccan-arts.com/uk/$1 [L,R=301] ## rewriting rules for the .fr, redirect all to moroccan-arts.com/fr/ RewriteCond %{HTTP_HOST} \.fr$ RewriteRule (.*) http://www.moroccan-arts.com/fr/$1 [L,R=301] ## folders of languages RewriteRule ^us/$ / [R,L] RewriteRule ^us/(.*)$ /$1 [R,L] RewriteRule ^[a-z]{2}$ /$0/ [R,L] RewriteRule ^([a-z]{2})/(.*)$ /$2?tld=$1 [QSA,L] ## catalogue browser RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{2})([0-9]{2})/$ /catalogue.php?id_cat1=$1&id_cat3=$2 [QSA,L] ## product details RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{6})\.html$ /product-info.php?id_prod_material=$1 [QSA,L]
account est un vrai répertoire qui existe ?
Oui, c'est un vrai dossier qui existe!!
et ce qui est vraiment bizarre dans toute cette histoire c'est qui si je commente cette ligne: RewriteCond %{REQUEST_FILENAME} -d
site.com/uk/account est redirigé vers site.com/uk/account/
MAIS site.com/fr/account est redirigé vers site.com/account/?tld=fr
Je ne comprends plus rien :(
En gros, il y a redirection parce que la première URL réécrite /account?tld=uk correspond à un répertoire qui existe (si tu retires la query string) et qui ne se termine pas par un /, donc au second tour de réécriture, Apache fait la redirection.
Tu peux mettre ceci :
mais je ne suis pas sûr que ça aille pour toutes les URL. L'alternative est d'ajouter un paramètre d'URL bidon que tu vérifies dans la règle de redirection sur le répertoire ne se terminant pas par / pour ne pas réécrire :Code:RewriteRule ^([a-z]{2})/(.*)$ /$2/?tld=$1 [QSA,L]
Code:
1
2
3
4
5
6
7
8
9 ## force trailing slash RewriteCond %{QUERY_STRING} !noredirect=true RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} -d RewriteRule .*[^/]$ /$0/ [L,R=301] ... RewriteRule ^([a-z]{2})/(.*)$ /$2?tld=$1&noredirect=true [QSA,L]
On y est presque :)
j'ai mis
et ça marche bien a un petit détail près :)Code:RewriteRule ^([a-z]{2})/(.*)$ /$2/?tld=$1 [QSA,L]
avectout au début comme tu me l'as conseillé, ça ne force pas le slash a la fin site.com/uk/account reste tel quel!Code:
1
2
3 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} -d RewriteRule .*[^/]$ /$0/ [L,R=301]
si par contre je commenteil rajoute le slash a la fin pour les dossiers MAIS il me le rajoute aussi pour la page détails du produits (http://www.moroccan-arts.com/lantern...-4-101115.html)Code:RewriteCond %{REQUEST_FILENAME} -d
sais tu de quoi il peut s'agir??
Merci infiniment
Pourquoi tu veux commenter cette ligne si ça marche avec ? Cette ligne sert à dire à Apache d'ajouter un / à la fin d'une URL sans / terminal si cette URL correspond à un vrai répertoire. Donc forcément, si tu retires cette condition, toutes les URL ne se terminant pas par / sont redirigées.
Ben justement ça ne marche pas quand la ligne est decommentée.
Il faut que je commente la ligne pour qu'il rajoute les slash a la fin des dossiers, ce qui est très bizarre...!
La ligne est maintenant commentée, teste et tu verras!
Je ne sais pas trop ce qu'il se passe. Tu as essayé l'autre solution que j'ai donnée ?
la je suis en deplqcement et je n'ai pas trop acces a internet. je testerai ce que tu m'as propose des que j'ai l'occas et t'en tiendrai au courant...
Merci pour tout
Bonjour _Mac_
effectivement, ça ne marche pas pour toutes les URL comme par exemple pour http://www.moroccan-arts.com/lantern...-4-101115.html qui me rajoute un slash a la fin!Citation:
Tu peux mettre ceci :
mais je ne suis pas sûr que ça aille pour toutes les URLCode:RewriteRule ^([a-z]{2})/(.*)$ /$2/?tld=$1 [QSA,L]
ça non plus ça ne règle pas le problème!Citation:
L'alternative est d'ajouter un paramètre d'URL bidon que tu vérifies dans la règle de redirection sur le répertoire ne se terminant pas par / pour ne pas réécrire...
mais voici la solution que j'ai trouvé et qui a l'air de bien marcher a tous les cas:
J'ai viré la ligne rouge, et rajouté la ligne verte!Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 ## activate rewriting engine RewriteEngine on ## force trailing slash RewriteCond %{REQUEST_FILENAME} !-f #RewriteCond %{REQUEST_FILENAME} -d RewriteCond %{REQUEST_URI} !^/.*\.(php|html)$ RewriteRule .*[^/]$ /$0/ [L,R=301] ## folders of languages RewriteRule ^us/(.*)$ /$1 [R,L] RewriteRule ^([a-z]{2})/(.*)$ /$2?tld=$1 [QSA,L] ## catalogue browser RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{2})([0-9]{2})/$ /catalogue.php?id_cat1=$1&id_cat3=$2 [QSA,L] ## product details RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{6})\.html$ /product-info.php?id_prod_material=$1 [QSA,L]
Impressionnant mais ça marche bien! as tu une explication a ceci ? ou y a t il une amélioration du code??
A bientôt
Bonsoir,
De retour pour quelques détails :)
j'ai trouve un "meilleur" code pour forcer un slash a la fin et qui fonctionne bien, je le poste au cas ou ça intéresse quelqu'un ;)
j'aurais 3 petites dernières question STP :)
1- est ce bien utile et important cette histoire de slash a la fin des URL??
2- quand j'ai une erreur 404, c'est le message en anglais qui est affiché, comment pourrais je conserver le code de la langue?
3- lorsque je suis sur http://www.moroccan-arts.com/uk/test-index.php et que j'enlève le '-', il me redirige vers http://www.moroccan-arts.com/test-index.php?tld=uk, je pense que ça vient de l'hébergeur, je sais qu'ils ont une sorte de script qui corrige les url, genre tu tapes inde.php, tu es redirigé vers la bonne url qui est index.php. dois je les contacter pour ce problème?
Merci beaucoup
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 ## activate rewriting engine RewriteEngine on ## force trailing slash RewriteCond %{REQUEST_URI} /+[^\.]+$ RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [L,R=301] ## folders of languages RewriteRule ^us/(.*)$ /$1 [R,L] RewriteRule ^([a-z]{2})/(.*)$ /$2?tld=$1 [QSA,L] ## catalogue browser RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{2})([0-9]{2})/$ /catalogue.php?id_cat1=$1&id_cat3=$2 [QSA,L] ## product details RewriteRule ^[a-z0-9-]+/[a-z0-9-]+-([0-9]{6})\.html$ /product-info.php?id_prod_material=$1 [QSA,L] ## error pages ErrorDocument 403 /error-403.html ErrorDocument 404 /error-404.html ErrorDocument 500 /error-500.html ## Redirect the error pages (403, 404, 500, javascript deactivated) RewriteRule ^error-(403|404|500)\.html$ /error.php?error=$1 [QSA,L]
Absolument pas. C'est toi qui vois.
C'est un message à toi ou le message d'erreur par défaut d'Apache ? Le mieux c'est que tu utilises tes propres pages d'erreur (directive ErrorDocument) qui sont en fait des pages PHP qui gèrent le code de langue. L'intérêt de tes propres pages d'erreur, en dehors de l'aspect langue, est que tu peux conserver un joli affichage cohérent avec ta charte graphique.
Non, ça doit être parce que la négociation de contenu Apache est activée par défaut. Il faut que tu mettes ceci tout en haut de ton .htaccess :
Mais attention, cela peut avoir une influence sur le comportement de ton site et tes réécritures notamment.Code:Options -MultiViews
c'est un message a moi, et voici justement le code que je mets:Citation:
C'est un message à toi ou le message d'erreur par défaut d'Apache ? Le mieux c'est que tu utilises tes propres pages d'erreur (directive ErrorDocument) qui sont en fait des pages PHP qui gèrent le code de langue. L'intérêt de tes propres pages d'erreur, en dehors de l'aspect langue, est que tu peux conserver un joli affichage cohérent avec ta charte graphique.
le problème c'est qu'il me redirige toujours vers /error-404.html (page US) quelque soit la langue. comment pourrais je récupérer le code de la langue pour afficher le message dans la langue appropriée??Code:ErrorDocument 404 /error-404.html
Tu dois déclarer cette page PHP dans ton ErrorDocument à la place de ta page .html, et dans cette page PHP, il faut que tu récupères la langue. Ca peut être simple comme ça peut être compliqué. Si le code de langue figure toujours dans l'URL qui figure dans la barre d'adresse du navigateur, tu dois pouvoir récupérer cette URL, donc le code de langue avec une variable de $_SERVER. Mais le problème c'est qu'il faut parser cette URL pour retrouver le code de langue. Du coup, le plus simple c'est peut-être de stocker et récupérer en session le code de langue, si tu utilises les sessions, bien sûr.
Ca marche, merci beaucoup ;)
@ bientot