คุณสมบัติที่ซ่อนอยู่ของ mod_rewrite


119

ดูเหมือนว่าจะมีmod_rewriteกระทู้จำนวนพอสมควรที่ลอยอยู่รอบ ๆ เมื่อเร็ว ๆ นี้ด้วยความสับสนเล็กน้อยว่ามันทำงานอย่างไร ด้วยเหตุนี้ฉันจึงรวบรวมบันทึกย่อบางส่วนเกี่ยวกับฟังก์ชันการทำงานทั่วไปและอาจมีความแตกต่างที่น่ารำคาญเล็กน้อย

คุณใช้คุณลักษณะ / ปัญหาทั่วไปอะไรอีกmod_rewriteบ้าง


5

คำตอบ:


203

ตำแหน่งที่จะวางกฎ mod_rewrite

mod_rewriteอาจวางกฎไว้ในhttpd.confไฟล์หรือภายใน.htaccessไฟล์ หากคุณสามารถเข้าถึงได้การhttpd.confวางกฎที่นี่จะให้ประโยชน์ด้านประสิทธิภาพ (เนื่องจากกฎจะได้รับการประมวลผลครั้งเดียวเมื่อเทียบกับทุกครั้งที่.htaccessมีการเรียกไฟล์)

กำลังบันทึกคำขอ mod_rewrite

อาจเปิดใช้งานการบันทึกจากภายในhttpd.confไฟล์ (รวมถึง<Virtual Host>):

# logs can't be enabled from .htaccess
# loglevel > 2 is really spammy!
RewriteLog /path/to/rewrite.log
RewriteLogLevel 2

กรณีการใช้งานทั่วไป

  1. ในการส่งคำขอทั้งหมดไปยังจุดเดียว:

    RewriteEngine on
    # ignore existing files
    RewriteCond %{REQUEST_FILENAME} !-f   
    # ignore existing directories
    RewriteCond %{REQUEST_FILENAME} !-d   
    # map requests to index.php and append as a query string
    RewriteRule ^(.*)$ index.php?query=$1 
    

    ตั้งแต่ Apache 2.2.16 คุณยังสามารถใช้FallbackResourceไฟล์.

  2. การจัดการ 301/302 การเปลี่ยนเส้นทาง:

    RewriteEngine on
    # 302 Temporary Redirect (302 is the default, but can be specified for clarity)
    RewriteRule ^oldpage\.html$ /newpage.html [R=302]  
    # 301 Permanent Redirect
    RewriteRule ^oldpage2\.html$ /newpage.html [R=301] 
    

    หมายเหตุ : การเปลี่ยนเส้นทางภายนอกเป็นการเปลี่ยนเส้นทาง 302 โดยปริยาย:

    # this rule:
    RewriteRule ^somepage\.html$ http://google.com
    # is equivalent to:
    RewriteRule ^somepage\.html$ http://google.com [R]
    # and:
    RewriteRule ^somepage\.html$ http://google.com [R=302]
    
  3. บังคับใช้ SSL

    RewriteEngine on
    RewriteCond %{HTTPS} off
    RewriteRule ^(.*)$ https://example.com/$1 [R,L]
    
  4. ธงทั่วไป:

    • [R]หรือ[redirect]- บังคับให้เปลี่ยนเส้นทาง (ค่าเริ่มต้นคือ 302 การเปลี่ยนเส้นทางชั่วคราว)
    • [R=301]หรือ[redirect=301]- บังคับให้เปลี่ยนเส้นทาง 301 แบบถาวร
    • [L]หรือ[last]- หยุดกระบวนการเขียนใหม่ (ดูหมายเหตุด้านล่างในข้อผิดพลาดทั่วไป)
    • [NC]หรือ[nocase]- ระบุว่าการจับคู่ควรไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่


    การใช้แฟล็กแบบยาวมักจะอ่านได้ง่ายกว่าและจะช่วยให้ผู้อื่นที่เข้ามาอ่านโค้ดของคุณในภายหลัง

    คุณสามารถแยกหลายแฟล็กด้วยลูกน้ำ:

    RewriteRule ^olddir(.*)$ /newdir$1 [L,NC]
    

ข้อผิดพลาดทั่วไป

  1. การmod_aliasเปลี่ยนเส้นทางรูปแบบผสมกับmod_rewrite

    # Bad
    Redirect 302 /somepage.html http://example.com/otherpage.html
    RewriteEngine on
    RewriteRule ^(.*)$ index.php?query=$1
    
    # Good (use mod_rewrite for both)
    RewriteEngine on
    # 302 redirect and stop processing
    RewriteRule ^somepage.html$ /otherpage.html [R=302,L] 
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    # handle other redirects
    RewriteRule ^(.*)$ index.php?query=$1                 
    

    หมายเหตุ : คุณสามารถผสมmod_aliasกับmod_rewriteแต่มันเกี่ยวข้องกับการทำงานมากขึ้นกว่าเพียงแค่การเปลี่ยนเส้นทางการจัดการขั้นพื้นฐานดังกล่าวข้างต้น

  2. บริบทมีผลต่อไวยากรณ์

    ภายใน.htaccessไฟล์จะไม่มีการใช้เครื่องหมายทับนำหน้าในรูปแบบ RewriteRule:

    # given: GET /directory/file.html
    
    # .htaccess
    # result: /newdirectory/file.html
    RewriteRule ^directory(.*)$ /newdirectory$1
    
    # .htaccess
    # result: no match!
    RewriteRule ^/directory(.*)$ /newdirectory$1
    
    # httpd.conf
    # result: /newdirectory/file.html
    RewriteRule ^/directory(.*)$ /newdirectory$1
    
    # Putting a "?" after the slash will allow it to work in both contexts:
    RewriteRule ^/?directory(.*)$ /newdirectory$1
    
  3. [L] ไม่สุดท้าย! (บางครั้ง)

    [L]หยุดธงเขียนกฎการประมวลผลใด ๆ ต่อไปสำหรับผู้ที่ผ่านไปผ่านชุดกฎ อย่างไรก็ตามหาก URL ได้รับการแก้ไขในรหัสผ่านนั้นและคุณอยู่ใน.htaccessบริบทหรือ<Directory>ส่วนนั้นคำขอที่แก้ไขของคุณจะถูกส่งกลับไปยังเครื่องมือแยกวิเคราะห์ URL อีกครั้ง และในการผ่านครั้งต่อไปอาจตรงกับกฎที่แตกต่างกันในครั้งนี้ หากคุณไม่เข้าใจสิ่งนี้มักดูเหมือนว่า[L]ธงของคุณไม่มีผล

    # processing does not stop here
    RewriteRule ^dirA$ /dirB [L] 
    # /dirC will be the final result
    RewriteRule ^dirB$ /dirC     
    

    บันทึกการเขียนซ้ำของเราแสดงให้เห็นว่ามีการเรียกใช้กฎสองครั้งและมีการอัปเดต URL สองครั้ง:

    rewrite 'dirA' -> '/dirB'
    internal redirect with /dirB [INTERNAL REDIRECT]
    rewrite 'dirB' -> '/dirC'
    

    วิธีที่ดีที่สุดคือการใช้[END]แฟล็ก ( ดูเอกสาร Apache ) แทน[L]แฟล็กหากคุณต้องการหยุดการประมวลผลกฎเพิ่มเติมทั้งหมด (และการส่งต่อในภายหลัง) อย่างไรก็ตาม[END]แฟล็กจะใช้ได้เฉพาะกับApache v2.3.9 +เท่านั้นดังนั้นหากคุณมี v2.2 หรือต่ำกว่าคุณจะติดอยู่กับ[L]แฟล็

    สำหรับเวอร์ชันก่อนหน้านี้คุณต้องใช้RewriteCondคำสั่งเพื่อป้องกันการจับคู่ของกฎในการส่งผ่านของเอ็นจินการแยกวิเคราะห์ URL ในภายหลัง

    # Only process the following RewriteRule if on the first pass
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ...
    

    หรือคุณต้องตรวจสอบให้แน่ใจว่า RewriteRule ของคุณอยู่ในบริบท (กล่าวคือhttpd.conf) ที่จะไม่ทำให้คำขอของคุณถูกแยกวิเคราะห์ซ้ำ


10
เพื่อนบทความที่ดีที่สุดบนอินเทอร์เน็ตตอนนี้เกี่ยวกับ mod rewrite ฉันเกลียดสิ่งนั้น ฉันเป็นคนนอกรีต lighttpd เพราะฉันเกลียด mod_rewrite มากแค่ไหน
Kent Fredric

3
นี่เป็นคำแนะนำที่มีประโยชน์ที่สุดที่ฉันพบใน mod_rewrite จนถึงตอนนี้ เพียงแค่ค้นหาเกี่ยวกับ RewriteLog ก็ช่วยแก้ไขปัญหามากมายที่ทำให้ฉันต้องใช้เวลาหลายวันในการติดตามกลายเป็นไม่กี่นาที (ฉันหมายถึงกฎถูกเขียนขึ้น แต่ฉันคิดไม่ออกว่าทำไมมันถึงใช้ไม่ได้)
โจชิน

โพสต์อายุ 1 ปี แต่สิ่งที่มีประโยชน์มากกว่าที่ฉันพบใน SO - สำหรับฉัน
Erik

3
[L]ธงหมายความว่ากฎเป็นครั้งสุดท้ายในการประมวลผลในปัจจุบันนี้จะไม่หยุดเขียนเพราะพวกเขามีการเปลี่ยนเส้นทางภายในเพื่อให้คุณdirBนำไปใช้dirCในการประมวลผล htaccess ต่อไป เพียงอย่างเดียวRewriteRule ^(.*)$ index.php?query=$1จะเป็นการวนซ้ำแบบไม่สิ้นสุดของการเปลี่ยนเส้นทางภายใน (ในทางปฏิบัติจะถูกยกเลิกหลังจากทำซ้ำ 10 ครั้ง) -1เพราะคุณแนะนำว่า[L] ไม่ใช่ครั้งสุดท้าย ยังไม่ยุติกระบวนการเขียนใหม่ แต่สุดท้ายแล้ว
kbec

3
ฉันเชื่อว่าRewriteCond %{HTTPS} offเป็นวิธีที่ดีที่สุดในการตรวจสอบการเชื่อมต่อ HTTPS (ในตัวอย่างของคุณการบังคับให้การรับส่งข้อมูลที่ไม่ใช่ ssl ไปยัง HTTPS)
Madbreaks

22

หากคุณต้องการ "บล็อก" การเปลี่ยนเส้นทางภายใน / เขียนซ้ำไม่ให้เกิดขึ้นใน. htaccess ให้ดูที่

RewriteCond %{ENV:REDIRECT_STATUS} ^$

สภาพตามที่กล่าวถึงที่นี่


ขอบคุณนั่นเป็นเพียงการแก้ไขปัญหาของฉัน!
Matthew

ขอบคุณสำหรับฉันเช่นกันผู้ช่วยชีวิต!
Benjamin

นี่คือตัวช่วยชีวิต! ผู้คนควรตระหนักถึงสิ่งนั้นมากขึ้น อันที่จริงฉันจะแนะนำสิ่งนี้ให้กับทุกคำถามเกี่ยว.*กับ[L]ธงที่ฉันอ่านก่อนมาถึงที่นี่
Qwerty

ฉันได้เห็นการปรับเปลี่ยนหลายนี้200, !=200, ,^. ^$เห็นได้ชัดว่าตัวแปรได้รับการตั้งค่า200สำหรับการเปลี่ยนเส้นทาง แต่หน้าอื่น ๆ (ข้อผิดพลาดและสิ่งต่างๆ) ตั้งค่าเป็นค่าบางอย่าง ตอนนี้นั่นหมายความว่าคุณทั้งตรวจสอบว่าis empty, is not empty, is 200หรือis not 200ขึ้นอยู่กับสิ่งที่คุณต้องการ
Qwerty

18

ข้อตกลงกับ RewriteBase:

คุณแทบจะต้องตั้งค่า RewriteBase ถ้าคุณไม่ทำเช่นนั้น apache จะเดาว่าฐานของคุณคือพา ธ ฟิสิคัลดิสก์ไปยังไดเร็กทอรีของคุณ เริ่มต้นด้วยสิ่งนี้:

RewriteBase /

อา. นั่นเป็นเพียงการแก้ไขปัญหาที่ฉันพบ ขอบคุณสำหรับสิ่งนั้น!
Tom Savage

3
วิธีการพูดRewriteBase .หรือสิ่งที่บ่งบอกว่าควรคง URL ไว้เหมือนเดิมเพียงแค่เปลี่ยนสิ่งที่คุณระบุ?
Jay K

ขอบคุณนี่เป็นข้อมูลล้ำค่า :)
AturSams

2
คุณจะต้องตั้งค่าRewriteBaseหากคุณใช้การทดแทนพา ธ สัมพัทธ์ในRewriteRuleคำสั่ง หลีกเลี่ยงการใช้เส้นทางสัมพัทธ์จะดีกว่า
MrWhite

2
ฉันไม่เห็นด้วยกับคำตอบนี้ ในทีมRewriteBaseนักพัฒนาของเราเราหลีกเลี่ยงโดยสิ้นเชิงเนื่องจากนักพัฒนาเกือบทั้งหมดเข้าใจผิดว่ามันทำอะไร ดังที่ @ w3d กล่าวไว้คุณจะต้องใช้ก็ต่อเมื่อคุณต้องการบันทึกอักขระและต้องการใช้ฐานเดียวกันกับ RewriteRules ทั้งหมดของคุณในไฟล์เดียว รหัสของคุณจะชัดเจนสำหรับผู้อื่นหากคุณหลีกเลี่ยง
Simon East

13

ข้อผิดพลาดอื่น ๆ :

1- บางครั้งคุณควรปิดใช้งาน MultiView

Options -MultiViews

ฉันไม่ค่อยเข้าใจความสามารถของ MultiViews ทั้งหมด แต่ฉันรู้ว่ามันทำให้กฎ mod_rewrite ของฉันยุ่งเมื่อใช้งานอยู่เพราะคุณสมบัติอย่างหนึ่งของมันคือการลองและ 'เดา' ส่วนขยายของไฟล์ที่คิดว่าฉันกำลังมองหา .

ฉันจะอธิบาย: สมมติว่าคุณมีไฟล์ php 2 ไฟล์ในเว็บ dir ของคุณ file1.php และ file2.php และคุณเพิ่มเงื่อนไขและกฎเหล่านี้ใน. htaccess ของคุณ:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ file1.php/$1 

คุณถือว่า URL ทั้งหมดที่ไม่ตรงกับไฟล์หรือไดเร็กทอรีจะถูกดึงโดย file1.php เซอร์ไพร์ส! กฎข้อนี้ไม่ได้ถูกเกียรติสำหรับที่ url http: // MyHost / file2 / somepath แต่คุณถูกนำเข้าไปใน file2.php

สิ่งที่เกิดขึ้นคือ MultiView เดาได้โดยอัตโนมัติว่า url ที่คุณต้องการคือhttp: //myhost/file2.php/somepathและยินดีพาคุณไปที่นั่น

ตอนนี้คุณไม่รู้ว่าเกิดอะไรขึ้นและคุณอยู่ในจุดนั้นที่ตั้งคำถามกับทุกสิ่งที่คุณคิดว่าคุณรู้เกี่ยวกับ mod_rewrite จากนั้นคุณจะเริ่มเล่นกับกฎต่างๆเพื่อพยายามทำความเข้าใจตรรกะเบื้องหลังสถานการณ์ใหม่นี้ แต่ยิ่งคุณทดสอบมากเท่าไหร่ความรู้สึกก็ยิ่งน้อยลงเท่านั้น

ตกลงในระยะสั้นหากคุณต้องการให้ mod_rewrite ทำงานในลักษณะที่ใกล้เคียงกับตรรกะการปิด MultiView เป็นขั้นตอนในทิศทางที่ถูกต้อง

2- เปิดใช้งาน FollowSymlinks

Options +FollowSymLinks 

อันนั้นฉันไม่รู้รายละเอียดจริงๆ แต่ฉันเคยเห็นมันพูดถึงหลายครั้งก็ทำไปเถอะ


ขอบคุณ :) ฉันสังเกตเห็นความประหลาดใจที่ไม่คาดคิดเช่น / log / activity เปลี่ยนเป็น /log.txt/activity .. ขอบคุณสำหรับเคล็ดลับ :) .. คอมพิวเตอร์ที่แย่เกินไปไม่เคยทำให้เรื่องสนุก ๆ ไม่คาดคิดเกิดขึ้นเช่นการหลอกล่อเพื่อนร่วมงานหญิงของคุณบน facebook โดยไม่ได้ตั้งใจ :)
AturSams

1
+FollowSymLinksมีการระบุไว้ในเอกสารว่าจำเป็นmod_rewriteต้องทำงานทั้งหมดด้วยเหตุผลด้านความปลอดภัยที่คลุมเครือ
Joey

ข้อความสองข้อที่นี่ทำให้ฉันกังวลอย่างมาก: 'ฉันไม่ค่อยเข้าใจความสามารถของ MultiViews ทั้งหมด แต่ฉันรู้ว่ามันทำให้กฎ mod_rewrite ของฉันยุ่งเมื่อใช้งาน' และอันนี้ 'อันนั้นฉันไม่รู้รายละเอียดจริงๆของ แต่ฉันเคยเห็นมันพูดถึงหลายครั้งแล้วก็ทำไปเถอะ ' ฉันหวังว่าคนอย่างคุณจะไม่เขียนคำตอบใน SO เกี่ยวกับสิ่งที่คุณไม่แน่ใจ
TheCarver

1
@PaparazzoKid: ฉันคิดว่าคุณเข้าใจผิดว่า SO เป็นสารานุกรม เป็นชุมชนของผู้คนที่มารวมตัวกันเพื่อสร้างความเข้าใจในเทคโนโลยีที่พวกเขากำลังทำงานด้วย ซึ่งแตกต่างจาก AW White และ Joey ก่อนหน้าคุณความคิดเห็นของคุณแทบจะเป็นโมฆะ MV และ FSL เป็น 2 ในตัวเลือกมากมายของ Apache คำตอบของฉันเกี่ยวกับข้อผิดพลาดเมื่อทำงานกับ mod_rw โดยเฉพาะโมดูลแยกต่างหากซึ่งขัดแย้งกับตัวเลือกบางตัวและทำงานร่วมกับตัวอื่น ๆ ฉันอธิบายว่า MV มีผลต่อ mod_rw อย่างไรและกล่าวว่า + FSL เป็นคำแนะนำยอดนิยม โจอี้ยืนยันว่าเป็นข้อบังคับในความเป็นจริง คุณเอาอะไรมาที่โต๊ะ?
Michael Ekoka

ขอบคุณ ฉันใช้เวลาส่วนที่ดีที่สุดในหนึ่งชั่วโมงเพื่อให้ไซต์แบบเดิมทำงานได้และพยายามแก้ไขข้อบกพร่องของกฎการเขียนซ้ำเพียงเพื่อจะพบว่า MultiViews ได้ลบล้างทั้งหมด
Andrew McCombe

5

สมการสามารถทำได้ด้วยตัวอย่างต่อไปนี้:

RewriteCond %{REQUEST_URI} ^/(server0|server1).*$ [NC]
# %1 is the string that was found above
# %1<>%{HTTP_COOKIE} concatenates first macht with mod_rewrite variable -> "test0<>foo=bar;"
#RewriteCond search for a (.*) in the second part -> \1 is a reference to (.*)
# <> is used as an string separator/indicator, can be replaced by any other character
RewriteCond %1<>%{HTTP_COOKIE} !^(.*)<>.*stickysession=\1.*$ [NC]
RewriteRule ^(.*)$ https://notmatch.domain.com/ [R=301,L]

ไดนามิกโหลดบาลานซ์:

หากคุณใช้ mod_proxy เพื่อปรับสมดุลระบบของคุณคุณสามารถเพิ่มไดนามิกเรนจ์ของเซิร์ฟเวอร์ผู้ปฏิบัติงานได้

RewriteCond %{HTTP_COOKIE} ^.*stickysession=route\.server([0-9]{1,2}).*$ [NC]
RewriteRule (.*) https://worker%1.internal.com/$1 [P,L]

4

ความเข้าใจที่ดีขึ้นเกี่ยวกับแฟล็ก [L] เป็นไปตามลำดับ แฟล็ก [L] เป็นค่าสุดท้ายคุณเพียงแค่ต้องเข้าใจว่าอะไรจะทำให้คำขอของคุณถูกกำหนดเส้นทางผ่านเอ็นจินการแยกวิเคราะห์ URL อีกครั้ง จากเอกสาร ( http://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_l ) (เน้นของฉัน):

แฟล็ก [L] ทำให้ mod_rewrite หยุดประมวลผลชุดกฎ ในบริบทส่วนใหญ่หมายความว่าหากกฎตรงกันจะไม่มีการประมวลผลกฎเพิ่มเติม สิ่งนี้สอดคล้องกับคำสั่งสุดท้ายใน Perl หรือคำสั่ง break ใน C ใช้แฟล็กนี้เพื่อระบุว่าควรใช้กฎปัจจุบันทันทีโดยไม่ต้องพิจารณากฎเพิ่มเติม

หากคุณกำลังใช้ RewriteRule ในไฟล์. htaccess หรือใน<Directory>ส่วนต่างๆสิ่งสำคัญคือต้องเข้าใจวิธีการประมวลผลกฎ รูปแบบที่เรียบง่ายของสิ่งนี้คือเมื่อประมวลผลกฎแล้วคำขอที่เขียนซ้ำจะถูกส่งกลับไปยังเอ็นจินการแยกวิเคราะห์ URL เพื่อดำเนินการกับมัน เป็นไปได้ว่าเมื่อมีการจัดการคำขอที่เขียนใหม่ไฟล์หรือ<Directory> ส่วน.htaccessอาจพบอีกครั้งดังนั้นชุดกฎอาจถูกเรียกใช้อีกครั้งตั้งแต่เริ่มต้น โดยทั่วไปสิ่งนี้จะเกิดขึ้นหากกฎข้อใดข้อหนึ่งทำให้เกิดการเปลี่ยนเส้นทางไม่ว่าจะเป็นภายในหรือภายนอกทำให้กระบวนการร้องขอเริ่มต้นใหม่

ดังนั้นแฟล็ก [L] จะหยุดประมวลผลกฎการเขียนซ้ำเพิ่มเติมสำหรับการส่งผ่านชุดกฎ อย่างไรก็ตามหากกฎของคุณที่มีเครื่องหมาย [L] แก้ไขคำขอและคุณอยู่ในบริบท. htaccess หรือ<Directory>ส่วนนั้นคำขอที่แก้ไขของคุณจะถูกส่งกลับผ่านเครื่องมือแยกวิเคราะห์ URL อีกครั้ง และในการผ่านครั้งต่อไปอาจตรงกับกฎที่แตกต่างกันในครั้งนี้ หากคุณไม่เข้าใจสิ่งที่เกิดขึ้นดูเหมือนว่ากฎการเขียนซ้ำครั้งแรกของคุณด้วยแฟล็ก [L] จะไม่มีผล

วิธีที่ดีที่สุดคือใช้แฟล็ก [END] ( http://httpd.apache.org/docs/current/rewrite/flags.html#flag_end ) แทนแฟล็ก [L] หากคุณต้องการหยุดจริงๆ การประมวลผลกฎเพิ่มเติมทั้งหมด (และการแยกวิเคราะห์ในภายหลัง) อย่างไรก็ตามแฟล็ก [END] สามารถใช้ได้กับ Apache v2.3.9 + เท่านั้นดังนั้นหากคุณมี v2.2 หรือต่ำกว่าคุณจะติดอยู่กับแฟล็ก [L] เท่านั้น ในกรณีนี้คุณต้องพึ่งพาคำสั่ง RewriteCond เพื่อป้องกันการจับคู่ของกฎในการส่งผ่านของกลไกการแยกวิเคราะห์ URL ในภายหลัง หรือคุณต้องตรวจสอบให้แน่ใจว่า RewriteRule ของคุณอยู่ในบริบท (เช่น httpd.conf) ที่จะไม่ทำให้คำขอของคุณถูกแยกวิเคราะห์ซ้ำ


3

คุณสมบัติที่ยอดเยี่ยมอีกประการหนึ่งคือการเขียนซ้ำแผนที่ขยาย สิ่งเหล่านี้มีประโยชน์อย่างยิ่งหากคุณมีโฮสต์ / การเขียนซ้ำจำนวนมากเพื่อจัดการ:

เป็นเหมือนคีย์ - ค่า - ทดแทน:

RewriteMap examplemap txt:/path/to/file/map.txt

จากนั้นคุณสามารถใช้การแมปในกฎของคุณเช่น:

RewriteRule ^/ex/(.*) ${examplemap:$1}

สามารถดูข้อมูลเพิ่มเติมเกี่ยวกับหัวข้อนี้ได้ที่นี่:

http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#mapfunc


ละเว้นคุณสมบัตินี้หากคุณใช้.htaccess- เขียนซ้ำ มันใช้ไม่ได้ในบริบทนี้
TerryE

2
ต้องใช้คำสั่ง RewriteMap ในบริบทเซิร์ฟเวอร์ (httpd.conf) แต่เมื่อกำหนดที่นั่นแล้วคุณสามารถใช้แผนที่ผ่าน RewriteRule ในไฟล์. htaccess
JaredC

2

mod_rewrite สามารถแก้ไขลักษณะของการจัดการคำขอโดยไม่ต้องแก้ไข URL เช่นการตั้งค่าตัวแปรสภาพแวดล้อมการตั้งค่าคุกกี้เป็นต้นซึ่งมีประโยชน์อย่างเหลือเชื่อ

ตั้งค่าตัวแปรสภาพแวดล้อมตามเงื่อนไข:

RewriteCond %{HTTP_COOKIE} myCookie=(a|b) [NC]
RewriteRule .* - [E=MY_ENV_VAR:%b]

ตอบกลับ 503: RewriteRule's [R]ธงสามารถใช้ค่าที่ไม่ใช่ 3xx และกลับมีการตอบสนองที่ไม่เปลี่ยนเส้นทางเช่นสำหรับการจัดการการหยุดทำงาน / การบำรุงรักษา:

RewriteRule .* - [R=503,L]

จะส่งกลับการตอบสนอง 503 (ไม่ใช่การเปลี่ยนเส้นทางต่อ se)

นอกจากนี้ mod_rewrite ยังสามารถทำหน้าที่เหมือนอินเทอร์เฟซที่ขับเคลื่อนด้วยพลังพิเศษให้กับ mod_proxy ดังนั้นคุณสามารถทำสิ่งนี้แทนการเขียนProxyPassคำสั่ง:

RewriteRule ^/(.*)$ balancer://cluster%{REQUEST_URI} [P,QSA,L]

ความคิดเห็น: การใช้RewriteRules และRewriteConds เพื่อกำหนดเส้นทางคำขอไปยังแอปพลิเคชันหรือตัวจัดสรรภาระงานที่แตกต่างกันโดยพิจารณาจากแง่มุมที่เป็นไปได้ของคำขอนั้นมีประสิทธิภาพอย่างมาก การควบคุมคำขอระหว่างทางไปยังแบ็กเอนด์และความสามารถในการปรับเปลี่ยนการตอบกลับระหว่างทางกลับทำให้ mod_rewrite เป็นสถานที่ที่เหมาะสำหรับการรวมศูนย์การกำหนดค่าที่เกี่ยวข้องกับการกำหนดเส้นทางทั้งหมด

ใช้เวลาเรียนรู้ให้คุ้ม! :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.