Paksa bahasa di URL. Jika URL tidak memiliki bahasa, alihkan berdasarkan bahasa browser

Saya baru saja menerjemahkan situs web saya. Untuk alasan SEO (untuk menghindari duplikat konten) saya ingin SETIAP URL memiliki bahasa di dalamnya. Misalnya, www.racebooking.net/page.php harus menjadi www.racebooking.net/en/page.php. Bagian /en/ kemudian diubah menjadi ?lang=en.

Selain itu, pengguna harus memiliki kemungkinan untuk memilih bahasa pilihan saat menjelajahi situs web.

Logika yang saya coba terapkan adalah sebagai berikut:

  • JIKA URL-nya racebooking.net/en/page.html, cukup buka page.html?lang=en apa pun bahasa browser saya
  • JIKA URL-nya racebooking.net/it/page.html, cukup buka page.html?lang=it apa pun bahasa browser saya
  • JIKA URL-nya racebooking.net/page.html, periksa bahasa browser. Jika bahasa Italia, ubah url menjadi racebooking.net/it/page.html dan buka page.html?lang=it, jika tidak, ubah url menjadi racebooking.net/en/page.html dan buka page.html?lang=en

Saya menulis htaccess ini

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /it/%1 [L,QSA,NC]

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteRule ^$ /en/%1 [L,QSA,NC]

Tapi tidak terjadi apa-apa...tidak terdeteksi bahwa /en/ atau /it/ hilang! Sepertinya RewriteCond pertama tidak terjadi...

Apalagi sepertinya akan bertentangan dengan aturan ini

RewriteRule ^(en|it)\/(.*)$ $2\?lang=$1 [L,QSA,NC]

ada ide?

EDIT Setelah diskusi panjang, @anubhava memecahkan masalahnya! Solusinya bekerja dengan sempurna. Jadi, saya mengedit pertanyaan saya agar lebih bermanfaat bagi pengunjung.


person Alberto Fontana    schedule 13.12.2013    source sumber


Jawaban (1)


Regex Anda salah khususnya. bagian ini [en|it] yang pada dasarnya cocok dengan huruf e, n, | , i, t karena merupakan kelas karakter.

Coba aturan berikut ini:

DirectoryIndex index.php

RewriteEngine on

# always www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# remove index.php from URL
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

# redirect first visitors basing on their language or redirect if language not specified
# in URL. If italian, redirect to italian
# if lang is Italian use it
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

# otherwise use English
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

# populate ?lang query parameter
RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]
person anubhava    schedule 13.12.2013
comment
Saya mencoba solusi Anda, tetapi saya mendapatkan Kesalahan Server Internal! - person Alberto Fontana; 13.12.2013
comment
Ada kesalahan ketik, saya baru saja memperbaikinya. Apakah Anda juga memiliki aturan penulisan ulang lainnya ATAU .htaccess lain di sistem Anda? - person anubhava; 13.12.2013
comment
Ya sebenarnya saya punya banyak aturan! Aturan Anda terlihat bagus, tetapi saya masih mendapatkan Kesalahan Server...BTW saya mengidentifikasi beberapa aturan yang mungkin bertentangan...karena saya memiliki Aturan yang mengubah url dengan /en/ menjadi url dengan ?lang=en Ini adalah bagian htaccess dengan konflik: pastebin.com/sEJ6qBDx dapatkah Anda melihat di mana konfliknya dan bagaimana cara memperbaikinya? - person Alberto Fontana; 14.12.2013
comment
Bolehkah saya mengetahui tujuan aturan terakhir: RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC] ? - person anubhava; 14.12.2013
comment
Juga apakah /en/ dan /it/ direktori asli? - person anubhava; 14.12.2013
comment
Itu pertanyaan yang bagus! Tidak, /en/ dan /it/ bukan subdirektori! Tujuan aturan yang Anda tanyakan adalah mengubah URL dengan /en/ menjadi URL dengan ?lang=en. Sistem terjemahan saya hanya didasarkan pada parameter GET lang. YAITU. jika $_GET['lang']=="en" halaman diterjemahkan dalam bahasa Inggris.. Untuk menghindari URL jelek dengan parameter, saya memutuskan untuk memasukkan bahasa ke dalam url. Saya selalu menunjuk ke file yang sama, tidak peduli bahasa apa yang saya jelajahi! Itu sebabnya saya menulis aturan ini - person Alberto Fontana; 14.12.2013
comment
mari kita melanjutkan diskusi ini di chat - person anubhava; 14.12.2013