IIS Menulis ulang, menulis ulang peta dan string kueri

10

Tolong bantu saya memahami penulisan ulang peta, saya memiliki pengaturan ini:

<rewriteMap name="MyMap">
   <add key="/pages" value="/website/pages/index.aspx" />
   <add key="/pages/page-1" value="/website/pages/page-1/index.aspx" />
   <add key="/pages/page-1/section-1" value="/website/pages/page-1/section-1.aspx" />
</rewriteMap>

Ini aturan saya:

<rule name="Rewrite rule for MyMap" stopProcessing="true">
   <match url=".*" />
   <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
      <add input="{MyMap:{REQUEST_URI}}" pattern="(.+)" />
   </conditions>
   <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>

Ini berfungsi jika saya mencoba mengakses halaman-halaman ini:

  • www.mydomain.com/pages (OK)
  • www.mydomain.com/pages/page-1 (OK)
  • www.mydomain.com/pages/page-1/section-1 (OK)

Tapi saya ingin kemungkinan untuk menambahkan string kueri di salah satu halaman ini, contoh:

  • www.mydomain.com/pages?page=1 (GAGAL)

Ketika saya mencoba mengakses halaman ini, saya mendapatkan 404. Bagaimana saya bisa membuatnya bekerja?

Martin
sumber

Jawaban:

12

Secara default, aturan penulisan ulang URL menggunakan penulisan ulang peta dibuat sesuai dengan variabel {REQUEST_URI} . Ini termasuk URL + string kueri. Ini memungkinkan Anda untuk mencocokkan URL dengan parameter string kueri dan menulis ulang ke halaman lain. Sangat berguna tetapi ini tampaknya bukan yang Anda inginkan / butuhkan.

Anda hanya ingin mencocokkan dengan URL, tanpa string kueri. Untuk mengubah ini, Anda harus mengganti {REQUEST_URI} dalam kondisi menjadi {URL} . Maka hanya URL (tanpa string kueri) yang akan dicocokkan dengan peta penulisan ulang. Anda kemudian dapat menambahkan string kueri ke URL yang ditulis ulang sehingga skrip yang dieksekusi masih memiliki akses ke sana.

Anda berakhir dengan aturan seperti:

<rule name="Rewrite rule for MyMap">
    <match url=".*" />
    <conditions>
        <add input="{MyMap:{URL}}" pattern="(.+)" />
    </conditions>
    <action type="Rewrite" url="{C:1}" appendQueryString="true" />
</rule>
Marco Miltenburg
sumber
1
Penjelasan yang bagus. Saya sudah bertanya-tanya bagaimana cara mengabaikan QueryString untuk tujuan pertandingan juga.
dthrasher