IIS URLrewrite: จะรักษาชื่อโฮสต์ดั้งเดิมสำหรับการเปลี่ยนเส้นทางภายในได้อย่างไร

ฉันมีเว็บแอปพลิเคชันที่ทำงานบนเซิร์ฟเวอร์เครื่องหนึ่ง และใช้ IIS กับ rewriteURL บนเซิร์ฟเวอร์อื่นเป็นพร็อกซีย้อนกลับ

ฉันกำหนดค่ากฎขาเข้าเพื่อเขียนที่อยู่พร็อกซีย้อนกลับด้วยที่อยู่ของเว็บแอปพลิเคชันเซิร์ฟเวอร์ มันใช้งานได้ดี

อย่างไรก็ตาม แอปพลิเคชันอนุญาตให้ผู้ใช้ดาวน์โหลดเนื้อหาบางส่วนและเปลี่ยนเส้นทางไปยังที่อยู่ดาวน์โหลด ขณะนี้ ผู้ใช้จะถูกส่งต่อไปยังที่อยู่ IP ในเครื่องของเว็บแอปพลิเคชันเซิร์ฟเวอร์ ไม่ใช่ที่อยู่สาธารณะของพร็อกซีย้อนกลับ

ฉันเข้าใจ ฉันต้องแก้ไขกฎขาออกด้วยเพื่อให้เข้าใจสิ่งนี้ แต่ก็ไม่เข้าใจวิธีใดวิธีหนึ่ง

ฉันทำตามคำแนะนำที่นี่ https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/modifying-http-response-headers

และกฎการเขียนซ้ำปัจจุบันของฉันมีลักษณะเช่นนี้

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="er-platform" stopProcessing="true">
                    <match url="^er-platform(.*)" />
                    <conditions>
                        <add input="{CACHE_URL}" pattern="^(https?)://" />
                    </conditions>
                    <action type="Rewrite" url="{C:1}://192.168.80.6:8443/{R:0}" />
                    <serverVariables>
                        <set name="ORIGINAL_HOST" value="{HTTP_HOST}" />
                    </serverVariables>
                </rule>
            </rules>
            <outboundRules>
                <rule name="er-platform" preCondition="IsRedirection" enabled="true">
                    <match serverVariable="RESPONSE_LOCATION" pattern="^(https?)://[^/]+/(.*)" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{ORIGINAL_HOST}" pattern=".+" />
                    </conditions>
                    <action type="Rewrite" value="{R:1}://{ORIGINAL_HOST}/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="IsRedirection">
                        <add input="{RESPONSE_STATUS}" pattern="3\d\d" />
                    </preCondition>
                </preConditions>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

ฉันยังคงถูกเปลี่ยนเส้นทางไปยัง IP ในเครื่องเมื่อพยายามดาวน์โหลดบางอย่าง ฉันจะต้องเปลี่ยนกฎเพื่อให้ถูกต้องได้อย่างไร

ขอบคุณ,

โทมัส


person Thomas    schedule 29.09.2017    source แหล่งที่มา


คำตอบ (1)


ฉันไม่คิดว่ากฎขาออกของคุณไม่ถูกต้อง ฉันเดาได้สองสามว่าทำไมมันถึงล้มเหลว

ขั้นแรก: กฎขาเข้าของคุณ ต้อง ตรงกัน กฎขาออกจึงจะทำงาน เนื่องจาก ORIGINAL_HOST ถูกจับเมื่อกฎขาเข้าดำเนินการ ขณะนี้ กฎขาเข้าของคุณตรงกับ URL กับ ^er-platform(.*) ฉันจะถือว่าเนื่องจากนี่คือ Reverse Proxy ว่ามันใช้งานได้เพราะคุณจะไม่สามารถเริ่มการดาวน์โหลดได้หากไม่ได้เป็นเช่นนั้น

ประการที่สอง: กฎเอาต์พุตจะทริกเกอร์เฉพาะกับโค้ด 3xx เท่านั้น นี่ไม่ใช่วิธีเดียวในการเปลี่ยนเส้นทาง เป็นไปได้ว่าคุณกำลังเปลี่ยนเส้นทางโดยใช้ JavaScript เช่น. `window.location = 'http://wrongaddress'. ในกรณีนี้ กฎขาออกของคุณจะไม่ทำงาน

ขั้นตอนถัดไปสำหรับการแก้ไขข้อบกพร่องนี้: เปิดการบันทึกสำหรับกฎขาเข้า ช่องทำเครื่องหมาย URL ที่เขียนใหม่ของบันทึกของตัวจัดการ IIS บันทึกของคุณจะถูกเขียนไปที่ %SystemDrive%\inetpub\logs\LogFiles\ ตรวจสอบว่ากฎขาเข้ากำลังถูกโจมตี

ตรวจสอบสิ่งที่เกิดขึ้นบนสาย: Fiddler เป็นเครื่องมือที่ดีเยี่ยมในการทำความเข้าใจว่ามีอะไรเกิดขึ้นบ้าง เกิดขึ้นจริงบนเส้นลวด ใช้สิ่งนี้เพื่อยืนยันว่ากฎการเขียน URL ใหม่ควรจะกดปุ่ม เช่น. URL คำขอตรงกับ ^er-platform(.*) และรหัสตอบกลับอยู่ใน 300

หรืออีกทางหนึ่งสำหรับ Fiddler คุณสามารถใช้แท็บเครือข่ายเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome ได้ เปิดช่องทำเครื่องหมาย 'เก็บบันทึก' เพื่อไม่ให้ล้างข้อมูลหลังจากที่คุณถูกเปลี่ยนเส้นทาง ตรวจสอบสิ่งที่คุณคิดว่าควรจะเกิดขึ้นกำลังเกิดขึ้นจริง

person Sam Rueby    schedule 01.10.2017
comment
ขอบคุณสำหรับคำแนะนำ! ฉันติดตามเครือข่ายและพบพฤติกรรมแปลกๆ เมื่อฉันทริกเกอร์การดาวน์โหลด แอปจะอ้างอิงฉันไปยังไฟล์ดาวน์โหลด แต่สิ่งที่ฉันได้รับคือ 401 ไม่ได้รับอนุญาตจากเซิร์ฟเวอร์ภายในเครื่อง เซสชันปัจจุบันของฉันไม่ถูกต้องสำหรับโฮสต์นั้น หากฉันสร้างเซสชันที่สองในเบราว์เซอร์โดยใช้ IP ในเครื่อง ฉันสามารถดาวน์โหลดไฟล์ได้ ในสถานการณ์สมมตินั้น IP ภายในเครื่องจะไม่แสดงในแท็บเครือข่าย การดาวน์โหลดมาจากโฮสต์พร็อกซีย้อนกลับ ดูเหมือนว่าเซสชันจะมีการจัดการไม่ถูกต้อง นี่เป็นสิ่งที่ฉันสามารถควบคุมด้วย IIS ได้หรือไม่ - person Thomas; 02.10.2017
comment
เซิร์ฟเวอร์ตั้งค่าคุกกี้หรือไม่? บางทีอาจเป็นเพราะโดเมนหรือเส้นทางที่ไม่ถูกต้องแทนที่จะเป็นภายนอก - person Sam Rueby; 02.10.2017
comment
ใช่ มีคุกกี้สำหรับเซสชันนี้ ฉันใช้โดเมนภายนอกและเส้นทางที่ถูกต้อง - person Thomas; 02.10.2017
comment
ตรวจสอบคุกกี้เดียวกันและค่าต่างๆ ที่ได้รับ/ส่งทั้งในสถานการณ์การทำงานและไม่ทำงาน - person Sam Rueby; 02.10.2017
comment
สำหรับสถานการณ์ที่ไม่ทำงาน ฉันมีคุกกี้หนึ่งรายการ (โดยที่โฮสต์ตั้งค่าเป็นโดเมนภายนอก) สำหรับสถานการณ์การทำงาน ฉันมีคุกกี้สองตัว หนึ่งในโดเมนภายนอก หนึ่งรายการสำหรับ IP ภายใน คุกกี้ทั้งสองถูกสร้างขึ้นในการแตะเบราว์เซอร์แยกกัน แต่แชร์ (หนึ่งรายการต่อการแตะ) แต่แชร์สำหรับเซสชันเบราว์เซอร์ - person Thomas; 02.10.2017
comment
ฉันคิดว่าปัญหาอยู่ที่คุกกี้ รหัสเซสชันไม่ได้ถูกกำหนดไว้ด้านหลังพร็อกซีย้อนกลับอย่างถูกต้อง ฉันจัดรูปแบบคำถามใหม่ที่นี่ stackoverflow.com/questions/46534125/ . ขอบคุณสำหรับการตอบกลับของคุณ มันช่วยฉันได้มากในการจำกัดปัญหาให้แคบลง! - person Thomas; 03.10.2017
comment
ฉันก็สงสัยเช่นกัน ดีใจที่ฉันสามารถชี้ให้คุณไปในทิศทางที่ถูกต้อง - person Sam Rueby; 03.10.2017