RewriteRule กำหนดกฎสำหรับกลไกการเปลี่ยนแปลง
ไวยากรณ์: การทดแทนรูปแบบ RewriteRule(ตัวอย่าง RewriteRule ^tags$ /tags.php [L] )
ในการทดแทน คุณยังสามารถใช้แฟล็กพิเศษได้โดยเพิ่มโครงสร้างต่อไปนี้:
เป็นอาร์กิวเมนต์ที่สามของคำสั่ง RewriteRule ธงถูกคั่นด้วยเครื่องหมายจุลภาค รายการถัดไปธง:
- "redirect|R [=code]" (ทำให้เกิดการเปลี่ยนเส้นทาง)
คำนำหน้าในการทดแทนเช่น http://thishost[:thisport]/ (ซึ่งสร้าง URL ใหม่จาก URI บางตัว) จะทริกเกอร์การเปลี่ยนเส้นทางภายนอก หากไม่มีรหัสในการทดแทนคำตอบก็จะเป็นด้วย สถานะ HTTP 302 (ย้ายชั่วคราว) หากคุณต้องการใช้รหัสตอบกลับอื่นในช่วง 300-400 เพียงเขียนเป็นตัวเลขหรือใช้ชื่อสัญลักษณ์อย่างใดอย่างหนึ่งต่อไปนี้: temp (ค่าเริ่มต้น), ถาวร, seeother ใช้ในคำสั่งที่ต้องการแปลง URL เสมือนบางส่วนให้เป็น URL จริงและส่งคืนไปยังไคลเอ็นต์ เช่น การแปลง "/~" เป็น "/u/" หรือเพิ่มเครื่องหมายทับลงใน /u/user เสมอ เป็นต้น
หมายเหตุ: เมื่อใช้แฟล็กนี้ ตรวจสอบให้แน่ใจว่าฟิลด์การค้นหาเป็น URL ที่ถูกต้อง! ถ้าไม่เช่นนั้น คุณกำลังเปลี่ยนเส้นทางไปยังที่ไหนเลย! และจำไว้ว่าแฟล็กนี้เป็นส่วนเสริมเท่านั้น สตริง URL http://thishost[:thisport]/ และกระบวนการแปลงดำเนินต่อไป นอกจากนี้ โดยปกติแล้วคุณต้องการหยุดและทำการเปลี่ยนเส้นทางนี้ทันที หากต้องการหยุดกระบวนการแปลง คุณต้องเขียนแฟล็ก "L" ด้วย
- "forbidden|F" (ทำให้ URL ถูกห้าม)
มันทำ URL ปัจจุบันห้าม เช่น การตอบกลับที่มีสถานะ HTTP 403 ( FORBIDDEN ) จะถูกส่งไปยังไคลเอนต์ทันที ใช้แฟล็กนี้ร่วมกับ RewriteConds ที่เกี่ยวข้องเพื่อบล็อก URL ตามเกณฑ์ที่กำหนด
- "gone|G" (ทำให้ URL "เสีย")
การตั้งค่าสถานะนี้ทำให้ URL ปัจจุบันเป็น "เสีย" กล่าวคือ การตอบสนอง HTTP ที่มีสถานะ 410 (GONE) จะถูกส่งทันที ใช้แฟล็กนี้เพื่อทำเครื่องหมายเพจที่ไม่มีอยู่อีกต่อไปว่าใช้งานไม่ได้
- "proxy|P" (เรียกพร็อกซี)
แฟล็กนี้ทำเครื่องหมายส่วนไวด์การ์ดเป็นคำขอพร็อกซีภายใน และทันที (เช่น กระบวนการแปลหยุดที่นี่) จะส่งผ่านโมดูลพร็อกซีทันที คุณต้องตรวจสอบให้แน่ใจว่าสตริงไวด์การ์ดนั้นเป็น URI จริง (เช่น โดยทั่วไปจะขึ้นต้นด้วย http://hostname) ที่พร็อกซีประมวลผลได้ โมดูลอาปาเช่- หากไม่เป็นเช่นนั้น คุณจะได้รับข้อผิดพลาดจากโมดูลพร็อกซี ใช้แฟล็กนี้เพื่อให้เกิดการนำคำสั่ง ProxyPass ไปใช้ที่มีประสิทธิภาพมากขึ้น ซึ่งรวมเนื้อหาบางส่วนไว้ด้วย เซิร์ฟเวอร์ระยะไกลไปยังเนมสเปซเซิร์ฟเวอร์ภายในเครื่อง
หมายเหตุ: หากต้องการใช้สิ่งนี้ ตรวจสอบให้แน่ใจว่าคุณมีโมดูลพร็อกซีที่ใช้งานได้บนเซิร์ฟเวอร์ Apache ของคุณ หากคุณไม่ทราบสิ่งนี้ ให้ตรวจสอบว่ามีบรรทัด mod_proxy.c ในเอาต์พุตของ “httpd -l” หรือไม่ หากเป็นเช่นนั้น ความสามารถเหล่านี้มีอยู่ใน mod_rewrite ถ้าไม่เช่นนั้น อันดับแรกคุณต้องสร้างโปรแกรม "httpd" ใหม่โดยเปิดใช้งานโมดูลพร็อกซี
- "สุดท้าย|L" ( กฎข้อสุดท้าย)
หยุดกระบวนการแปลง ณ จุดนี้และไม่ใช้กฎการแปลงใดๆ เพิ่มเติม ซึ่งสอดคล้องกับตัวดำเนินการสุดท้ายใน Perl หรือ ไปยังผู้ดำเนินการเบรกใน C. ใช้แฟล็กนี้เพื่อป้องกันไม่ให้ URL ปัจจุบันถูกแปลงตามกฎการแปลงที่ตามมา ตัวอย่างเช่น ใช้สิ่งนี้เพื่อแปลง URL รากจาก ("/") เป็น URL จริงเช่น "/e/www/"
- "ถัดไป|N" (รอบถัดไป)
เริ่มกระบวนการเปลี่ยนแปลงใหม่ (เริ่มจากกฎข้อแรก) ในกรณีนี้ URL จะถูกจับคู่กับเงื่อนไขบางอย่างอีกครั้ง แต่ไม่ใช่ URL ดั้งเดิม แต่เป็น URL ที่มาจากกฎการแปลครั้งล่าสุด ซึ่งสอดคล้องกับคำสั่งถัดไปในภาษา Perl หรือ ไปยังผู้ดำเนินการต่อไปจากภาษา C ใช้แฟล็กนี้เพื่อเริ่มกระบวนการแปลงใหม่ กล่าวคือ ข้ามไปที่จุดเริ่มต้นของลูปโดยไม่มีเงื่อนไข
อย่างไรก็ตาม ระวังอย่าให้วนซ้ำไม่สิ้นสุด!
- "chain|C" (ลิงก์ไปยังกฎถัดไป)
การตั้งค่าสถานะนี้จะเชื่อมโยงกฎปัจจุบันกับกฎถัดไป (ซึ่งสามารถเชื่อมโยงกับกฎถัดไปได้ เป็นต้น) สิ่งนี้มีผลกระทบดังต่อไปนี้: หากกฎตรงกัน กระบวนการจะดำเนินต่อไปตามปกติ กล่าวคือ แฟล็กจะไม่มีผลใดๆ หากกฎไม่ตรงกับเงื่อนไข กฎที่เกี่ยวข้องทั้งหมดจะถูกข้ามไป ตัวอย่างเช่น ใช้สิ่งนี้เพื่อลบส่วน ".www" ในกฎการกำหนดค่าบริบทไดเรกทอรีที่ทำงานอยู่เมื่อคุณอนุญาตให้มีการเปลี่ยนเส้นทางภายนอก (โดยที่ไม่ควรมี ".www"!)
- "type|T=MIME-type" (บังคับตั้งค่า ประเภทไมม์)
บังคับให้ประเภท MIME ของไฟล์เป้าหมายตั้งค่าเป็นประเภท MIME ตัวอย่างเช่น สามารถใช้จำลองคำสั่ง mod_alias ScriptAlias ซึ่งบังคับให้ไฟล์ทั้งหมดภายในไดเร็กทอรีที่แสดงมีประเภท MIME เป็น "application/x-httpd-cgi"
- "nosubreq|NS" (ใช้เฉพาะในกรณีที่ไม่ใช่แบบสอบถามย่อยภายใน)
การตั้งค่าสถานะนี้จะบอกเอ็นจิ้นการแปลงให้ข้ามคำสั่งหากแบบสอบถามย่อยปัจจุบันเป็นแบบสอบถามย่อยภายใน ตัวอย่างเช่น แบบสอบถามย่อยภายในใน Apache เกิดขึ้นเมื่อ mod_include พยายามรับข้อมูลเกี่ยวกับ ไฟล์ที่เป็นไปได้ค่าเริ่มต้นสำหรับไดเร็กทอรี (index.xxx) สำหรับแบบสอบถามย่อย สิ่งนี้อาจไม่มีประโยชน์เสมอไป และบางครั้งก็ทำให้เกิดปัญหาในการดำเนินการของคำสั่งการแปลงทั้งชุด ใช้แฟล็กนี้เพื่อยกเว้นกฎบางอย่าง
ใช้ กฎถัดไปขึ้นอยู่กับดุลยพินิจของคุณเอง: เมื่อใดก็ตามที่คุณเติมคำนำหน้า URL บางรายการแล้วส่งต่อไปยังสคริปต์ CGI เพื่อประมวลผล มีโอกาสสูงที่คุณจะประสบปัญหา (หรือแม้แต่ค่าใช้จ่ายที่ไม่จำเป็น) หากคุณใช้แบบสอบถามย่อย ในกรณีเหล่านี้ ให้ใช้แฟล็กนี้
- "nocase|NC" (ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่)
ซึ่งจะทำให้รูปแบบไม่คำนึงถึงตัวพิมพ์ เช่น ไม่มีความแตกต่างระหว่าง "A-Z" และ "a-z" เมื่อนำรูปแบบไปใช้กับ URL ปัจจุบัน
- "qsappend|QSA" (เพิ่มสตริงข้อความค้นหา) - สตริงข้อความค้นหาต่อท้าย
แฟล็กนี้สั่งให้กลไกการเปลี่ยนแปลงต่อท้าย แทนที่จะแทนที่ สตริงการสืบค้นจาก URL ไปยังสตริงการทดแทนที่มีอยู่ในสตริงการทดแทน ใช้สิ่งนี้เมื่อคุณต้องการเพิ่มข้อมูลเพิ่มเติมลงในสตริงการสืบค้นโดยใช้คำสั่งการแปลง
ตัวอย่างบน learnsongs.ru:
กฎการเขียนใหม่ ^tags/([-A-Za-z0-9_’]+)$ /tags.php?tag=$1
กฎการเขียนใหม่ ^tags/([-A-Za-z0-9_’]+)?page=(+)$ /tags.php?tag=$1&page=$2
- "noescape|NE" (อย่าหลีก URI เมื่อส่งออก)
แฟล็กนี้ป้องกันไม่ให้ mod_rewrite ถูกนำมาใช้ กฎปกติหลบหนี URI ไปยังผลลัพธ์ของการแปลง โดยทั่วไปแล้ว อักขระพิเศษ (เช่น "%", "$", ";" และอื่นๆ) จะถูกหลีกโดยใช้อักขระตัวแทนที่เป็นเลขฐานสิบหก ("%25", "%24" และ "%3B" ตามลำดับ); การตั้งค่าสถานะนี้ป้องกันไม่ให้สิ่งนี้เกิดขึ้น ซึ่งจะทำให้สัญลักษณ์เปอร์เซ็นต์ปรากฏในเอาต์พุตได้ เช่นเดียวกับใน
เขียนกฎใหม่ /foo/(.*) /bar?arg=P1\%3d$1
"/foo/zed" ใดที่จะแปลเป็นการสืบค้นที่ปลอดภัย "/bar?arg=P1=zed"
- "passthrough|PT" (ผ่านตัวจัดการถัดไป)
แฟล็กนี้สั่งให้เอ็นจิ้นการแปลงตั้งค่าฟิลด์ uri โครงสร้างภายใน request_rec เท่ากับฟิลด์ชื่อไฟล์ การตั้งค่าสถานะนี้เป็นเพียงกลอุบายเพื่อให้สามารถจัดการผลลัพธ์ของคำสั่ง RewriteRule, Alias, ScriptAlias, Redirect และอื่นๆ ได้ จากนักแปลคนอื่นๆ ชื่อไฟล์ URI ตัวอย่างเล็กๆ น้อยๆ เพื่อแสดงความหมายนี้: หากคุณต้องการแปลง /abc เป็น /def โดยใช้กลไกการแปลง mod_rewrite จากนั้น /def เป็น /ghi โดยใช้ mod_alias:
เขียนกฎใหม่ ^/abc(.*) /def$1
นามแฝง /def /ghi
หากคุณละเว้นแฟล็ก PT mod_rewrite จะทำงานของมันได้ดี กล่าวคือ มันจะแปลง uri=/abc/... เป็น filename=/def/... ตามที่นักแปล URI ไฟล์ที่รองรับ API อย่างสมบูรณ์ควรทำ ถ้าอย่างนั้นก็ถึงคราวของ mod_alias ที่จะพยายามเปลี่ยนชื่อไฟล์ URI ซึ่งจะไม่ทำงาน
หมายเหตุ: คุณต้องใช้แฟล็กนี้หากคุณต้องการผสมคำสั่ง โมดูลที่แตกต่างกันมีชื่อไฟล์ URL ของผู้แปล ตัวอย่างทั่วไปนี่คือการใช้โมดูล mod_alias และ mod_rewrite ..
htaccess. RewriteRule: เรียบง่าย ชัดเจน พร้อมตัวอย่างและคำอธิบาย
เราในฐานะโปรแกรมเมอร์เว็บมักจะเจอไฟล์นี้ .htaccessและโดยเฉพาะอย่างยิ่งกับโมดูลและไวยากรณ์ MOD_REWRITE เขียนกฎใหม่- และในตอนแรกเป็นการยากที่จะเข้าใจและเข้าใจหลักการทำงานของมันกฎที่ใช้ทำงานและกลไกในการแปลงลิงก์แบบไดนามิกเป็นลิงก์แบบคงที่และในทางกลับกัน ในบทความนี้ ฉันจะพยายามอธิบายให้ง่ายที่สุดเท่าที่จะทำได้ พร้อมคำอธิบายและตัวอย่างเพื่อให้คุณไม่มีคำถามใดๆ เหลืออยู่
โมดูล mod_rewrite ที่มีไวยากรณ์มีหน้าที่ในการแปลงลิงก์ไดนามิกไปเป็นสแตติก เขียนกฎใหม่หลักการทำงานและกฎการเปลี่ยนแปลง ซึ่งผมจะอธิบาย
ตัวอย่างเช่น ลองใช้ลิงก์แบบไดนามิกที่เราต้องแปลง:
ในลิงค์นี้เราได้รวมไว้มากที่สุด พารามิเตอร์ที่ส่งบนเว็บไซต์ของเรา
นั่นคือในแค็ตตาล็อกเราเลือกรถยนต์ BMW รุ่น X5 สภาพใหม่ หน้า 5
ในไฟล์ .htaccessซึ่งเราจะวางไว้ในโฟลเดอร์รูทของแค็ตตาล็อก/ ไดเร็กทอรี เขียน (file .htaccessมีผลกับไดเร็กทอรีที่มันตั้งอยู่และไดเร็กทอรีย่อยเท่านั้น):
เขียนใหม่เครื่องยนต์บน(เราเปิดกระบวนการแปลงลิงค์)
กฎการเขียนใหม่ ^(+)/([^/]+)/(.*)/(+).html$ index.php?auto=$1&model=$2&state=$3&page=$4 [L]
มาดูสิ่งที่เขียนไว้ที่นี่ให้ละเอียดยิ่งขึ้น:
^
จุดเริ่มต้นของบรรทัด;
(+)
วงเล็บจะสร้างตัวแปร ซึ่งเราจะแทนที่ลงในลิงก์ไดนามิก $1 นั่นก็คือ
ตัวแปร $1 = ([
เอ-ซ่า-z0-9-]+)
ตัวแปร $2 = ([^/]+)
ตัวแปร $3 = (.*)
ตัวแปร $4 = (+)
ในวงเล็บ [
เอ-ซ่า-z0-9-]คลาสของอักขระที่ถูกต้อง ใน ในกรณีนี้อักขระที่ถูกต้องคือ A B C D…Z a b c…z 0 1 2 3…9 –หากเราต้องการเพิ่มตัวละครเช่น ? ; :
จากนั้นเราจะได้สิ่งต่อไปนี้
นั่นคือพวกเขาเพียงเพิ่มเข้าไป
+
หมายความว่าเรากำลังเพิ่มอักขระตัวแทนอีกตัว
การแสดงออก ([^/]+)
หมายถึงอักขระใดๆ ยกเว้น (^ หมายถึงยกเว้น) แบ็กสแลช + หมายถึง เพิ่มอักขระอื่น
การแสดงออก (.*)
จุดหมายถึงอักขระตัวเดียว * หมายถึงเหมือนกับเครื่องหมายบวก - เพิ่มอักขระอื่น
การแสดงออก (+)
ฉันคิดว่านี่ชัดเจน
.html– หมายความว่าสตริงคงที่ลงท้ายด้วย .html
เครื่องหมายทับ /
เครื่องหมายทับเฉลี่ยในลิงก์แบบคงที่
ควรสังเกตว่า mod นี้ไม่แปลงลิงก์จากลิงก์ไดนามิกเป็นลิงก์คงที่ แต่เป็น VERSE VICE! นั่นคือเราเขียนลิงก์แบบคงที่บนไซต์ และตัวแก้ไขการเขียนซ้ำจะแปลงลิงก์แบบคงที่จากไซต์เป็นลิงก์แบบไดนามิก นั่นคือเราต้องเขียนลิงค์ด้านบนบนเว็บไซต์เป็นแบบคงที่:
site.ru/catalog/ BMW/X5/NEW/5.html
ก โมดูล RewriteRuleแปลงลิงก์นี้เป็นไดนามิกตามกฎที่เขียนไว้ .htaccessและให้เว็บไซต์:
ผลลัพธ์คือลิงค์: site.ru/catalog/index.php?auto=BMW&model=X5&state=NEW&page=5
ซึ่งชัดเจนสำหรับเรา PHPสคริปต์และหน้าเว็บไซต์
นอกจากนี้ ในกฎการเปลี่ยนแปลงข้างต้น คุณควรเพิ่มกฎสำหรับลิงก์ที่ไม่มีตัวแปรตัวเลข หน้าเพจเช่นเดียวกับ ตัวเลือกที่เป็นไปได้โดยไม่มีตัวแปร
กฎการเขียนใหม่ ^(+)/([^/]+)/(.*).html$ index.php?auto=$1&model=$2&state=$3 [L]
กฎการเขียนใหม่ ^(+)/([^/]+).html$ index.php?auto=$1&model=$2 [L]
กฎการเขียนใหม่ ^(+).html$ index.php?auto=$1 [L]
ด้านล่างนี้คือสัญลักษณ์และสัญลักษณ์ที่เป็นไปได้ที่ใช้ในโมดูล MOD_REWRITE:
- อักขระตัวใดตัวหนึ่ง- หากเราต้องการจุดในวงเล็บและไม่ใช่อักขระตัวใดตัวหนึ่ง จะต้องเป็นอักขระหลีก แบ็กสแลชหลีกเลี่ยงอักขระใด ๆ ()? > ฯลฯ และถ่ายทอดความหมายอันแท้จริงของมัน
คลาสตัวละคร: หนึ่งในสัญลักษณ์ เช่น (2,5)- วงเล็บปีกกาหมายถึงช่วงของจำนวนอักขระ ในกรณีนี้อนุญาตให้มีอักขระได้ 2 ถึง 5 ตัว
[^ตัวอักษร] คลาสตัวละคร: ไม่มีตัวละครเลย [^fg57] – ห้ามใช้สัญลักษณ์ f g 5 7
ข้อความ1|ข้อความ2ทางเลือก: text1 หรือ text2 เช่น หมายถึง a หรือ b หรือ c
ปริมาณ (สัญลักษณ์สำหรับแสดงถึงความสัมพันธ์เชิงปริมาณ):
- 0 หรือ 1 จากข้อความก่อนหน้าหมายความว่ามีสัญลักษณ์หรือความหมายบางอย่างของสัญลักษณ์หรืออาจจะไม่มีก็ได้
* 0 หรือ N จากข้อความก่อนหน้า (N > 0)
+ 1 หรือ N จากข้อความก่อนหน้า (N > 1)
มาโคร " $1
" หมายถึงส่วนหนึ่งของเส้นทางต้นทางที่อยู่ภายในวงเล็บคู่แรก "RewriteRule ^(.*)......" , $2
- ภายในคู่ที่สองเป็นต้น
เครื่องหมาย:
^
จุดเริ่มต้นของเครื่องหมายบรรทัด
$
เครื่องหมายสิ้นสุดบรรทัด
ตัวอย่าง RewriteRule พร้อมคำอธิบาย:
สมมติว่าเรามีบทความในเว็บไซต์ของเราที่มี หน้าไดนามิก:
http://www.site.ru/articles?id=(รหัสบทความ)
มาทำให้ลิงก์ไปยังบทความของเราสวยงามยิ่งขึ้น เช่น:
http://www.site.ru/nazvanie-stati/ หรือ
http://www.site.ru/nazvanie-stati.html
สำหรับสิ่งนี้ในตัวเรา ตารางมายเอสคิวแอล, เพิ่ม สายพิเศษซึ่งเราจะจัดเก็บชื่อเฉพาะของบทความ ในตัวอักษรละตินไม่มีช่องว่าง เครื่องหมายทับ และ อักขระพิเศษยอมรับไม่ได้ในลิงก์ ตัวอย่างเช่น: Moya-pervaya-statya และตามหลักการนี้ ลองตั้งชื่อแถวในตารางของเรา เช่น eng_name_stati
ลิงก์ไดนามิกจะมีลักษณะดังนี้:
http://www.site.ru/articles?eng_name_stati=(Moya-pervaya-statya ฯลฯ )
ประเด็นหลักไฟล์ที่ต้องทำความเข้าใจ .htaccessอย่างที่ฉันกล่าวไว้ข้างต้น ,
ไม่แปลงลิงก์ไดนามิกไปเป็นลิงก์แบบคงที่ แต่ในทางกลับกัน จะแปลงลิงก์แบบคงที่ไปเป็นไดนามิก
กฎการเปลี่ยนแปลง เขียนกฎใหม่จะมีลักษณะดังนี้:
RewriteRule ^(.*)/$ Articles?eng_name_stati=$1 [L]สำหรับประเภทลิงก์แบบคงที่: http://www.site.ru/nazvanie-stati/หรือ
RewriteRule ^(.*).html$ Articles?eng_name_stati=$1 [L]เพื่อการปรากฏตัว
ตอนนี้เมื่อเราเข้าสู่ลิงค์ http://www.site.ru/nazvanie-stati.htmlในเบราว์เซอร์เราจะไปที่บทความของเรา http://www.site.ru/articles?eng_name_stati=nazvanie-statiและลิงก์ทั้งสองนี้จะใช้งานได้ บนเว็บไซต์ของเรา เราเพียงแต่ให้ลิงก์แบบคงที่สำหรับเครื่องมือค้นหา และเมื่อมีคนเยี่ยมชมลิงก์แบบคงที่ไฟล์ของเรา .htaccessแปลงเป็นไดนามิก เป็นที่เข้าใจได้สำหรับไซต์ของเราและมองเห็นได้เฉพาะไซต์ของเราเท่านั้น
ส่วนที่เพิ่มเข้าไป:
มันเกิดขึ้นที่เราต้องตรวจสอบก่อนว่านี่เป็นลิงค์ไปยังไฟล์ที่มีอยู่ในเซิร์ฟเวอร์ของเราหรือไม่ /catalog/webmaster/index.htmlอาจเป็นไฟล์ที่มีอยู่ แต่หากลิงก์นี้อยู่ภายใต้ RewriteRule ที่เกี่ยวข้อง ลิงก์นั้นจะถูกแปลงตามกฎนี้ ดังนั้นหากเราต้องตรวจสอบก่อนว่าไฟล์หรือไดเร็กทอรีนี้ตรงหรือไม่ เราต้องเขียนเงื่อนไขก่อนกฎ RewriteRule ถ้า:
หากไม่มีโฟลเดอร์ดังกล่าว
หากไม่มีไฟล์ดังกล่าว
ดำเนินการแปลง
มันจะมีลักษณะเช่นนี้:
เขียนใหม่Cond %(REQUEST_FILENAME) !-d
เขียนใหม่Cond %(REQUEST_FILENAME) !-f
กฎการเขียนใหม่ ^([^/]+)/([^/]+)/([^/]+).html$ index.php?catalog=$1&webmaster=$2&file=$3 [L]
ที่ไหน, เขียนใหม่Cond- เงื่อนไข ถ้า, %(REQUEST_FILENAME)– พาธของระบบแบบเต็มไปยังไฟล์หรือไดเร็กทอรีที่ร้องขอ, เครื่องหมายอัศเจรีย์ ! หมายถึงการปฏิเสธ ไม่, -d- ไดเรกทอรี -ฉ- ไฟล์.
ตอนนี้ ก่อนที่จะใช้ RewriteRule เงื่อนไข RewriteCond จะถูกตรวจสอบ
ทำไมคุณยังไม่แสดงความคิดเห็น?
ทิ้งคุณไว้
สำหรับการเปลี่ยนเส้นทาง การตั้งค่า CNC บนเว็บไซต์โดยใช้ และ และการแทรกคำหลักลงใน URL ของบทความ คำสั่งทั้งหมดที่กำหนดไว้ในบทความนี้จะถูกเขียนในไฟล์ .htaccess ซึ่งโดยปกติจะอยู่ที่รากของไซต์ของคุณ แม้ว่าจะอยู่ใน cms บางส่วนก็ตาม ในเกือบทุกโฟลเดอร์ แต่นั่นเป็นเรื่องราวที่แตกต่างไปจากเดิมอย่างสิ้นเชิง...
ด้านล่างนี้คือ 5 ตัวอย่างการใช้โมดูลนี้:
1) แปลง “product.php?id=12” เป็น “product-12.html”
นี่เป็นการเปลี่ยนเส้นทางแบบง่ายๆ โดยที่ส่วนขยาย .php ถูกซ่อนจากแถบที่อยู่ของเบราว์เซอร์ และ URL ไดนามิก (พร้อมเครื่องหมายคำถาม "?") จะถูกแปลงเป็นที่อยู่คงที่
เขียนใหม่เครื่องยนต์บน
เขียนกฎใหม่ ^product-(+)\.html$ product.php?id=$1
2) เปลี่ยน “product.php?id=12” เป็น “product/ipod-nano/12.html”
ผู้เชี่ยวชาญด้าน SEO มักจะแนะนำให้แสดงสิ่งที่สำคัญเสมอ คำหลักใน URL ตัวอย่างเช่น คุณสามารถดูชื่อผลิตภัณฑ์ใน URL
เขียนใหม่เครื่องยนต์บน
เขียนกฎใหม่ ^product/(+)/(+)\.html$ product.php?id=$2
3) การเปลี่ยนเส้นทางที่อยู่โดยไม่มี www URL ไปยังที่อยู่ที่มี www - เปลี่ยนเส้นทาง
หากคุณป้อน yahoo.com ในเบราว์เซอร์ คุณจะถูกนำไปที่ www.yahoo.com หากต้องการดำเนินการแบบเดียวกันบนไซต์ของคุณ ให้เพิ่มโค้ดต่อไปนี้ลงในไฟล์ .htaccess:
เขียนโปรแกรมใหม่อีกครั้ง
เขียนใหม่ %(HTTP_HOST) ^optimaxwebsolutions\.com$
กฎการเขียนใหม่ (.*) http://www.optimaxwebsolutions.com/$1
แน่นอน ให้เปลี่ยน URL ไซต์เป็นของคุณเอง เหตุใดจึงเปลี่ยนเส้นทางเช่นนี้? เพื่อหลีกเลี่ยงไม่ให้เว็บไซต์ซ้ำซ้อนโดยเครื่องมือค้นหาที่มีและไม่มี www
4) เปลี่ยน “yoursite.com/user.php?username=xyz” เป็น “yoursite.com/xyz”
เพิ่มลงในไฟล์ .htaccess บรรทัดต่อไปนี้:
เขียนโปรแกรมใหม่อีกครั้ง
กฎการเขียนใหม่ ^(+)$ user.php?username=$1
กฎการเขียนใหม่ ^(+)/$ user.php?username=$1
5) การเปลี่ยนเส้นทางโดเมนไปยังโดเมนย่อยหรือโฟลเดอร์ใหม่
สมมติว่าคุณได้ออกแบบไซต์ของคุณใหม่ และไซต์ที่อัปเดตอยู่ในโฟลเดอร์ "ใหม่" ในรากของไซต์ นั่นคือไซต์ใหม่สามารถดูได้ที่ "test.com/new" การย้ายไฟล์จากที่หนึ่งไปยังอีกที่หนึ่งอาจเป็นกระบวนการที่ค่อนข้างน่าเบื่อ ดังนั้นเพียงเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ .htaccess ของคุณแล้ววางลงในโฟลเดอร์รูทของคุณ:
เขียนโปรแกรมใหม่อีกครั้ง
เขียนใหม่ %(HTTP_HOST) ^test\.com$ เขียนใหม่ %(HTTP_HOST) ^www\.test\.com$
เขียนใหม่ %(REQUEST_URI) !^/ใหม่/
เขียนกฎใหม่ (.*) /ใหม่/$1
ตอนนี้เมื่อเข้าถึง “www.test.com” ไฟล์ทั้งหมดจะถูกนำมาจาก “test.com/new”
mod_rewrite: ที่อยู่ NC แบบคงที่พร้อมตัวแปรเดียว
ดังนั้นในบทความนี้ผมจึงกล่าวว่าเว็บไซต์ต่างๆ PHP และ MySQLมีที่อยู่ตามรูปแบบดังนี้
ตามกฎแล้ว ที่อยู่ดังกล่าวจะเรียกว่าไดนามิก ตอนนี้เราจะเริ่มแปลงที่อยู่แบบไดนามิกเป็น CNC
สมมติว่าเราต้องแปลงจาก lis.php?id=3วี bols3.hi- นิพจน์ทั่วไปจะมีรูปแบบดังต่อไปนี้:
เขียนกฎใหม่ ^ชื่อหน้า(+)\.EXTENSION$ REAL ADDRESS NAME.php?VARIABLE=$NUMBERING
นั่นคือในกรณีของเราเราได้รับสิ่งต่อไปนี้:
เขียนกฎใหม่ ^bols(+)\.hi$ lis.php?id=$1
ตอนนี้แทนที่จะเป็นที่อยู่ lis.php?id=90(โดยที่ 90 คือ id) เราสามารถเข้าถึงได้อย่างปลอดภัย bols90.hi.
mod_rewrite: ที่อยู่ NC แบบคงที่พร้อมตัวแปรจำนวนมาก
พิจารณาสถานการณ์ที่คุณต้องแปลงที่อยู่ด้วยตัวแปรหลายตัว ตัวอย่างเช่นจาก lis.php?id=345&cat=3วี bols345-3.hi- สถานการณ์คล้ายกัน แต่ขณะนี้มีการใช้ตัวแปร GET สองตัว เส้นประใช้เป็นตัวคั่น เราได้รับนิพจน์ต่อไปนี้:
เขียนกฎใหม่ ^bols(+)-(+)\.hi$ lis.php?id=$1&cat=$2
หลักการแปลงจะมีลักษณะดังนี้:
mod_rewrite: เก็บถาวรที่อยู่ CNC
ที่เก็บถาวรหลายแห่งบนเว็บไซต์มีที่อยู่ archive.php?year=2003&month=10- เราจะแปลงมันให้เป็น ที่เก็บถาวร/2003/10/- เราได้รับบรรทัดต่อไปนี้:
RewriteRule ^archive/(+)/(+)\$ archive.php?year=$1&month=$2
mod_rewrite: ที่อยู่ CNC สำหรับแท็ก
ปัจจุบันแท็กมีอยู่ในเกือบทุกบล็อกและเว็บไซต์ มาลองเปลี่ยนที่อยู่สำหรับแท็กฤดูหนาวกัน — โพสต์.php?tag=ฤดูหนาววี โพสต์/แท็ก/ฤดูหนาว/- เรามีนิพจน์ต่อไปนี้:
RewriteRule ^posts/tags/(+)\$ posts.php?tag=$1
โดยวิธีการจัดทำดัชนีหน้าด้วย ที่อยู่แบบไดนามิก เครื่องมือค้นหามีการใช้อัลกอริธึมแยกต่างหาก ฉันไม่รู้ว่ามันแตกต่างจากปกติอย่างไร แต่ การแปลงซีเอ็นซีช่วยระบุให้โรบอตทราบอีกครั้งว่าเราจำเป็นต้องจัดทำดัชนีที่อยู่ของเราเหมือนหน้าคงที่ปกติ
บทความนี้เกิดจากแนวคิดเรื่องการฝึกอบรมขั้นสูงสำหรับพนักงานของเรา การสนับสนุนด้านเทคนิคทำงานกับ mod_rewrite การปฏิบัติแสดงให้เห็นว่าหลังจากศึกษาหนังสือเรียนภาษารัสเซียจำนวนมากแล้ว ทีมสนับสนุนสามารถแก้ไขปัญหาเทมเพลตได้ดี แต่การรวบรวมกฎที่เป็นอิสระเกิดขึ้นจากการลองผิดลองถูก ปริมาณมากข้อผิดพลาด ปัญหาคือความเข้าใจที่ดีเกี่ยวกับวิธีการทำงานของ mod_rewrite จำเป็นต้องศึกษาเอกสารต้นฉบับภาษาอังกฤษ ตามด้วยคำอธิบายเพิ่มเติมหรือชั่วโมงการทดลองกับ RewriteLog
บทความนี้จะอธิบายวิธีการทำงานของ mod_rewrite การทำความเข้าใจหลักการของการดำเนินการช่วยให้คุณเข้าใจผลกระทบของแต่ละคำสั่งได้อย่างชัดเจนและจินตนาการได้อย่างชัดเจนว่าเกิดอะไรขึ้นในคราวเดียวหรืออย่างอื่นภายใน mod_rewrite เมื่อประมวลผลคำสั่ง
ฉันคิดว่าผู้อ่านคงคุ้นเคยกับ mod_rewrite แล้วและฉันจะไม่อธิบายพื้นฐานของมันซึ่งหาได้ง่ายบนอินเทอร์เน็ต ควรสังเกตว่าบทความนี้ครอบคลุมถึงงานของ mod_rewrite เมื่อใช้คำสั่งในไฟล์ .htaccess ความแตกต่างเมื่อทำงานในบริบท
ดังนั้น คุณได้ศึกษา mod_rewrite รวบรวม RewriteRules หลายรายการ และจัดการเพื่อเผชิญกับการเปลี่ยนเส้นทางอย่างไม่มีที่สิ้นสุด กรณีที่กฎด้วยเหตุผลบางประการไม่สอดคล้องกับคำขอของคุณ รวมถึงการดำเนินการที่คาดเดาไม่ได้ของกลุ่มกฎเมื่อกฎที่ตามมาเปลี่ยนแปลงโดยไม่คาดคิด คำขอที่จัดทำขึ้นอย่างระมัดระวังตามกฎก่อนหน้านี้
ทำไมสิ่งนี้ถึงเกิดขึ้น?
RewriteRule ทำงานร่วมกับอะไร?
RewriteRule แรกจะถูกส่งผ่านเส้นทางจากตำแหน่ง .htaccess ไปยังไฟล์ที่ร้องขอ บรรทัดนี้ไม่เคยขึ้นต้นด้วย "/" RewriteRules ที่ตามมาจะส่งผลลัพธ์ของการแปลงก่อนหน้านี้
หากต้องการทำความเข้าใจวิธีการทำงานของ RewriteRule อย่างถี่ถ้วน คุณต้องกำหนดก่อน มันใช้งานได้กับอะไร- มาดูกันว่า Apache รับสตริงที่ในตอนแรกส่งผ่านไปยัง RewriteRule ใน .htaccess เพื่อการประมวลผลอย่างไร
เมื่อคุณเริ่มทำงานกับ mod_rewrite เป็นครั้งแรก คุณจะถือว่ามันใช้งานได้กับลิงก์ อย่างไรก็ตาม กรณีนี้จะไม่เกิดขึ้นเมื่อใช้ mod_rewrite ใน .htaccess ในความเป็นจริง RewriteRule ถูกส่งผ่านแล้ว ไม่ใช่ลิงก์ แต่เป็นเส้นทางไปยังไฟล์ที่ร้องขอ.
เนื่องจากสถาปัตยกรรมภายในของ Apache ทันทีที่ .htaccess เข้ามามีบทบาท mod_rewrite สามารถทำงานได้บนพาธไปยังไฟล์ที่จะประมวลผลเท่านั้น นี่เป็นเพราะความจริงที่ว่าก่อนที่จะถูกส่งไปยัง mod_rewrite คำขออาจได้รับการแก้ไขโดยโมดูลอื่น ๆ (เช่น mod_alias) และเส้นทางสุดท้ายไปยังไฟล์บนไซต์อาจไม่ตรงกับลิงก์ดั้งเดิมอีกต่อไป หาก mod_rewrite ทำงานกับการอ้างอิงดั้งเดิม มันจะหยุดการทำงานของโมดูลที่แก้ไขคำขอก่อนหน้านั้น
ดังนั้น mod_rewrite จะถูกส่งผ่านพาธสัมบูรณ์ไปยังไฟล์ที่ควรประมวลผล Mod_rewrite ยังทราบเส้นทางไปยัง .htaccess ซึ่งเป็นที่ตั้งของกฎ RewriteRule หากต้องการสร้างพาธไปยังไฟล์ให้คล้ายกับลิงก์ที่นักพัฒนาไซต์วางแผนจะใช้ mod_rewrite จะตัดส่วนของไฟล์ .htaccess ออกจากพาธสัมบูรณ์
ดังนั้น เส้นทางนี้ซึ่งเส้นทางไปยัง .htaccess ถูกตัดออกไป และถูกส่งผ่านไปยัง RewriteRule แรก ตัวอย่างเช่น:
- คำขอ: http://example.com/templates/silver/images/logo.gif
- DocumentRoot: /var/www/example.com
- เส้นทางไปยังไฟล์: /var/www/example.com/templates/silver/images/logo.gif
- .htaccess อยู่ใน: /var/www/example.com/templates/.htaccess
- RewriteRule แรกจะได้รับ: สีเงิน/images/logo.gif
- โปรดทราบ: “templates/” ก็ถูกตัดออกไปเช่นกัน
เส้นทางไปยัง .htaccess ถูกตัดออกพร้อมกับเครื่องหมายทับ มีผลกระทบจากสิ่งนี้: บรรทัดที่เริ่มแรกส่งผ่านไปยังการประมวลผล RewriteRule ไม่เคยขึ้นต้นด้วย "/"
สิ่งสำคัญคือต้องจำไว้ว่า ไม่เขียนกฎใหม่ จะไม่ประมวลผลชื่อไซต์ อาร์กิวเมนต์ที่ส่งไปยังสคริปต์ และจะไม่ประมวลผลลิงก์ทั้งหมด หาก .htaccess ไม่ได้อยู่ในรากของไซต์ ทั้งหมดนี้ดำเนินการโดย RewriteCond ซึ่งเราจะพูดคุยกันในภายหลัง ดังนั้น:
# จะไม่ทำงาน - กฎเริ่มต้นด้วย /
กฎการเขียนใหม่ ^/index.php$ /my-index.php# จะไม่ทำงาน - ชื่อไซต์ไม่ได้รับการวิเคราะห์โดย RewriteRule
กฎการเขียนซ้ำ ^example.com/.* http://www.example.com# จะใช้งานได้ก็ต่อเมื่อ .htaccess อยู่ในตำแหน่งเดียวกับโฟลเดอร์เทมเพลต
# เช่น ที่รูทของไซต์ นั่นคือหาก .htaccess อยู่ใน templates/.htaccess จะเป็นกฎ
# จะไม่ทำงาน เนื่องจาก mod_rewrite จะตัดเส้นทางไปยัง .htaccess และไปยังอินพุต RewriteRule
# บรรทัดจะปรากฏโดยไม่มี "templates/"
เขียนกฎใหม่ ^templates/common/yandex-money.gif$ templates/shared/yad.gif
เมื่อเริ่มใช้ mod_rewrite ฉันขอแนะนำให้ใช้งานเฉพาะใน .htaccess ในรูทของไซต์เท่านั้น สิ่งนี้จะทำให้การตรวจสอบการทำงานค่อนข้างง่ายขึ้น
เราพบว่า RewriteRule ทำงานร่วมกับอะไรได้บ้าง ตอนนี้เรามาดูกัน ยังไงมันได้ผล
RewriteRule ทำงานอย่างไร
RewriteRule เพียงแปลงสตริงตามนิพจน์ทั่วไป เท่านี้ก็เรียบร้อย RewriteRule ทำงานบนสตริง ไม่ใช่ลิงก์หรือเส้นทางไปยังไฟล์
ดังที่เราพบข้างต้น อินพุต RewriteRule จะมีเส้นทางจาก .htaccess ไปยังไฟล์ที่ร้องขอ ตอนนี้สะดวกที่สุดในการสรุปจากเส้นทางและลิงก์และพิจารณาว่า RewriteRule ทำงานร่วมกับอะไร ยังไง สตริงปกติ - สตริงนี้ถูกส่งผ่านจาก RewriteRule ไปยัง RewriteRule ซึ่งได้รับการแก้ไขหากมี RewriteRules ใดทำงาน
ใน มุมมองทั่วไปนอกเหนือจากความซับซ้อนของการใช้แฟล็ก (บางส่วนเราจะดูด้านล่าง) และความซับซ้อนของการเขียนนิพจน์ทั่วไป (ซึ่งเราจะไม่กล่าวถึงมากนักในบทความนี้) RewriteRule ทำงานได้ง่ายมาก
- เราเข้าแถวแล้ว
- เปรียบเทียบกับนิพจน์ทั่วไปในอาร์กิวเมนต์แรก
- หากมีการจับคู่ให้เปลี่ยนใหม่ ทั้งบรรทัดเป็นค่าของอาร์กิวเมนต์ที่สอง
- ส่งผ่านสตริงไปยัง RewriteRule ถัดไป
# คำขอ: http://mysite.com/info.html
# RewriteRule แรกจะมี "info.html"# แปลงคำขอเป็นสตริงที่กำหนดเอง
RewriteRule ^info.html$ "ฉันเห็นเต่าอยู่ในหลุม และมันก็กำลังเต้นร็อกแอนด์โรล และมันก็ยิ้ม โดยรวมแล้วมันเป็นตุ๊กตาที่ตลกมาก"# "info.html" -> "ฉันเห็นเต่า..."
# "ฉันเห็นเต่า..." -> "https://example.com/information/index.html"
#เปลี่ยนชื่อไซต์!
กฎการเขียนใหม่ ^(.*)example.com(.*)$ $1example.org$2# "https://example.com/information/index.html" -> "https://example.org/information/index.html"
# แทนที่โปรโตคอล!
เขียนกฎใหม่ ^https:(.*)$ ftp:$1# "https://example.org/information/index.html" -> "ftp://example.org/information/index.html"
# "ftp://example.org/information/index.html" -> "ftp://example.org/information/main.php"
อย่างที่คุณเห็น RewriteRule ไม่สนใจว่ามันจะทำงานกับอะไร - มันเพียงแปลงสตริงตามอาร์กิวเมนต์ที่กำหนด หากคุณต้องการ คุณสามารถจัดเก็บอาร์เรย์ข้อมูลใดๆ ไว้ในบรรทัดได้ หากคุณต้องการ มีความเพียรพยายาม และมีความรู้ที่ดีเกี่ยวกับนิพจน์ทั่วไป คุณยังสามารถเขียนโอเอกซ์บน RewriteRule ได้อีกด้วย
จำเป็นต้องจดบันทึกที่นี่ แม้ว่า RewriteRule จะใช้งานได้กับสตริงที่สะอาด แต่ก็ยังคงเป็นเช่นนั้น มุ่งเน้นเพื่อทำงานกับลิงก์ ดังนั้น มันจะตอบสนองในลักษณะพิเศษกับบรรทัดที่ขึ้นต้นด้วย “https://” หรือที่คล้ายกัน (มันจะจำได้ว่าเราต้องการทำการเปลี่ยนเส้นทางภายนอก) และต่อ “?” (ถือว่าอักขระต่อไปนี้เป็นอาร์กิวเมนต์ที่จะต้องทดแทนคำขอ) อย่างไรก็ตาม เราไม่ได้สนใจเรื่องนี้ในตอนนี้ - สิ่งสำคัญคือต้องเข้าใจว่า RewriteRule ไม่มีเวทย์มนตร์ใดๆ - เพียงแค่ใช้สตริงและเปลี่ยนวิธีที่คุณสั่ง เราจะดูการเปลี่ยนเส้นทางและการโต้แย้งภายนอกในบทความในภายหลัง มีบางอย่างที่จะพูดถึงเช่นกัน
หลังจากการแปลงทั้งหมดเสร็จสิ้นและดำเนินการ RewriteRule สุดท้ายแล้ว RewriteBase จะมีผล
RewriteBase ใช้ทำอะไร?
หากแบบสอบถามผลลัพธ์มีความสัมพันธ์และแตกต่างจากแบบสอบถามต้นฉบับ RewriteBase จะเพิ่มตัวเองทางด้านซ้าย จำเป็นต้องระบุ RewriteBase ใน .htaccess ค่าของมันคือเส้นทางจากรูทของไซต์ไปยัง .htaccess
RewriteBase จะถูกดำเนินการหลังจาก RewriteRules ทั้งหมดเท่านั้น ไม่ใช่ระหว่างกัน
เราได้กล่าวไปแล้วข้างต้นว่า mod_rewrite ซึ่งทำงานใน .htaccess มีเส้นทางที่แน่นอนไปยังไฟล์ที่ร้องขอ หากต้องการส่งต่อไปยัง RewriteRule mod_rewrite จะตัดเส้นทางไปยัง .htaccess ออก จากนั้น RewriteRules จะเปลี่ยนคำขอทีละรายการตามลำดับ และตอนนี้ หลังจากแก้ไขคำขอแล้ว Apache จะต้องกู้คืนเส้นทางที่แน่นอนไปยังไฟล์ที่ต้องดำเนินการในท้ายที่สุด RewriteBase จริงๆ แล้วเป็นแฮ็คที่ช่วยกู้คืนเส้นทางดั้งเดิมของไฟล์
RewriteBase จะถูกดำเนินการหลังจากการแปลงทั้งหมด ซึ่งหมายความว่าจะไม่เปลี่ยนคำขอระหว่าง RewriteRules แต่จะมีผลเฉพาะเมื่อ RewriteRules ทั้งหมดเสร็จสมบูรณ์แล้วเท่านั้น
หลังจากการแปลงทั้งหมดแล้ว RewriteBase จะดูว่าเส้นทางผลลัพธ์เป็นแบบสัมพัทธ์หรือแบบสัมบูรณ์ ในบริบทของ Apache นี่หมายถึงเส้นทางสัมพัทธ์หรือเส้นทางสัมบูรณ์ เริ่มต้นจากรากของไซต์:
- images/logo.gif - ญาติ
- /images/logo.gif - สัมบูรณ์ (เครื่องหมายทับที่จุดเริ่มต้น)
- http://example.com/images/logo.gif - สมบูรณ์ที่สุด
# .htaccess อยู่ใน /images/
# RewriteBase ระบุโดย /images/
RewriteBase /รูปภาพ/# ขอ http://example.com/images/logo.gif
# อินพุต RewriteRule คือ "logo.gif"
เขียนกฎใหม่ ^logo.gif$ logo-orange.gif
# หลังจากเขียนกฎใหม่: "logo.gif" -> "logo-orange.gif"
# หลังจาก RewriteBase: "logo-orange.gif" -> "/images/logo-orange.gif"# ขอ http://example.com/images/header.png
# อินพุต RewriteRule คือ "header.png"
RewriteRule ^header.png$ /templates/rebranding/header.png
# หลังจาก RewriteRule: "header.png" -> "/templates/rebranding/header.png"
# หลังจาก RewriteBase: ไม่มีอะไรเปลี่ยนแปลง ดังนั้นผลลัพธ์สุดท้ายของการเปลี่ยนแปลงจึงเริ่มต้นด้วย "/"# ขอ http://example.com/images/director.tiff
# อินพุต RewriteRule คือ "director.tiff"
# ใช้ ญาติภายนอกเปลี่ยนเส้นทาง
RewriteRule ^director.tiff$ พนักงาน/ผู้จัดการ/director.tiff
# หลังจาก RewriteRule: "director.tiff" -> "staff/manager/director.tiff"
# + mod_rewrite จำได้ว่าจะมีการเปลี่ยนเส้นทางภายนอก
# หลังจาก RewriteBase: "staff/manager/director.tiff" -> "/images/staff/manager/director.tiff"
# mod_rewrite จำได้เกี่ยวกับการเปลี่ยนเส้นทางภายนอก:
# "/images/staff/manager/director.tiff" -> http://example.com/images/staff/manager/director.tiff
โดยปกติ หลังจากที่คุ้นเคยกับ mod_rewrite แล้ว นิสัยต่อไปนี้จะพัฒนาขึ้น: 1) เพิ่ม “RewriteBase /” ลงในแต่ละ .htaccess 2) เริ่มการเปลี่ยนเส้นทางทั้งหมดด้วยเครื่องหมายทับ: “RewriteRule news.php /index.php?act=news” สิ่งนี้จะช่วยกำจัดสิ่งประดิษฐ์จาก RewriteBase แต่การทำเช่นนี้เป็นสิ่งที่ผิด ตอนนี้เรารู้แล้วว่า RewriteBase ทำอะไร เราก็สามารถทำได้ กำหนดกฎเกณฑ์ที่ถูกต้องดังต่อไปนี้:
- RewriteBase ต้องตรงกับเส้นทางจากรากของไซต์ไปยัง .htaccess
- คุณจะต้องเริ่มการเปลี่ยนเส้นทางด้วย "/" เมื่อคุณต้องการระบุเส้นทางที่แน่นอนจากรูทไซต์ไปยังไฟล์
จะเกิดอะไรขึ้นถ้าคุณไม่ระบุ RewriteBase ตามค่าเริ่มต้น Apache ทำให้มันเท่ากัน เส้นทางที่แน่นอนบนระบบไฟล์ก่อน .htaccess (เช่น /var/www/example.com/templates/) ความไม่ถูกต้องของสมมติฐาน Apache นี้ปรากฏในการเปลี่ยนเส้นทางแบบสัมพันธ์ภายนอก:
# ขอ http://example.com/index.php
# DocumentRoot: /var/www/example.com/
# .htaccess อยู่ที่รากของไซต์และไม่ได้ระบุ RewriteBase
# ดังนั้นโดยค่าเริ่มต้น RewriteBase จะเท่ากับเส้นทางที่แน่นอนไปยัง .htaccess: /var/www/example.com/# อินพุต RewriteRule คือ "index.php"
กฎการเขียนใหม่ ^index.php main.php [R]
# ผลลัพธ์: "index.php" -> "main.php"
# mod_rewrite จำได้ว่าจำเป็นต้องมีการเปลี่ยนเส้นทางภายนอก# RewriteRule หมด
# mod_rewrite ยังคงทำ RewriteBase เนื่องจากมีค่าเริ่มต้น
# ปรากฎว่า: "main.php" -> "/var/www/example.com/main.php"# ที่นี่ mod_rewrite จำได้ว่ามีการเปลี่ยนเส้นทางภายนอก:
# "/var/www/example.com/main.php" -> http://example.com/var/www/example.com/main.php#กลับกลายเป็นว่าไม่ใช่สิ่งที่เราคิดไว้เลย
ดังนั้นคำขอจะต้องผ่าน RewriteRules ทั้งหมด หลังจากนั้นหากจำเป็น RewriteBase จะถูกเพิ่มเข้าไป ตอนนี้ Apache ควรให้บริการไฟล์ที่เส้นทางผลลัพธ์ชี้ไปหรือไม่ เลขที่ ตอนนี้คำขอผลลัพธ์จะได้รับการประมวลผลอีกครั้ง
mod_rewrite ทำงานอย่างไร ธง [L]
mod_rewrite เริ่มประมวลผลคำขอซ้ำแล้วซ้ำอีกจนกว่าจะหยุดการเปลี่ยนแปลง และธง [L] ก็ไม่สามารถหยุดมันได้
เมื่อสร้างการกำหนดค่า mod_rewrite ที่ซับซ้อนไม่มากก็น้อย สิ่งสำคัญคือต้องเข้าใจสิ่งนั้น การแก้ไขแบบสอบถามไม่ได้สิ้นสุดที่ RewriteRule สุดท้าย- หลังจากที่ RewriteRule ล่าสุดเริ่มทำงานและเพิ่ม RewriteBase แล้ว mod_rewrite จะดูว่าคำขอมีการเปลี่ยนแปลงหรือไม่ หากคำขอมีการเปลี่ยนแปลง การประมวลผลจะเริ่มต้นอีกครั้งจาก beginning.htaccess
Apache ทำเช่นนี้เนื่องจากในกระบวนการเปลี่ยนแปลงคำขอ คำขออาจถูกเปลี่ยนเส้นทางไปยังไดเร็กทอรีอื่น อาจมี .htaccess ของตัวเองซึ่งไม่เกี่ยวข้องกับการประมวลผลคำขอก่อนหน้านี้ .htaccess ใหม่นี้อาจมีกฎที่ส่งผลต่อการประมวลผลคำขอ ทั้งกฎ mod_rewrite และกฎของโมดูลอื่นๆ เพื่อจัดการกับสถานการณ์นี้อย่างถูกต้อง Apache ต้องรีสตาร์ทลูปการประมวลผลทั้งหมด
- เดี๋ยวก่อน แต่มีธงอยู่ [ล]ซึ่งหยุดการประมวลผลคำขอ mod_rewrite!
ไม่เชิง. ธง [L] หยุด การวนซ้ำในปัจจุบันกำลังประมวลผลคำขอ อย่างไรก็ตาม หากคำขอได้รับการแก้ไขโดย RewriteRules ที่ยังคงจัดการเพื่อประมวลผล Apache จะเริ่มรอบการประมวลผลคำขออีกครั้งจาก RewriteRule แรก
#กฎการเขียนใหม่ ^a.html$ b.html [L]
กฎการเขียนใหม่ ^b.html$ a.html [L]
ตัวอย่างด้านบนจะส่งผลให้เกิดการเปลี่ยนเส้นทางและ "Internal ข้อผิดพลาดของเซิร์ฟเวอร์"ในที่สุด. ในตัวอย่างนี้ การวนซ้ำไม่สิ้นสุดนั้นชัดเจน แต่ในการกำหนดค่าที่ซับซ้อนมากขึ้น คุณอาจต้องเจาะลึกกฎเพื่อพิจารณาว่าข้อความค้นหาใดที่วนซ้ำไปมา
- เมื่อใช้การเปลี่ยนเส้นทางภายนอก - หรือ . ในกรณีของการเปลี่ยนเส้นทางภายนอก การประมวลผลคำขอเพิ่มเติมนั้นไม่เป็นที่พึงปรารถนา (ดูด้านล่างเกี่ยวกับธง [R]) และควรหยุดไว้จะดีกว่า
- เมื่อมีการวนซ้ำใน .htaccess ที่ไม่สามารถกำจัดได้ และจะต้องหยุดการประมวลผลคำขอโดย mod_rewrite ในกรณีนี้ จะใช้โครงสร้างพิเศษ - ดูส่วนท้ายของบทความเพื่อดูเคล็ดลับในหัวข้อนี้
# คำขอ: http://example.com/a.html
# Start.htaccessเขียนใหม่ฐาน /
เขียนกฎใหม่ ^a.html$ b.html
กฎการเขียนใหม่ ^b.html$ a.html#End.htaccess
เดา: อันเป็นผลมาจากการดำเนินการ RewriteRules ทั้งหมด คำขอจะเปลี่ยนไปในลักษณะที่ผลลัพธ์สุดท้ายจะเท่ากับต้นฉบับ. Apache เห็นสิ่งนี้และไม่ประมวลผลคำขออีกครั้ง. ไฟล์ a.html จะถูกส่งกลับ.
mod_rewrite ทำงานอย่างไร ธง [R]
การตั้งค่าสถานะ [R] ไม่หยุดการประมวลผลคำขอ โดยส่งคืนการเปลี่ยนเส้นทางภายนอกทันที แต่จะจดจำความจำเป็นในการเปลี่ยนเส้นทางภายนอก และการประมวลผลคำขอจะดำเนินต่อไปด้วย RewriteRule ต่อไปนี้ ขอแนะนำให้ใช้กับธง [L] เสมอ
ธง [R] บอกให้ Apache ทำการเปลี่ยนเส้นทางภายนอกแทนที่จะเป็นการเปลี่ยนเส้นทางภายใน อะไรคือความแตกต่างระหว่างการเปลี่ยนเส้นทางภายนอกและการเปลี่ยนเส้นทางภายใน? การเปลี่ยนเส้นทางภายในเพียงเปลี่ยนเส้นทางไปยังไฟล์ที่จะมอบให้กับผู้ใช้ ในขณะที่ผู้ใช้เชื่อว่าเขาได้รับไฟล์ที่เขาร้องขอในตอนแรก ด้วยการเปลี่ยนเส้นทางภายนอก Apache จะส่งคืนสถานะการตอบกลับ 301 หรือ 302 ให้กับผู้ใช้แทนเนื้อหาของไฟล์ และแจ้งให้ผู้ใช้ทราบถึงลิงก์ที่เบราว์เซอร์ควรใช้เพื่อรับไฟล์
ดูเหมือนว่าเมื่อประมวลผลแฟล็ก [R] Apache ควรหยุดการประมวลผล RewriteRule ทันทีและส่งคืนการเปลี่ยนเส้นทางภายนอกไปยังผู้ใช้ อย่างไรก็ตาม เราจะจำตัวอย่างที่ยอดเยี่ยมจากส่วน How RewriteRule Works กัน ในนั้น เราได้ระบุแฟล็ก [R] ก่อน ซึ่งระบุถึงความจำเป็นในการเปลี่ยนเส้นทางภายนอก หลังจากนั้นเรายังคงเปลี่ยนลิงก์ต่อไปด้วย RewriteRule ต่อไปนี้
นี่คือวิธีการทำงานของ Apache เมื่อระบุการเปลี่ยนเส้นทางภายนอก เพียง "บันทึก" กับตัวเองว่าหลังจากดำเนินการตามกฎทั้งหมดแล้ว จำเป็นต้องส่งคืนสถานะ 302 (โดยค่าเริ่มต้น) แต่ในขณะเดียวกันก็ดำเนินการ RewriteRules ทั้งหมดต่อไปในรายการต่อไป เราสามารถเปลี่ยนคำขอต่อไปได้ตามต้องการ สิ่งเดียวที่ใช้ไม่ได้คือการเปลี่ยนเส้นทางกลับเป็นการภายใน
อย่างไรก็ตาม เป็นไปได้ยากที่คุณต้องการเปลี่ยนแปลงในทางใดทางหนึ่งหลังจากส่งการเปลี่ยนเส้นทางภายนอกแล้ว นั่นเป็นเหตุผล ขอแนะนำว่าเมื่อใช้ธง [R] ให้ระบุพร้อมกับ [L]:
#แบล็คแจ็ค ย้ายไปชื่อที่สวยงาม
เขียนกฎใหม่ ^bj/(.*) แบล็คแจ็ค/$1
แทนที่จะใช้แฟล็ก [R] คุณสามารถระบุได้ ลิงค์ภายนอก- ในกรณีนี้ Apache เองจะเดาได้ว่าจำเป็นต้องทำการเปลี่ยนเส้นทางภายนอก เช่นเดียวกับในกรณีของการระบุธง [R] อย่างชัดเจน ขอแนะนำให้ใช้ธง [L]
- หากการเปลี่ยนเส้นทางภายนอกนำไปสู่ไซต์เดียวกัน ควรใช้แฟล็ก [R] โดยไม่ระบุ ลิงค์เต็ม(หรืออีกนัยหนึ่ง ให้ใช้การเปลี่ยนเส้นทางภายนอกแบบสัมพันธ์) ซึ่งจะทำให้กฎเป็นอิสระจากชื่อไซต์
- หากการเปลี่ยนเส้นทางภายนอกนำไปสู่ไซต์อื่น การดำเนินการนี้จะไม่สามารถทำได้นอกจากการระบุลิงก์ภายนอกแบบเต็ม
mod_rewrite ทำงานอย่างไร การระบุพารามิเตอร์คำขอและแฟล็ก
การเปลี่ยนพารามิเตอร์แบบสอบถามใน RewriteRule จะไม่เปลี่ยนแถวที่ RewriteRule ถัดไปทำงาน อย่างไรก็ตาม การเปลี่ยนพารามิเตอร์จะเปลี่ยนตัวแปร %(QUERY_STRING) ที่ RewriteCond สามารถทำงานได้
คำศัพท์ที่ใช้: "พารามิเตอร์" - พารามิเตอร์คำขอ "อาร์กิวเมนต์" - อาร์กิวเมนต์ RewriteRule
เมื่อใช้ RewriteRule คุณสามารถเปลี่ยนได้ไม่เพียงแต่เส้นทางไปยังไฟล์ที่จะถูกประมวลผล แต่ยังรวมถึงพารามิเตอร์ด้วย รับคำขอซึ่งจะถูกส่งต่อไปยังเขา ซึ่งมักใช้เพื่อถ่ายโอนการประมวลผล NC ไปยังตัวจัดการสคริปต์ทั่วไป ตัวอย่างเช่น:
เขียนใหม่ฐาน /# คำขอ: http://example.com/news/2010/07/12/grand-opening.html
# ข้อมูล: "news/2010/07/12/grand-opening.html"
# หลังจาก RewriteRule: "news/2010/07/12/grand-opening.html" -> "index.php"
# %(QUERY_STRING): "" -> "act=news&what=2010/07/12/grand-opening.html"
ทันทีที่ RewriteRule พบเครื่องหมายคำถามในอาร์กิวเมนต์ที่สอง ระบบจะรู้ว่าพารามิเตอร์ในคำขอกำลังได้รับการแก้ไข เป็นผลให้เกิดสิ่งต่อไปนี้:
- RewriteRule แทนที่สตริงที่ดำเนินการด้วยส่วนหนึ่งของอาร์กิวเมนต์ที่สอง ถึง เครื่องหมายคำถาม - โปรดทราบว่าพารามิเตอร์คำขอใหม่ อย่าตีไปยังสตริงที่ RewriteRules ที่ตามมาจะใช้งานได้
- ส่วนหนึ่งของข้อโต้แย้งที่สอง หลังเครื่องหมายคำถามจบลงที่ตัวแปร %(QUERY_STRING) หากมีการระบุแฟล็ก พารามิเตอร์การสืบค้นจะถูกเพิ่มที่จุดเริ่มต้นของ %(QUERY_STRING) หากไม่ได้ระบุแฟล็ก %(QUERY_STRING) จะถูกแทนที่ด้วยพารามิเตอร์การสืบค้นจาก RewriteRule โดยสมบูรณ์
เขียนใหม่ฐาน /#
เขียนกฎใหม่ ^news/(.*)$ index.php?act=news&what=$1
# หลังการแปลง: "news/2010/" -> "index.php"
# ค่า %(QUERY_STRING): "page=2" -> "act=news&what=2010/"
เป็นไปได้มากว่ากฎข้างต้นทำงานไม่ถูกต้องเนื่องจากอาร์กิวเมนต์ของหน้าหายไป มาแก้ไขปัญหานี้กัน:
เขียนใหม่ฐาน /# คำขอ: http://example.com/news/2010/?page=2
# ป้อนกฎการเขียนใหม่: "news/2010/"
เขียนกฎใหม่ ^news/(.*)$ index.php?act=news&what=$1
# หลังการแปลง: "news/2010/" -> "index.php"
# ค่า %(QUERY_STRING): "page=2" -> "act=news&what=2010/&page=2"
เราเพียงเพิ่มธงเท่านั้น และกฎก็เริ่มทำงานอย่างถูกต้อง
สิ่งสำคัญคือต้องเข้าใจว่า การเปลี่ยนแปลงพารามิเตอร์การค้นหาเปลี่ยนแปลง %(QUERY_STRING)ซึ่งสามารถนำมาใช้ในภายหลังใน RewriteCond สิ่งนี้จะต้องนำมาพิจารณาเมื่อเขียนกฎต่อมาที่ตรวจสอบข้อโต้แย้ง
- แน่นอนว่ามันเปลี่ยนไปเพราะ Apache ส่งคำขอไปประมวลผลใหม่!
ไม่ %(QUERY_STRING) เปลี่ยนแปลงทันที- ฉันจะไม่ให้หลักฐาน - มีการเขียนเกี่ยวกับพารามิเตอร์มากกว่าที่น่าสนใจในการอ่าน :)
คุณสามารถทำอะไรได้บ้างเพื่อตรวจสอบ RewriteCond ว่าพารามิเตอร์คำขอที่ผู้ใช้ส่งผ่าน ไม่ใช่พารามิเตอร์ที่แก้ไขโดย RewriteRules ดูเคล็ดลับท้ายบทความ
RewriteCond และประสิทธิภาพ
ขั้นแรก มีการตรวจสอบการจับคู่คำขอกับ RewriteRule จากนั้น - เงื่อนไขเพิ่มเติมเขียนใหม่Cond.
ควรพูดสองสามคำเกี่ยวกับลำดับที่ mod_rewrite ดำเนินการคำสั่ง เนื่องจาก .htaccess มาพร้อมกับ RewriteCond ก่อนแล้วจึง RewriteRule ดูเหมือนว่า mod_rewrite จะตรวจสอบเงื่อนไขทั้งหมดก่อน จากนั้นจึงเริ่มดำเนินการ RewriteRule
ในความเป็นจริงทุกอย่างเกิดขึ้นในทางกลับกัน ขั้นแรก mod_rewrite จะตรวจสอบว่าค่าคำขอปัจจุบันตรงกับนิพจน์ทั่วไป RewriteRule หรือไม่ จากนั้นจึงจะตรวจสอบเงื่อนไขทั้งหมดที่แสดงอยู่ใน RewriteCond
ดังนั้น หากคุณมีนิพจน์ทั่วไปสองหน้าใน RewriteRule ของคุณ และเมื่อพิจารณาถึงประสิทธิภาพแล้ว คุณตัดสินใจที่จะจำกัดการดำเนินการของกฎนี้ไว้ที่ RewriteConds เพิ่มเติม คุณควรรู้ว่าจะไม่มีอะไรทำงาน ในกรณีนี้ ควรใช้แฟล็ก RewriteRule [ค]หรือ [ส]เพื่อข้ามเพิ่มเติม กฎที่ซับซ้อนถ้ามีมากกว่านี้ ตรวจสอบง่ายๆไม่ได้ผล
ตัวแปรและแฟล็ก RewriteCond, แฟล็ก RewriteRule อื่นๆ เป็นต้น
อ่านเอกสารประกอบ
เราได้ทำความคุ้นเคยกับหลักการทำงานของ RewriteRule, RewriteBase, [L], [R] และแฟล็ก และยังได้ตรวจสอบกลไกการประมวลผลคำขอภายใน mod_rewrite สิ่งต่อไปนี้ยังคงไม่ได้รับผลกระทบ: แฟล็ก RewriteRule อื่นๆ, คำสั่ง RewriteCond และ RewriteMap
โชคดีที่คำสั่งและธงเหล่านี้ไม่ได้เต็มไปด้วยความลึกลับใดๆ และทำงานได้ตรงตามที่อธิบายไว้ในบทช่วยสอนส่วนใหญ่ เพื่อทำความเข้าใจพวกเขาเพียงแค่อ่าน เอกสารอย่างเป็นทางการ- ก่อนอื่น ฉันขอแนะนำให้ศึกษารายการตัวแปรที่สามารถตรวจสอบได้ใน RewriteCond - %(QUERY_STING), %(THE_REQUEST), %(REMOTE_ADDR), %(HTTP_HOST), %(HTTP:header) ฯลฯ)
ความแตกต่างในวิธีการทำงานของ mod_rewrite ในบริบท .htaccess และในบริบท VirtualHost
ในบริบทmod_rewrite ทำงานตรงกันข้ามทุกประการ
ดังที่ฉันได้กล่าวไว้ในตอนต้นของบทความ ทุกอย่างที่อธิบายไว้ข้างต้นเกี่ยวข้องกับการใช้ mod_rewrite ในบริบท .htaccess หากใช้ mod_rewrite ใน
- ใน
RewriteRule รวมถึงเส้นทางคำขอทั้งหมด เริ่มต้นจากเครื่องหมายทับแรกและลงท้ายด้วยจุดเริ่มต้น รับพารามิเตอร์: "http://example.com/some/news/category/post.html?comments_page=3" -> "/news/category/post.html" บรรทัดนี้ขึ้นต้นด้วย / เสมอ - อาร์กิวเมนต์ที่สองของ RewriteRule ต้องขึ้นต้นด้วย / มิฉะนั้นจะเป็น "คำขอไม่ถูกต้อง"
- RewriteBase ไม่สมเหตุสมผล
- การผ่านกฎจะเกิดขึ้นเพียงครั้งเดียว ธง [L] สิ้นสุดการประมวลผลกฎทั้งหมดที่อธิบายไว้ในนั้นจริง ๆ
โดยไม่ต้องทำซ้ำเพิ่มเติม
การเขียนนิพจน์ทั่วไป
พยายามเขียนนิพจน์ทั่วไปเพื่อให้กำหนดแบบสอบถามที่คุณต้องการแก้ไขได้แคบที่สุด เพื่อให้กฎ RewriteRule ไม่ทำงานโดยไม่ตั้งใจกับแบบสอบถามอื่น ตัวอย่างเช่น:# เริ่มต้นนิพจน์ทั่วไปทั้งหมดด้วย "^" (จุดเริ่มต้นของบรรทัด)
# และลงท้ายด้วย "$" (ตัวสิ้นสุดบรรทัด):
กฎการเขียนใหม่ ^news.php$ index.php
# แม้ว่าจะไม่จำเป็นก็ตาม - เพื่อความคล่องตัวและความเข้าใจในการกำหนดค่าที่ดีขึ้น:
เขียนกฎใหม่ ^news/(.*)$ index.php#หากเพียงตัวเลขเท่านั้นที่เข้าข่ายต้องระบุให้ชัดเจน
# ถ้าตัวเลขบางตัวเป็นค่าคงที่ให้ระบุให้ชัดเจน
# หากเครื่องหมายทับไม่ปรากฏในส่วนที่เหลือของคำขอ ให้จำกัดการแสดงเครื่องหมายเหล่านั้น
#อย่าลืมหนี"." (จุด).
# กฎต่อไปนี้กำหนดเป้าหมายข้อความค้นหาเช่น http://example.com/news/2009/07/28/b-effect.html
กฎการเขียนใหม่ ^news/20(2)/(2)/(2)/[^/]+\.html index.php
อย่างไรก็ตามโอ้ การแสดงออกปกติในไซต์ที่มีชื่อเสียงแห่งเดียวมีทั้งส่วน
การเปลี่ยนเส้นทางภายนอก
แม้ว่า mod_rewrite จะอนุญาตให้คุณเปลี่ยนแม้แต่การเปลี่ยนเส้นทางภายนอกโดยใช้ RewriteRule ไปจนถึงโปรโตคอล แต่ฉันก็ไม่แนะนำให้ทำเช่นนี้อย่างยิ่ง ในบทความ ตัวอย่างของการเปลี่ยนแปลงการเปลี่ยนเส้นทางภายนอกใช้เพื่อกำจัดแนวคิดเช่น "ลิงก์" และ "ไฟล์" เท่านั้น และแสดงให้เห็นอย่างชัดเจนยิ่งขึ้นว่า RewriteRule ใช้งานได้กับสตริงแบบธรรมดาฉันไม่คิดว่านักพัฒนา mod_rewrite ตั้งใจที่จะให้ใครทำเช่นนี้ ดังนั้นสิ่งประดิษฐ์ทุกประเภทจึงเป็นไปได้ อย่าทำแบบนี้ได้โปรด
วิธีหยุดการวนซ้ำไม่สิ้นสุด
บางครั้งตรรกะของการเปลี่ยนเส้นทางบนไซต์ก็เป็นเช่นนั้น การกระทำพิเศษ mod_rewrite ถือว่าสิ่งเหล่านี้เป็นเหมือนการเปลี่ยนเส้นทางแบบวนซ้ำไม่รู้จบ ลองมาตัวอย่างต่อไปนี้เว็บไซต์นี้มีหน้า /info.html ผู้เชี่ยวชาญด้าน SEO ตัดสินใจว่าเครื่องมือค้นหาจะจัดทำดัชนีหน้านี้ได้ดีขึ้นหากเรียกว่า /information.html และขอให้มีการเปลี่ยนเส้นทางภายนอกจาก info.html ไปยัง information.html อย่างไรก็ตาม ด้วยเหตุผลบางประการ นักพัฒนาเว็บไซต์ไม่สามารถเปลี่ยนชื่อ info.html เป็น information.html และทำการเปลี่ยนเส้นทางได้ - เขาต้องการให้ส่งข้อมูลโดยตรงจากไฟล์ info.html เขาเขียนกฎต่อไปนี้:
# ทำการเปลี่ยนเส้นทางภายนอก
เขียนกฎใหม่ ^info.html information.html
# แต่ตามคำขอ /information.html ยังคงให้ info.html
เขียนกฎใหม่ ^information.html info.html
...และกำลังเผชิญกับ. วนซ้ำไม่รู้จบ- ทุกคำขอ /information.html ได้รับการเปลี่ยนเส้นทางภายนอกอีกครั้งไปยัง /information.html
ปัญหานี้สามารถแก้ไขได้อย่างน้อยสองวิธี หนึ่งในนั้นได้รับการอธิบายไว้ในHabréแล้ว - คุณต้องติดตั้ง ตัวแปรสภาพแวดล้อมและขึ้นอยู่กับค่าของมัน หยุดการเปลี่ยนเส้นทาง รหัสจะมีลักษณะดังนี้:
เขียนใหม่ %(ENV:REDIRECT_FINISH) !^$
เขียนกฎใหม่ ^ - [L]
เขียนกฎใหม่ ^information.html$ info.html
โปรดทราบว่า mod_rewrite จะเติม "REDIRECT_" ต่อท้ายชื่อตัวแปร
วิธีที่สองคือตรวจสอบ THE_REQUEST ว่าผู้ใช้ร้องขออะไรกันแน่:
# การเปลี่ยนเส้นทางภายนอกจะเกิดขึ้นเฉพาะในกรณีที่ผู้ใช้ร้องขอ info.html
# หาก info.html เป็นผลมาจากการเปลี่ยนเส้นทางภายใน กฎจะไม่เริ่มทำงาน
RewriteCond %(THE_REQUEST) "^(GET|POST|HEAD) /info.html HTTP/+$"
เขียนกฎใหม่ ^info.html$ information.htmlเขียนกฎใหม่ ^information.html$ info.html
กำลังวิเคราะห์คำขอของผู้ใช้เดิม - ต่อสู้กับการเปิดเผยลิงก์ Apache
เมื่อประมวลผลคำขอ Apache จะขยายอักขระที่เข้ารหัส URL จากคำขอดั้งเดิม ในบางกรณี สิ่งนี้อาจไม่เป็นที่ต้องการ - นักพัฒนาต้องการตรวจสอบคำขอเดิมของผู้ใช้ที่ยังไม่ได้แก้ไขอย่างแน่ชัด ซึ่งสามารถทำได้โดยการตรวจสอบตัวแปร %(THE_REQUEST) ใน RewriteCond:เขียนใหม่ %(THE_REQUEST) ^GET[\ ]+/tag/([^/]+)/[\ ]+HTTP.*$
กฎการเขียนใหม่ ^(.*)$ index.php?tag=%1 [L]
ในHabré มีการอภิปรายถึงกรณีดังกล่าว ซึ่งมีการนำตัวอย่างข้างต้นมาใช้ในเอกสารอย่างเป็นทางการของ Apache และโดยเฉพาะอย่างยิ่งรายละเอียดทางเทคนิค ใช่ใช่
ขอบคุณมากสำหรับความสนใจของคุณ!
แท็ก:
เพิ่มแท็กมีการรองรับคำสั่ง .htaccess อย่างเต็มรูปแบบ...
การต่ออายุโดเมน 199-00 RUR
กฎการแปลงลิงค์:
หากไม่มีคำสั่งโมดูล mod_rewrite ในไดเรกทอรีย่อยใน .htaccess กฎการแปลงทั้งหมดจะได้รับการสืบทอดจากไดเรกทอรีหลัก
หากมีคำสั่งโมดูล mod_rewrite ใด ๆ ในไฟล์ .htaccess จะไม่มีการสืบทอดใด ๆ และสถานะเริ่มต้นจะถูกตั้งค่าให้เหมือนกับในสถานะหลัก ไฟล์การกำหนดค่าเว็บเซิร์ฟเวอร์ (ค่าเริ่มต้น "ปิด") ดังนั้น หากคุณต้องการกฎการแปลงสำหรับไดเรกทอรีเฉพาะ คุณจะต้องแทรกคำสั่ง "RewriteEngine on" อีกครั้งใน .htaccess สำหรับไดเรกทอรีเฉพาะอีกครั้ง
เมื่อสืบทอดกฎจากไดเร็กทอรีระดับสูงและเพิ่มกฎใหม่ที่ไม่ซ้ำใคร แคตตาล็อกนี้- จำเป็นต้องตั้งค่าต่อไปนี้ตั้งแต่เริ่มต้น: "RewriteEngine on" และ - คำสั่งสุดท้ายแจ้งให้เซิร์ฟเวอร์ทราบเกี่ยวกับการดำเนินการต่อ
เพื่อติดโดเมนเว็บ
เพื่อกำจัด www ทันทีและกาวโดเมนที่ไม่มี www (http://site เช่นใน) แถบที่อยู่จะไม่มีโดเมนที่มี www อีกต่อไป - http://www.site) คุณต้องใช้รหัสต่อไปนี้:
เขียนใหม่เครื่องยนต์บน
RewriteCond %(HTTP_HOST) ^www\.site
กฎการเขียนใหม่ ^(.*)$ http://site/$1
เปลี่ยนเส้นทาง Htaccess- การเปลี่ยนเส้นทาง 301 - “เอกสารถูกย้ายตลอดไป” ช่วยแก้ปัญหานี้ได้อย่างง่ายดาย
หากต้องการทำสิ่งที่ตรงกันข้าม - เพื่อรวมเว็บไซต์ที่ไม่มี www (http://site) เข้ากับ www (http://www.site - เช่น ใช้เฉพาะใน URL) คุณต้องใช้โค้ด .htaccess ต่อไปนี้ซึ่งอยู่ที่ รากของโดเมน:
เขียนใหม่เครื่องยนต์บน
RewriteCond %(HTTP_HOST) ^ไซต์
กฎการเขียนใหม่ ^(.*)$ http://www.site/$1
เราเปิดเผยต่อสาธารณะเกี่ยวกับการกำหนดค่าที่ส่งถึงเรา - การตั้งค่า htaccess "/" - เครื่องหมายทับ แทนที่มันในตอนท้ายและยังบังคับให้ลบออกด้วย
ลบเครื่องหมายทับที่ส่วนท้ายของ url, .htaccess ลบเครื่องหมายทับที่ส่วนท้ายของบรรทัด url - ลิงก์
เขียนใหม่เครื่องยนต์บน
RewriteCond %(REQUEST_FILENAME) !-d # ไม่ใช่ไดเรกทอรี
RewriteCond %(REQUEST_URI) ^(.+)/$ # ลงท้ายด้วยจุดที่ท้าย
RewriteRule ^(.+)/$ /$1 # ลบเครื่องหมายทับที่ส่วนท้ายของ url - หลังอักขระตัวสุดท้าย
เพิ่มเครื่องหมายทับที่ส่วนท้ายของ url, htaccess เพิ่มเครื่องหมายทับที่ส่วนท้ายของบรรทัด url - ลิงก์
เขียนใหม่เครื่องยนต์บน
RewriteCond %(REQUEST_FILENAME) !-f # ไม่ใช่ไฟล์
RewriteCond %(REQUEST_URI) !(.*)/$ # ไม่ได้ลงท้ายด้วยจุดที่ท้าย
RewriteRule ^(.*[^/])$ $1/ # set - เพิ่มเครื่องหมายทับที่ส่วนท้ายของ url - หลังอักขระตัวสุดท้าย
เขียนใหม่ %( REMOTE _ USER ) !=""
RewriteCond /home/(%(REMOTE_USER)) -d
เขียนกฎใหม่ (.*) /home/%1/$1
มีสองไดเร็กทอรี /home/net/storag1 และ /home/net/storage2 ซึ่งคุณต้องค้นหาไฟล์ที่ร้องขอ:
RewriteCond /home/net/storage1/%(REQUEST_FILENAME) -f
RewriteRule (.+) /home/net/storage1/$1 [L]
RewriteCond /home/net/storage2/%(REQUEST_FILENAME) -f
RewriteRule (.+) /home/net/storage2/$1 [L]
บล็อกการเข้าถึงเว็บไซต์ในช่วงเวลาทำการ:
>1000
เขียนใหม่ %(TIME_HOUR)%(TIME_MIN)<1900
RewriteRule.* - [F]
การเปลี่ยนเส้นทางผู้ใช้ด้วยตัวแทนผู้ใช้เฉพาะ - เบราว์เซอร์ไปยังเวอร์ชันเฉพาะของไซต์ (ตัวอย่างเช่น เมื่อเข้าถึงจาก iPhone - เปลี่ยนเส้นทางผู้ใช้ไปยังโดเมนย่อยด้วยเวอร์ชันมือถือพิเศษของไซต์:
เขียนใหม่เครื่องยนต์บน
RewriteRule .* http://iphone.site/ [R]
หรือไม่เปลี่ยนเส้นทางไปยังโดเมนย่อย แต่ไปยังไดเร็กทอรีพิเศษบนไซต์ /iPhone-versia/ รหัส .htaccess จะเป็นดังนี้:
เขียนใหม่เครื่องยนต์บน
เขียนใหม่ %(HTTP_USER_AGENT) iPhone
เขียนใหม่ %(REQUEST_URI) !^/iPhone-version/
RewriteRule .* /iPhone-version/ [R]
ในกรณีนี้ เราใช้ส่วนหัว HTTP ตัวแปรโกลบอล "User-Agent" ซึ่งจะถูกส่งโดยเบราว์เซอร์ทั้งหมดเมื่อเข้าถึงทรัพยากรใดๆ (ส่วนหัวนี้ในบางเบราว์เซอร์สามารถเปลี่ยนเป็นค่าใดก็ได้ แต่ใน 99% ไม่มีใครทำเช่นนี้ เนื่องจาก มันลดความสะดวกสบายในการท่องอินเทอร์เน็ต เนื่องจากตัวอย่างเช่น เว็บไซต์จำนวนหนึ่งประกอบขึ้นด้วยการออกแบบเว็บไซต์สำหรับแต่ละเบราว์เซอร์ โดยคำนึงถึงการใช้งาน HTML5, CSS และข้อกำหนดมาตรฐานอื่น ๆ โดยเฉพาะ ซึ่งเบราว์เซอร์ที่แตกต่างกันมักจะนำไปใช้โดยมีความแตกต่างที่สำคัญ
เบราว์เซอร์ iPhone มีค่า "User-Agent" ดังนี้:
Mozilla/5.0 (iPhone; U; CPU เช่น Mac OS X; ru)
AppleWebKit/420+ (KHTML เช่น Gecko) เวอร์ชัน/3.1 มือถือ/1C25 Safari/419.5
การเปลี่ยนเส้นทางโฮมไดเร็กทอรีสำหรับคนแปลกหน้า
คำอธิบาย:
เราต้องการเปลี่ยนเส้นทาง URL โฮมไดเร็กทอรีไปยังเว็บเซิร์ฟเวอร์อื่น www.somewhere.com เมื่อผู้ใช้ที่ร้องขอไม่ได้อยู่ในโดเมนท้องถิ่น ourdomain.com บางครั้งใช้ในบริบทของโฮสต์เสมือน
เพียงกฎการเปลี่ยนเส้นทาง:
การเปลี่ยนเส้นทาง URL ที่ไม่มีอยู่ไปยังเว็บเซิร์ฟเวอร์อื่น
คำอธิบาย:
คำถามที่พบบ่อยเกี่ยวกับการเขียน URL ใหม่คือวิธีเปลี่ยนเส้นทางคำขอที่ไม่มีอยู่จากเซิร์ฟเวอร์ A ไปยังเซิร์ฟเวอร์ B ซึ่งโดยปกติจะทำผ่านสคริปต์ ErrorDocument CGI ในภาษา Perl แต่มีวิธีแก้ไขด้วยโมดูล mod_rewrite อย่างไรก็ตาม โปรดทราบว่าวิธีนี้ใช้ทรัพยากรน้อยกว่าการใช้สคริปต์ ErrorDocument CGI!
โซลูชันแรกมีประสิทธิภาพดีกว่าแต่มีความยืดหยุ่นน้อยกว่าและป้องกันข้อผิดพลาดน้อยกว่า:
เขียนใหม่เครื่องยนต์บน
RewriteCond /ของคุณ/docroot/%(REQUEST_FILENAME) !-f
ปัญหาคือ วิธีนี้ใช้ได้กับเพจที่อยู่ภายใน DocumentRoot เท่านั้น แม้ว่าคุณสามารถเพิ่มเงื่อนไขเพิ่มเติมได้ (เช่น เพื่อจัดการโฮมไดเร็กทอรี ฯลฯ) แต่ก็มีตัวเลือกที่ดีกว่า:
เขียนใหม่เครื่องยนต์บน
เขียนใหม่ %(REQUEST_URI) !-U
กฎการเขียนใหม่ ^(.+) http://webserverB.dom/$1
สิ่งนี้ใช้คุณสมบัติการตรวจสอบ URL แบบมองไปข้างหน้าที่พบใน mod_rewrite ด้วยเหตุนี้จึงสามารถใช้ได้กับ URL ทุกประเภทและปลอดภัยด้วย อย่างไรก็ตาม สิ่งนี้จะลดประสิทธิภาพของเว็บเซิร์ฟเวอร์เนื่องจากมีการร้องขอย่อยภายในมากกว่าหนึ่งคำขอสำหรับแต่ละคำขอ ดังนั้น หากเว็บเซิร์ฟเวอร์ของคุณมีโปรเซสเซอร์ที่ทรงพลัง ให้ใช้ตัวเลือกนี้ หากเป็นเครื่องที่ช้า ให้ใช้สคริปต์ ErrorDocument CGI ตัวแรกหรือที่ดีกว่า
เปลี่ยนเส้นทางขึ้นอยู่กับเวลา
คำอธิบาย:
เมื่อพูดถึงกลเม็ดต่างๆ เช่น เนื้อหาที่ต้องคำนึงถึงเวลา เว็บมาสเตอร์จำนวนมากยังคงใช้สคริปต์ CGI ที่เปลี่ยนเส้นทางไปยังหน้าพิเศษ สามารถทำได้ผ่าน mod_rewrite ได้อย่างไร?
มีตัวแปรมากมายชื่อ TIME_xxx สำหรับเงื่อนไขการเปลี่ยนเส้นทาง ร่วมกับตัวอย่างพจนานุกรมพิเศษเพื่อการเปรียบเทียบ
เขียนใหม่เครื่องยนต์บน
เขียนใหม่ %(TIME_HOUR)%(TIME_MIN) >0700
เขียนใหม่ %(TIME_HOUR)%(TIME_MIN)<1900
เขียนกฎใหม่ ^foo\.html$ foo.day.html
เขียนกฎใหม่ ^foo\.html$ foo.night.html
ซึ่งจะส่งคืนเนื้อหาของ foo.day.html เมื่อขอ URL foo.html ตั้งแต่เวลา 07:00 ถึง 19:00 น. และเนื้อหาของ foo.night.html ในช่วงเวลาที่เหลือ สิ่งดีๆ ให้กับทุกเพจ...
การจัดการเนื้อหา - จากเก่าไปใหม่ (ภายใน)
คำอธิบาย:
สมมติว่าเราเพิ่งเปลี่ยนชื่อเพจ bar.html เป็น foo.html และตอนนี้ต้องการทำให้ URL เก่าพร้อมใช้งานสำหรับความเข้ากันได้แบบย้อนหลัง ที่จริงแล้ว เราต้องการให้ผู้ใช้ที่ใช้ URL เก่าไม่ทราบด้วยซ้ำว่ามีการเปลี่ยนชื่อเพจแล้ว
เราจะเปลี่ยนเส้นทาง URL เก่าไปยัง URL ใหม่ผ่านการเปลี่ยนเส้นทางภายในโดยใช้คำสั่งต่อไปนี้:
เขียนใหม่เครื่องยนต์บน
RewriteBase /~quux/
เขียนกฎใหม่ ^foo\.html$ bar.html
จากเก่าไปใหม่ (ภายนอก)
คำอธิบาย:
สมมติว่าเราเพิ่งเปลี่ยนชื่อเพจ bar.html เป็น foo.html และตอนนี้ต้องการทำให้ URL เก่าพร้อมใช้งานสำหรับความเข้ากันได้แบบย้อนหลัง อย่างไรก็ตาม คราวนี้เราต้องการให้ผู้ใช้ที่ใช้ URL เก่าจดจำ URL ใหม่นี้ได้ เช่น แถบที่อยู่ของเบราว์เซอร์ควรเปลี่ยนด้วย
เราใช้การเปลี่ยนเส้นทาง HTTP ไปยัง URL ใหม่ซึ่งจะนำไปสู่การเปลี่ยนแปลงในเบราว์เซอร์ (ในแถบที่อยู่) และนี่คือวิธีที่ผู้ใช้เห็น:
เขียนใหม่เครื่องยนต์บน
RewriteBase /~quux/
เขียนกฎใหม่ ^foo\.html$ bar.html [R]
เนื้อหาขึ้นอยู่กับเบราว์เซอร์
คำอธิบาย:
บางครั้ง อย่างน้อยสำหรับเพจระดับบนสุดที่สำคัญ จำเป็นต้องจัดเตรียมเนื้อหาเฉพาะเบราว์เซอร์ เช่น ประการแรกคุณต้องออกเวอร์ชันเต็มสำหรับ Netscape เวอร์ชันล่าสุด เวอร์ชันขั้นต่ำสำหรับเบราว์เซอร์ Lynx และเวอร์ชันกลางสำหรับเวอร์ชันอื่น ๆ ทั้งหมด
เราไม่สามารถใช้การเจรจาต่อรองเนื้อหาได้เนื่องจากเบราว์เซอร์ไม่ได้เป็นตัวแทนของประเภทในแบบฟอร์มนี้ เราควรใช้ส่วนหัว HTTP "User-Agent" แทน เงื่อนไขต่อไปนี้จะมีผลดังต่อไปนี้: หากส่วนหัว HTTP "User-Agent" ขึ้นต้นด้วย "Mozilla/3" หน้า foo.html จะถูกแปลงเป็น foo.NS.html และการเปลี่ยนเส้นทางจะหยุดลง หากเบราว์เซอร์เป็น Lynx หรือ Mozilla เวอร์ชัน 1 หรือ 2 URL จะกลายเป็น foo.20.html เบราว์เซอร์อื่นๆ ทั้งหมดจะได้รับหน้า foo.32.html ทำได้โดยใช้ชุดคำสั่งต่อไปนี้:
เขียนใหม่ %(HTTP_USER_AGENT) ^Mozilla/3.*
เขียนกฎใหม่ ^foo\.html$ foo.NS.html [L]
เขียนใหม่ %(HTTP_USER_AGENT) ^Lynx/.*
เขียนใหม่ %(HTTP_USER_AGENT) ^Mozilla/.*
เขียนกฎใหม่ ^foo\.html$ foo.20.html [L]
เขียนกฎใหม่ ^foo\.html$ foo.32.html [L]
กระจกแบบไดนามิก
คำอธิบาย:
สมมติว่ามีเพจที่ยอดเยี่ยมบนโฮสต์ระยะไกล และเราต้องการนำเพจเหล่านั้นมาไว้ในเนมสเปซ (ไซต์) ของเรา สำหรับเซิร์ฟเวอร์ FTP เราจะใช้โปรแกรมมิเรอร์ซึ่งจัดการการอัปเดตสำเนาของข้อมูลระยะไกลบนเครื่องท้องถิ่น สำหรับเว็บเซิร์ฟเวอร์ เราสามารถใช้โปรแกรม webcopy ซึ่งทำสิ่งที่คล้ายกันบน HTTP อย่างไรก็ตาม เทคโนโลยีทั้งสองนี้มีข้อเสียเปรียบหลักประการหนึ่ง นั่นคือ สำเนาในเครื่องจะอัปเดตอยู่เสมอบ่อยเท่าที่เราเรียกใช้โปรแกรมนี้ มันจะดีกว่ามากถ้ามิเรอร์ไม่คงที่ ควรมีสำเนาที่ตรงกันทั้งหมด โดยไม่คำนึงถึงความถี่ในการรันโปรแกรมนี้ แต่เราต้องการมิเรอร์แบบไดนามิกที่มีการอัปเดตข้อมูลอัตโนมัติเมื่อจำเป็น (การอัปเดตข้อมูลบนเซิร์ฟเวอร์ระยะไกล)
เพื่อให้มีฟังก์ชันการทำงานนี้ เราจะแสดงเพจระยะไกลหรือแม้แต่ไซต์ระยะไกลทั้งหมดลงในพื้นที่เว็บของเราโดยใช้ตัวเลือก Proxy Throughput (แฟล็ก [P]):
เขียนใหม่เครื่องยนต์บน
RewriteBase /~quux/
RewriteRule ^hotsheet/(.*)$ http://www.tstimpreso.com/hotsheet/$1 [P]
เขียนใหม่เครื่องยนต์บน
RewriteBase /~quux/
RewriteRule ^usa-news\.html$ http://www.quux-corp.com/news/index.html [P]
กระจกมองข้างแบบไดนามิกย้อนกลับ
คำอธิบาย:
เขียนใหม่เครื่องยนต์บน
RewriteCond /mirror/of/remotesite/$1 -U
กฎการเขียนใหม่ ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1
จากสถิตยศาสตร์ไปจนถึงไดนามิก
คำอธิบาย:
คุณจะแปลงเพจแบบคงที่ foo.html ให้เป็นเวอร์ชันไดนามิก foo.cgi ด้วยวิธีที่มองไม่เห็นได้อย่างไร เช่น เพื่อให้ทั้งเบราว์เซอร์และผู้ใช้ไม่สังเกตเห็นสิ่งนี้
เราเพียงแค่เปลี่ยนเส้นทาง URL ไปยังสคริปต์ CGI และปรับประเภท MIME เพื่อให้ทำงานเป็นสคริปต์ CGI ได้จริง ดังนั้น การร้องขอไปยัง /~quux/foo.html จะส่งผลให้มีการเรียกไปยัง /~quux/foo.cgi ภายใน
เขียนใหม่เครื่องยนต์บน
RewriteBase /~quux/
เขียนกฎใหม่ ^foo\.html$ foo.cgi
การสร้างเนื้อหาใหม่ได้ทันที
คำอธิบาย:
นี่เป็นสิ่งสำหรับผู้ริเริ่มจริงๆ: เพจที่สร้างขึ้นแบบไดนามิกแต่ได้รับการดูแลแบบคงที่ เช่น หน้าต่างๆ ควรทำหน้าที่เป็นหน้าคงที่ล้วนๆ (อ่านจากระบบไฟล์แล้วจึงให้บริการเมื่อมีการร้องขอ) แต่ควรสร้างขึ้นแบบไดนามิกโดยเว็บเซิร์ฟเวอร์ หากไม่มีอยู่ในระบบไฟล์ วิธีนี้ทำให้คุณสามารถมีเพจที่สร้างโดย CGI ที่ให้บริการแบบคงที่ เว้นแต่จะมีใครบางคน (หรือผู้กำหนดเวลา) ลบเนื้อหาแบบคงที่ ในกรณีนี้ เนื้อหาจะได้รับการอัปเดต
ทำได้โดยใช้ชุดคำสั่งต่อไปนี้:
เขียนใหม่ %(REQUEST_FILENAME) !-s
เขียนกฎใหม่ ^page\.html$ page.cgi
ในที่นี้ คำขอไปยัง page.html จะทำให้ page.cgi ที่เกี่ยวข้องถูกเรียกใช้ภายใน หาก page.html ยังคงหายไปหรือมีขนาดเป็นศูนย์ เคล็ดลับที่นี่คือ page.cgi เป็นสคริปต์ CGI ทั่วไปที่ (นอกเหนือจาก STDOUT ของตัวเอง) เขียนเอาต์พุตลงในไฟล์ page.html การทำงานครั้งนี้เซิร์ฟเวอร์จะส่งข้อมูลไปที่ page.html เมื่อผู้ดูแลเว็บต้องการอัปเดตเนื้อหา เขาเพียงแต่ลบ page.html (โดยปกติจะใช้ cronjob)
การเปลี่ยนเส้นทางตามภาษาที่กำหนดโดยเว็บเบราว์เซอร์ที่เยี่ยมชม
คำอธิบาย:
ไฟล์ Htaccess จะเปลี่ยนเส้นทางผู้เยี่ยมชมด้วยภาษาเฉพาะไปยังหน้าที่คุณกำหนดด้วยเนื้อหาที่เกี่ยวข้อง
เราปล่อยให้ภาษาธรรมชาติที่เราต้องการ (เช่น zh- Chinese) และใส่หน้าของเราแทน http://site/doc/ allowance_material/index.php:
เขียนใหม่เครื่องยนต์บน
RewriteCond %(HTTP:Accept-Language) (aa|ab|af|am|ar|as|ay|az|ba|be|bg|bh|bi|bn|bo|br|ca|co|cs|cy| da|de|dz|el|en|eo|es|et|eu|ฟะ|fi|fj|fo|fr|fy|ga|gd|gl|gn|gu|ha|hi|hr|hu|hy| ia|ie|ik|ใน|คือ|มัน|iw|ja|ji|jw|ka|kk|kl|km|kn|ko|ks|ku|ky|la|ln|lo|lt|lv|mg| mi|mk|ml|mn|mo|mr|ms|mt|my|na|ne|nl|no|oc|om|หรือ|pa|pl|ps|pt|qu|rm|rn|ro|ru| rw|sa|sd|sg|sh|si|sk|sl|sm|sn|ดังนั้น|sq|sr|ss|st|su|sv|sw|ta|te|tg|th|ti|tk|tl| tn|ถึง|tr|ts|tt|tw|uk|ur|uz|vi|vo|wo|xh|yo|zh|zu)
เขียนกฎใหม่ ..php
โดเมนที่เพิ่งเปิดตัวพร้อม PR และ TIC:
บริการ http://reg.ru - ผู้ให้บริการโฮสติ้งและผู้รับจดทะเบียนโดเมนที่ใหญ่ที่สุดช่วยให้คุณสามารถสมัครจดทะเบียนชื่อโดเมนที่เพิ่งเปิดตัวโดยผู้ดูแลระบบคนก่อน โดเมนที่เผยแพร่มักจะมีตัวบ่งชี้ TIC และ PR สูง และอาจน่าสนใจสำหรับการซื้อกิจการ
เปิดตัว domains.RU พร้อม TIC: |
โดเมนพรีเมียมที่ใช้ได้: |
จำนวนข้อมูล: ไบต์