บังคับภาษาใน URL หาก URL ไม่มีภาษา ให้เปลี่ยนเส้นทางตามภาษาของเบราว์เซอร์

ฉันเพิ่งแปลเว็บไซต์ของฉัน ด้วยเหตุผล SEO (เพื่อหลีกเลี่ยงเนื้อหาที่ซ้ำกัน) ฉันต้องการให้ทุก URL มีภาษาอยู่ในนั้น ตัวอย่างเช่น www.racebooking.net/page.php จะต้องกลายเป็น www.racebooking.net/en/page.php จากนั้นส่วน /en/ จะถูกแปลงเป็น ?lang=en

นอกจากนี้ ผู้ใช้จะต้องมีความเป็นไปได้ที่จะเลือกภาษาที่ต้องการเมื่อเรียกดูเว็บไซต์

ตรรกะที่ฉันพยายามใช้มีดังต่อไปนี้:

  • หาก URL คือ racebooking.net/en/page.html เพียงไปที่ page.html?lang=en ไม่ว่าเบราว์เซอร์ของฉันจะเป็นภาษาใดก็ตาม
  • หาก URL คือ racebooking.net/it/page.html เพียงไปที่ page.html?lang=it ไม่ว่าเบราว์เซอร์ของฉันจะเป็นภาษาใดก็ตาม
  • หาก URL คือ racebooking.net/page.html ให้ตรวจสอบภาษาของเบราว์เซอร์ หากเป็นภาษาอิตาลี ให้แปลง URL เป็น racebooking.net/it/page.html และไปที่ page.html?lang=it หรือในกรณีอื่นๆ ให้แปลง URL เป็น racebooking.net/en/page.html และไปที่ page.html?lang=en

ฉันเขียน htaccess นี้

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]

แต่ไม่มีอะไรเกิดขึ้น...แต่ตรวจไม่พบว่า /en/ หรือ /it/ หายไป! ดูเหมือนว่า RewriteCond แรกจะไม่เกิดขึ้น...

อีกทั้งดูเหมือนว่าจะขัดแย้งกับกฎข้อนี้ด้วย

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

มีความคิดอะไรบ้าง?

แก้ไข หลังจากพูดคุยกันมานาน @anubhava ก็แก้ไขปัญหาได้! วิธีแก้ปัญหาของเขาทำงานได้อย่างสมบูรณ์แบบ ดังนั้นฉันจึงแก้ไขคำถามเพื่อให้เป็นประโยชน์สำหรับผู้เยี่ยมชมมากขึ้น


person Alberto Fontana    schedule 13.12.2013    source แหล่งที่มา


คำตอบ (1)


regex ของคุณผิดโดยเฉพาะ ส่วนนี้ [en|it] ซึ่งโดยทั่วไปจะตรงกับตัวอักษร e, n, | , i, t เนื่องจากเป็นคลาสอักขระ

ลองใช้กฎเหล่านี้แทน:

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
ฉันลองวิธีแก้ปัญหาของคุณแล้ว แต่ฉันได้รับข้อผิดพลาดเซิร์ฟเวอร์ภายใน! - person Alberto Fontana; 13.12.2013
comment
มีพิมพ์ผิด ผมเพิ่งแก้ไขครับ คุณมีกฎการเขียนซ้ำอื่น ๆ หรือ .htaccess อื่น ๆ ในระบบของคุณหรือไม่? - person anubhava; 13.12.2013
comment
ใช่แล้ว ฉันมีกฎมากมาย! กฎของคุณดูดี แต่ฉันยังคงได้รับข้อผิดพลาดของเซิร์ฟเวอร์...BTW ฉันระบุกฎสองสามข้อที่อาจขัดแย้งกัน...เพราะฉันมีกฎที่แปลง URL ด้วย /en/ เป็น URL ด้วย ?lang=en นี่คือส่วน htaccess ที่มี ข้อขัดแย้ง: pastebin.com/sEJ6qBDx คุณเห็นไหมว่าข้อขัดแย้งอยู่ที่ไหนและจะแก้ไขได้อย่างไร - person Alberto Fontana; 14.12.2013
comment
ฉันขอทราบวัตถุประสงค์ของกฎข้อสุดท้าย: RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC] ได้ไหม - person anubhava; 14.12.2013
comment
/en/ และ /it/ ไดเร็กทอรีจริงด้วยหรือไม่ - person anubhava; 14.12.2013
comment
นั่นเป็นคำถามที่ดี! ไม่ /en/ และ /it/ ไม่ใช่ไดเรกทอรีย่อย! วัตถุประสงค์ของกฎที่คุณถามคือการแปลง URLS ที่มี /en/ เป็น URLS ที่มี ?lang=en ระบบการแปลของฉันใช้พารามิเตอร์ GET lang เช่น. ถ้า $_GET['lang']=="en" หน้าเว็บแปลเป็นภาษาอังกฤษ.. เพื่อหลีกเลี่ยง URL ที่น่าเกลียดพร้อมพารามิเตอร์ ฉันจึงตัดสินใจแทรกภาษาลงใน URL ฉันชี้ไปที่ไฟล์เดิมเสมอไม่ว่าฉันจะเรียกดูภาษาใดก็ตาม! นั่นเป็นเหตุผลที่ฉันเขียนกฎนี้ - person Alberto Fontana; 14.12.2013
comment
ให้เราสนทนาต่อในการแชท - person anubhava; 14.12.2013