Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Ruslan Yakushev
Saat Anda menggunakan modul Penulisan Ulang URL IIS dengan aplikasi ASP.NET, penting untuk memastikan perilaku aplikasi Web Anda yang benar dengan URL yang ditulis ulang. Artikel ini menjelaskan skenario di mana penulisan ulang URL dapat memengaruhi aplikasi web ASP.NET, dan solusi untuk potensi masalah.
Daftar Isi
- Mengatur URL Postback untuk Elemen Formulir
- Menulis ulang URL untuk Kontrol UpdatePanel AJAX
- Menggunakan Operator "~" di Kontrol Server Web
- Menulis ulang URL dan Kontrol Navigasi Situs
- Mencegah Penulisan Ulang Permintaan untuk sumber daya ASP.NET
Mengatur URL Postback untuk Elemen Formulir
ASP.NET Web Forms menggunakan postback secara ekstensif, dan ini membuatnya agak rumit untuk melakukan penulisan ulang URL untuk halaman ASP.NET. Jika halaman berisi satu atau beberapa kontrol server Web, saat ASP.NET merender halaman, halaman tersebut mengatur atribut tindakan elemen formulir HTML untuk mengarah kembali ke halaman tempat elemen formulir berada—yaitu, itu menunjuk ke dirinya sendiri. Jika penulisan ulang URL digunakan untuk halaman tersebut, atribut tindakan menunjuk ke URL yang ditulis ulang, bukan ke URL yang diminta dari browser. Hal ini menyebabkan browser menampilkan URL yang ditulis ulang di kotak alamat setiap kali terjadi postback.
Untuk mencegah atribut tindakan menunjuk ke URL yang salah, Anda dapat mengatur properti Tindakan instans HtmlForm di halaman ke URL postback yang diminta oleh browser. Anda dapat memperoleh URL tersebut dari dengan menggunakan properti HttpRequest.RawUrl. Contoh berikut menunjukkan cara mengubah halaman ASP.NET untuk mengatur URL tindakan.
protected void Page_Load(object sender, EventArgs e)
{
form1.Action = Request.RawUrl;
}
Catatan
Properti HtmlForm.Action tersedia dimulai dengan .NET Framework versi 3.5 SP1.
Jika Anda menggunakan halaman master ASP.NET, Anda bisa menambahkan kode ke metode Page_Load halaman master untuk mengatur URL tindakan postback untuk semua halaman yang menggunakan halaman master tersebut.
Menulis ulang URL untuk Kontrol UpdatePanel AJAX
Saat Anda menggunakan modul Penulisan Ulang URL untuk menulis ulang URL untuk halaman yang berisi satu atau beberapa kontrol UpdatePanel, kontrol akan menggunakan URL yang ditulis ulang untuk semua tindakan yang dilakukan oleh kontrol UpdatePanel tersebut. Hal ini dapat menyebabkan kontrol dalam kontrol UpdatePanel tidak berfungsi dengan benar, terutama dalam kasus ketika URL menulis ulang mengubah hierarki direktori URL yang diminta. Misalnya, jika Anda menggunakan modul Penulisan Ulang URL untuk menulis ulang /Products/Hardware ke /Products.aspx, kontrol UpdatePanel akan menggunakan URL /Products/Hardware/Products.aspx untuk semua tindakan dalam kontrol UpdatePanel. Ini mengakibatkan kesalahan skrip.
Untuk mencegah hal ini terjadi, atur properti Tindakan dari instans HtmlForm halaman seperti yang dijelaskan dalam Mengatur URL Postback untuk Elemen Formulir di bagian sebelumnya.
Menggunakan Operator ~ di Kontrol Server Web
Anda dapat menggunakan operator ~ di ASP.NET Kontrol server web untuk mereferensikan akar direktori aplikasi saat Anda perlu mengatur jalur. Namun, jika penulisan ulang URL mengubah hierarki direktori URL yang diminta, ini dapat menyebabkan tautan yang ditentukan dengan operator ~ diselesaikan dengan tidak benar. Misalnya, bayangkan bahwa halaman Default.aspx di akar aplikasi Web bernama app1 berisi kontrol Gambar berikut:
<asp:Image runat="server" ImageUrl="~/Images/MyImage.gif" />
Jika penulisan ulang URL mengubah URL dari http://localhost/app1/folder/file ke http://localhost/app1/default.aspx, tautan yang ditentukan dengan operator ~ akan diselesaikan relatif terhadap jalur URL yang ditulis ulang, yang akan relatif terhadap folder /app1. Contoh berikut menunjukkan markup HTML yang dihasilkan untuk elemen img:
<img src="Images/MyImage.gif" ... >
Karena browser meminta http://localhost/app1/folder/file, browser akan mencoba untuk mendapatkan gambar dari http://localhost/app1/folder/Images/MyImage.gif. Ini menghasilkan kesalahan 404 (File Tidak Ditemukan).
Modul Penulisan Ulang URL untuk IIS menyertakan pembaruan untuk ASP.NET yang memperbaiki perilaku ini. Pembaruan menyebabkan operator ~ di kontrol server Web diselesaikan relatif terhadap URL yang awalnya diminta. Dalam contoh sebelumnya, markup HTML dalam respons akan berisi jalur URL yang benar untuk elemen img, seperti yang ditunjukkan dalam markup berikut:
<img src="../Images/MyImage.gif" ... >
Pembaruan untuk ASP.NET hanya berlaku untuk .NET Framework 3.5 SP1 dan yang lebih baru. Untuk mendapatkan pembaruan, tingkatkan .NET Framework ke versi 3.5 SP1 lalu jalankan penginstal modul Penulisan Ulang URL IIS, yang akan menginstal pembaruan ASP.NET.
Menulis ulang URL dan Kontrol Navigasi Situs
Peta situs ASP.NET dapat digunakan untuk menjelaskan struktur situs Web sehingga API navigasi situs dan kontrol navigasi situs dapat mengekspos struktur situs logis (bukan fisik). Saat Anda menggunakan modul Penulisan Ulang URL dengan aplikasi ASP.NET yang menggunakan navigasi situs, Anda biasanya ingin kontrol navigasi beroperasi dalam hal struktur situs logis yang menggunakan URL publik atau virtual.
Misalnya, Anda dapat menentukan peta situs seperti yang ditunjukkan dalam contoh berikut:
<?xml version="1.0" encoding="utf-8" ?>
<siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0">
<siteMapNode url="~/Products/" title="Products" description="Products Home Page">
<siteMapNode url="~/Products/Hardware/" title="Hardware" description="Hardware Products" />
<siteMapNode url="~/Products/Software/" title="Software" description="Software Products" />
</siteMapNode>
</siteMap>
Anda kemudian dapat menentukan aturan penulisan ulang yang melakukan penulisan ulang berikut:
- /Products/ to /Products.aspx
- /Products/Hardware to /Products.aspx?category=Hardware
- /Products/Software to /Products.aspx?category=Software
Menentukan peta situs dengan menggunakan URL virtual ini dapat menyebabkan kelas SystemWeb.SiteMap tidak berfungsi dengan benar. Ketika Anda mencoba mengakses properti SiteMap.CurrentNode di halaman ASP.NET, properti mungkin berisi null. Ini dapat menyebabkan kontrol navigasi situs seperti SiteMapPath dan Menu berfungsi dengan tidak benar.
Modul Penulisan Ulang URL untuk IIS menyertakan pembaruan untuk ASP.NET yang memperbaiki kontrol navigasi sehingga dapat bekerja dengan URL virtual yang ditulis ulang. Dengan pembaruan ini, properti SiteMap.CurrentNode akan merujuk ke SiteMapNode yang sesuai dengan URL virtual yang saat ini diminta.
Pembaruan untuk ASP.NET hanya berlaku untuk .NET Framework 3.5 SP1 dan yang lebih baru. Untuk mendapatkan pembaruan, tingkatkan .NET Framework ke versi 3.5 SP1 lalu jalankan penginstal modul Penulisan Ulang URL IIS, yang akan menginstal pembaruan ASP.NET.
Mencegah Penulisan Ulang Permintaan untuk Sumber Daya Web ASP.NET
aplikasi web berbasis ASP.NET sangat sering membuat permintaan ke file WebResources.axd untuk mengambil sumber daya perakitan dan melayaninya ke browser Web. Tidak ada file tersebut di server karena ASP.NET menghasilkan konten secara dinamis ketika WebResources.axd diminta. Jadi, jika Anda memiliki aturan penulisan ulang URL yang menulis ulang atau mengalihkan hanya jika URL yang diminta tidak sesuai dengan file atau folder pada sistem file server web, aturan tersebut mungkin secara tidak sengaja menulis ulang permintaan yang dibuat ke WebResources.axd dan dengan demikian merusak aplikasi Anda.
Masalah ini dapat dengan mudah dicegah jika Anda menambahkan satu kondisi tambahan ke aturan penulisan ulang:
<rule name="RewriteUserFriendlyURL1" stopProcessing="true">
<match url="^([^/]+)/?$" />
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
<!-- The following condition prevents rule from rewriting requests to .axd files -->
<add input="{URL}" negate="true" pattern="\.axd$" />
</conditions>
<action type="Rewrite" url="article.aspx?p={R:1}" />
</rule>