ฉันมีคำสั่ง RewriteRule ใน Apache ที่ฉันต้องการนำไปใช้ก็ต่อเมื่อมีส่วนหัว HTTP ที่กำหนดเองอยู่
สิ่งที่ฉันได้ลอง:
<If "%{HTTP:X-MyCustomHeader} in { 'present' }">
RewriteRule ^/$ /present.html [NC,R=301,L]
</If>
<Else>
RewriteRule ^/$ /absent.html [NC,R=301,L]
</Else>
การดำเนินการนี้ใช้ไม่ได้เลย และจะไม่นำ RewriteRule ไปใช้
ทางเลือกอื่นที่ฉันได้ลอง:
<If "-n req_novary('X-MyCustomHeader')">
ใช้งานไม่ได้เช่นกัน
ฉันกำลังทดสอบด้วย curl like
curl - คือ http://example.com/ -H X-MyCustomHeader:ปัจจุบัน
เพื่อตรวจสอบว่าส่วนหัวมีอยู่และมองเห็นได้ ฉันลองใช้ตัวแปร env:
SetEnvIf X-MyCustomHeader ^(ปัจจุบัน)$ MY_CUSTOM_VAR=$1
ส่วนหัวตั้งค่า X-MyCustomHeader "### FOUND ###" เสมอ env=MY_CUSTOM_VAR
วิธีนี้ได้ผลตามที่คาดไว้ และฉันได้รับคำตอบว่า FOUND
แต่อีกครั้งเมื่อฉันพยายามใช้ตัวแปร env ในคำสั่ง IF มันจะไม่ถูกทริกเกอร์ เช่น
<If "-n env('MY_CUSTOM_VAR')">
ฉันจะทำสิ่งนี้กับ IF ได้อย่างไร และใช่ ฉันรู้ว่ามีเงื่อนไข RewriteCond เพื่อตรวจสอบตัวแปรสภาพแวดล้อม แต่ฉันจำเป็นต้องใช้คำสั่งอื่นๆ ด้วย ดังนั้นฉันจึงอยากจะสลับมันในบล็อก IF
ตามเอกสาร: https://httpd.apache.org/docs/trunk/en/expr.html#functions
เมื่อมีการค้นหาตัวแปรสภาพแวดล้อมภายในเงื่อนไข สิ่งสำคัญคือต้องพิจารณาว่าการประมวลผลคำขอเร็วเกินไปเพียงใดที่การแก้ปัญหานี้จะเกิดขึ้น ตามแนวทางแล้ว คำสั่งใดๆ ที่กำหนดไว้นอกบริบทของโฮสต์เสมือน (ไดเร็กทอรี, ตำแหน่ง, htaccess) ไม่น่าจะมีโอกาสที่จะดำเนินการได้ SetEnvIf ในขอบเขตโฮสต์เสมือนเป็นหนึ่งคำสั่งที่ทำงานก่อนการแก้ปัญหานี้
ตามเอกสาร ตัวแปร SetEnvIf ควรใช้งานได้ แต่ไม่ทำงาน?