ฉันกำลังพยายามกำหนดค่าโครงสร้างไดเร็กทอรีในเว็บไซต์ IIS โดยใช้กฎการเขียนซ้ำในระดับต่างๆ ตัวอย่างเช่น พิจารณาโครงสร้างต่อไปนี้:
เว็บไซต์เริ่มต้น
ââ web.config
ââ v1
ââ web.config
ââ wwwรูท
ââ สวัสดี.txt
ฉันต้องการที่จะสามารถเข้าถึงได้ สวัสดี. txt
ผ่าน http://localhost/hello.txt ฉันได้กำหนดค่า เว็บ.config
ที่ระดับรูทของเว็บไซต์ดังนี้:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to v1" stopProcessing="false">
<match url="^(?!v1).*" />
<action type="Rewrite" url="v1\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
และฉันได้กำหนดค่า เว็บ.config
ใน v1
ไดเรกทอรีเช่นนี้:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite to wwwroot" stopProcessing="false">
<match url="^(?!wwwroot).*" />
<action type="Rewrite" url="wwwroot\{R:0}" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
การเขียนซ้ำระดับเดียวใช้งานได้เมื่อฉันเข้าถึง http://localhost/v1/hello.txt แต่การเขียนซ้ำสองระดับใช้ไม่ได้กับ http://localhost/hello.txt หน้าข้อผิดพลาด IIS แสดงให้เห็นว่าคำขอยังคงแก้ไขไปยังเส้นทางทางกายภาพ â¦\v1\hello.txt
ค่อนข้างมากกว่า â¦\v1\wwwroot\hello.txt
; ดู https://i.stack.imgur.com/KjdH5.png. โปรดทราบว่าการเปลี่ยนการเขียนใหม่เป็นการเปลี่ยนเส้นทางทำให้สามารถให้บริการไฟล์ได้สำเร็จ
มีวิธีการทำงานนี้หรือไม่ หรือเป็นข้อจำกัดบางประการของ URL Rewrite Module Microsoft ดูเหมือนจะอ้างว่าสิ่งนี้ได้รับการสนับสนุนใน การอ้างอิงการกำหนดค่าโมดูลเขียนซ้ำ URL:
การสืบทอดกฎ
หากมีการกำหนดกฎในการกำหนดค่าหลายระดับ โมดูลการเขียนซ้ำ URL จะประเมินกฎตามลำดับต่อไปนี้:
- ประเมินกฎสากลทั้งหมด
- ประเมินชุดกฎที่มีกฎแบบกระจายจากระดับการกำหนดค่าพาเรนต์ รวมทั้งกฎจากระดับการกำหนดค่าปัจจุบัน การประเมินจะดำเนินการตามลำดับจากแม่สู่ลูก ซึ่งหมายความว่ากฎแม่จะได้รับการประเมินก่อน และกฎที่กำหนดไว้ในระดับลูกสุดท้ายจะได้รับการประเมินครั้งสุดท้าย
ฉันรู้ว่าฉันสามารถสร้าง เว็บ.config
ที่ระดับรูทของเว็บไซต์ให้อ้างอิงถึงส่วนใน wwwroot
ไดเรกทอรีโดยตรง (ผ่าน url="v1\wwwroot\{R:0}"
). อย่างไรก็ตาม ฉันไม่ต้องการทำเช่นนี้ ในที่สุดฉันจะขยายออกไปด้านนอก เว็บ.config
เพื่อรองรับเวอร์ชันอื่นๆ (v2
, v3
, â¦) ซึ่งอาจมีหรือไม่มี a wwwroot
ไดเร็กทอรีย่อย ดังนั้น การรักษาการเขียนใหม่เฉพาะเวอร์ชันใด ๆ ไปยังไดเร็กทอรีย่อยภายในในไดเร็กทอรีเฉพาะเวอร์ชันจะสะอาดกว่ามาก เว็บ.config
.
ฉันได้ลองใช้การติดตามคำขอที่ล้มเหลว กฎภายนอก, เขียนใหม่เป็น v1
, ถูกบันทึกเพื่อให้ทำงานได้สำเร็จ ไม่มีการกล่าวถึงกฎภายใน เขียนใหม่เป็น wwwroot
.