ตัวอย่าง Apache mod เขียนใหม่ วิธีเปลี่ยนเส้นทางจาก HTTP เป็น HTTPS ทุกหน้ายกเว้นบางหน้า เปลี่ยนเส้นทาง URL จากตัวอักษรขนาดใหญ่ไปเป็นตัวอักษรตัวเล็ก

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" ใหม่โดยเปิดใช้งานโมดูลพร็อกซี

หยุดกระบวนการแปลง ณ จุดนี้และไม่ใช้กฎการแปลงใดๆ เพิ่มเติม ซึ่งสอดคล้องกับตัวดำเนินการสุดท้ายใน Perl หรือ ไปยังผู้ดำเนินการเบรกใน C. ใช้แฟล็กนี้เพื่อป้องกันไม่ให้ URL ปัจจุบันถูกแปลงตามกฎการแปลงที่ตามมา ตัวอย่างเช่น ใช้สิ่งนี้เพื่อแปลง URL รากจาก ("/") เป็น URL จริงเช่น "/e/www/"

  • "ถัดไป|N" (รอบถัดไป)

เริ่มกระบวนการเปลี่ยนแปลงใหม่ (เริ่มจากกฎข้อแรก) ในกรณีนี้ URL จะถูกจับคู่กับเงื่อนไขบางอย่างอีกครั้ง แต่ไม่ใช่ URL ดั้งเดิม แต่เป็น URL ที่มาจากกฎการแปลครั้งล่าสุด ซึ่งสอดคล้องกับคำสั่งถัดไปในภาษา Perl หรือ ไปยังผู้ดำเนินการต่อไปจากภาษา C ใช้แฟล็กนี้เพื่อเริ่มกระบวนการแปลงใหม่ กล่าวคือ ข้ามไปที่จุดเริ่มต้นของลูปโดยไม่มีเงื่อนไข

อย่างไรก็ตาม ระวังอย่าให้วนซ้ำไม่สิ้นสุด!

  • "chain|C" (ลิงก์ไปยังกฎถัดไป)

การตั้งค่าสถานะนี้จะเชื่อมโยงกฎปัจจุบันกับกฎถัดไป (ซึ่งสามารถเชื่อมโยงกับกฎถัดไปได้ เป็นต้น) สิ่งนี้มีผลกระทบดังต่อไปนี้: หากกฎตรงกัน กระบวนการจะดำเนินต่อไปตามปกติ กล่าวคือ แฟล็กจะไม่มีผลใดๆ หากกฎไม่ตรงกับเงื่อนไข กฎที่เกี่ยวข้องทั้งหมดจะถูกข้ามไป ตัวอย่างเช่น ใช้สิ่งนี้เพื่อลบส่วน ".www" ในกฎการกำหนดค่าบริบทไดเรกทอรีที่ทำงานอยู่เมื่อคุณอนุญาตให้มีการเปลี่ยนเส้นทางภายนอก (โดยที่ไม่ควรมี ".www"!)

บังคับให้ประเภท 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 ทำงานได้ง่ายมาก

  1. เราเข้าแถวแล้ว
  2. เปรียบเทียบกับนิพจน์ทั่วไปในอาร์กิวเมนต์แรก
  3. หากมีการจับคู่ให้เปลี่ยนใหม่ ทั้งบรรทัดเป็นค่าของอาร์กิวเมนต์ที่สอง
  4. ส่งผ่านสตริงไปยัง 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 - สมบูรณ์ที่สุด
หากเส้นทางเป็นแบบสัมบูรณ์ RewriteBase จะไม่ทำอะไรเลย และถ้ามันสัมพันธ์กัน RewriteBase จะต่อท้ายตัวเองทางด้านซ้าย ใช้ได้กับการเปลี่ยนเส้นทางทั้งภายในและภายนอก:
# .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 ทำอะไร เราก็สามารถทำได้ กำหนดกฎเกณฑ์ที่ถูกต้องดังต่อไปนี้:
  1. RewriteBase ต้องตรงกับเส้นทางจากรากของไซต์ไปยัง .htaccess
  2. คุณจะต้องเริ่มการเปลี่ยนเส้นทางด้วย "/" เมื่อคุณต้องการระบุเส้นทางที่แน่นอนจากรูทไซต์ไปยังไฟล์


จะเกิดอะไรขึ้นถ้าคุณไม่ระบุ 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 ข้อผิดพลาดของเซิร์ฟเวอร์"ในที่สุด. ในตัวอย่างนี้ การวนซ้ำไม่สิ้นสุดนั้นชัดเจน แต่ในการกำหนดค่าที่ซับซ้อนมากขึ้น คุณอาจต้องเจาะลึกกฎเพื่อพิจารณาว่าข้อความค้นหาใดที่วนซ้ำไปมา
  1. เมื่อใช้การเปลี่ยนเส้นทางภายนอก - หรือ . ในกรณีของการเปลี่ยนเส้นทางภายนอก การประมวลผลคำขอเพิ่มเติมนั้นไม่เป็นที่พึงปรารถนา (ดูด้านล่างเกี่ยวกับธง [R]) และควรหยุดไว้จะดีกว่า
  2. เมื่อมีการวนซ้ำใน .htaccess ที่ไม่สามารถกำจัดได้ และจะต้องหยุดการประมวลผลคำขอโดย mod_rewrite ในกรณีนี้ จะใช้โครงสร้างพิเศษ - ดูส่วนท้ายของบทความเพื่อดูเคล็ดลับในหัวข้อนี้
แต่ตัวอย่างด้านล่างจะไม่วนซ้ำ พยายามระบุสาเหตุและไฟล์ใดที่จะมอบให้กับ Apache ในที่สุด
# คำขอ: 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 พบเครื่องหมายคำถามในอาร์กิวเมนต์ที่สอง ระบบจะรู้ว่าพารามิเตอร์ในคำขอกำลังได้รับการแก้ไข เป็นผลให้เกิดสิ่งต่อไปนี้:
  1. RewriteRule แทนที่สตริงที่ดำเนินการด้วยส่วนหนึ่งของอาร์กิวเมนต์ที่สอง ถึง เครื่องหมายคำถาม - โปรดทราบว่าพารามิเตอร์คำขอใหม่ อย่าตีไปยังสตริงที่ RewriteRules ที่ตามมาจะใช้งานได้
  2. ส่วนหนึ่งของข้อโต้แย้งที่สอง หลังเครื่องหมายคำถามจบลงที่ตัวแปร %(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 สำหรับเงื่อนไขการเปลี่ยนเส้นทาง ร่วมกับตัวอย่างพจนานุกรมพิเศษเพื่อการเปรียบเทียบ STRING และ =STRING เราสามารถดำเนินการเปลี่ยนเส้นทางตามเวลาได้:

เขียนใหม่เครื่องยนต์บน

เขียนใหม่ %(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:
โดเมนพรีเมียมที่ใช้ได้:

จำนวนข้อมูล: ไบต์