Penulisan ulang URL IIS: Bagaimana cara mempertahankan nama host asli untuk pengalihan internal?

Saya memiliki aplikasi web yang berjalan di satu server dan menggunakan IIS dengan rewriteURL di server lain sebagai proxy terbalik.

Saya mengonfigurasi aturan masuk untuk menulis ulang alamat proxy terbalik dengan alamat server aplikasi web. Ini berfungsi dengan baik.

Namun, aplikasi ini memungkinkan pengguna mengunduh beberapa konten dan mengarahkan mereka ke alamat unduhan. Saat ini, pengguna diteruskan ke alamat IP lokal server aplikasi web, bukan alamat publik dari proxy terbalik.

Saya mengerti, saya perlu mengedit aturan keluar juga untuk memahaminya, tapi entah bagaimana saya tidak melakukannya dengan benar.

Saya mengikuti instruksi di sini https://docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/modifying-http-response-headers

dan aturan penulisan ulang saya saat ini terlihat seperti ini

<?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>

Saya masih dialihkan ke IP lokal ketika mencoba mengunduh sesuatu. Bagaimana saya perlu mengubah aturan agar hal ini benar?

Terima kasih,

Tomas


person Thomas    schedule 29.09.2017    source sumber


Jawaban (1)


Menurut saya, aturan keluar Anda tidak salah. Saya punya beberapa tebakan mengapa ini gagal.

Pertama: Aturan masuk Anda harus cocok agar aturan keluar Anda dapat berfungsi. Hal ini karena ORIGINAL_HOST ditangkap ketika aturan masuk dijalankan. Saat ini, aturan masuk Anda mencocokkan URL dengan ^er-platform(.*). Saya akan berasumsi bahwa karena ini adalah proksi terbalik, proksi ini berfungsi karena Anda tidak akan dapat memulai pengunduhan jika tidak.

Kedua: Aturan keluaran hanya terpicu pada kode 3xx. Ini bukan satu-satunya cara untuk mengalihkannya. Mungkin saja Anda mengalihkan menggunakan JavaScript. Misalnya. `window.location = 'http://wrongaddress'. Dalam hal ini, aturan keluar Anda tidak akan berfungsi.

Langkah berikutnya untuk melakukan debug ini: Aktifkan Logging untuk aturan masuk. Kotak centang URL yang ditulis ulang Log Manajer IIS Log Anda akan ditulis ke %SystemDrive%\inetpub\logs\LogFiles\. Verifikasikan aturan masuk telah diterapkan.

Verifikasi apa yang terjadi di jaringan: Fiddler adalah alat hebat untuk memahami apa yang terjadi sebenarnya terjadi di kabel. Gunakan ini untuk mengonfirmasi bahwa aturan penulisan ulang URL harus diterapkan. Yaitu. bahwa URL permintaan cocok dengan ^er-platform(.*) dan kode responsnya adalah 300an.

Sebagai alternatif untuk Fiddler, Anda bisa menggunakan tab Jaringan Alat Pengembang Chrome. Aktifkan kotak centang 'Pertahankan log' agar tidak hilang setelah Anda dialihkan. Verifikasikan apa yang menurut Anda seharusnya terjadi, benar-benar terjadi.

person Sam Rueby    schedule 01.10.2017
comment
Terima kasih atas petunjuknya! Saya melacak jaringan dan menemukan beberapa perilaku aneh. Setelah saya memicu pengunduhan, aplikasi mengarahkan saya ke file unduhan. Namun yang saya dapatkan adalah 401 tidak diotorisasi dari server lokal. Sesi saya saat ini tidak valid untuk host tersebut. Jika saya membuat sesi kedua di browser saya menggunakan IP lokal, saya dapat mengunduh file tersebut. Dalam skenario tersebut, IP lokal tidak pernah muncul di tab jaringan. Unduhan berasal dari host proxy terbalik. Sepertinya sesi ini tidak ditangani dengan benar. Apakah ini sesuatu yang dapat saya kendalikan dengan IIS? - person Thomas; 02.10.2017
comment
Apakah server menyetel cookie? Mungkin untuk domain atau jalur yang salah, bukan eksternal? - person Sam Rueby; 02.10.2017
comment
ya, ada cookie untuk sesi ini. Saya menggunakan domain eksternal dan jalur yang benar. - person Thomas; 02.10.2017
comment
Verifikasi cookie yang sama dan nilainya diterima/dikirim dalam skenario berfungsi dan tidak berfungsi. - person Sam Rueby; 02.10.2017
comment
Untuk skenario tidak berfungsi saya memiliki satu cookie (dengan host disetel ke domain eksternal), untuk skenario berfungsi saya memiliki dua cookie, satu dari domain eksternal, satu untuk IP internal. Kedua cookie dibuat dalam ketukan browser terpisah namun dibagikan (satu per ketukan) tetapi dibagikan untuk sesi browser. - person Thomas; 02.10.2017
comment
Saya pikir masalahnya ada pada cookie. ID sesi tidak disimpan dengan benar di belakang proksi terbalik. Saya merumuskan ulang pertanyaan saya di sini stackoverflow.com/questions/46534125/ . Terima kasih atas tanggapan Anda. Ini sangat membantu saya untuk mempersempit masalah! - person Thomas; 03.10.2017
comment
Saya juga curiga akan hal itu. Senang saya bisa mengarahkan Anda ke arah yang benar. - person Sam Rueby; 03.10.2017