Cara Menggunakan Kesalahan Terperinci HTTP di IIS 7.0

oleh Tim IIS

Pengantar

Setiap Administrator Web-Site atau Pengembang Web telah melihat pesan "404 - File tidak ditemukan", "401 - Tidak Sah" atau "500 - Kesalahan Server" di browsernya. Artikel ini membantu Anda memahami bagaimana dan mengapa IIS menghasilkan kesalahan ini dan bagaimana mereka dapat dikonfigurasi.

Banyak yang mungkin berpikir bahwa menghasilkan pesan kesalahan tampaknya tidak membenarkan artikel lengkap. Tapi ada lebih banyak kesalahan daripada memenuhi mata. Pesan kesalahan adalah topik sensitif, karena setiap kesalahan mengungkapkan lebih banyak tentang situs web Anda daripada yang mungkin ingin Anda ungkapkan. Semakin banyak informasi yang dapat dikumpulkan seseorang tentang situs Anda, kemungkinan Anda akan diretas. Pencarian untuk "peretasan google" atau "pembuatan skrip lintas situs" mengungkapkan banyak informasi tentang topik ini.

Namun, pesan kesalahan juga merupakan alat yang berharga untuk memecahkan masalah. Pengembang dan Administrator Web-Site memerlukan detail sebanyak mungkin ketika terjadi kesalahan. Idealnya pesan kesalahan memberikan rekomendasi tentang cara memperbaiki masalah. Berikut adalah bagaimana IIS mengatasi tujuan yang pada dasarnya berlawanan ini.

Kesalahan, Kesalahan Apa?

Artikel ini berbicara tentang kesalahan HTTP seperti yang ditentukan dalam HTTP RFC (RFC 2616 - bagian 6.1.1). Kesalahan HTTP selalu dinyatakan dengan mengirim respons dengan kode status yang lebih besar dari 400 kembali ke klien yang meminta.

Kesalahan Klien

Kode status antara 400 dan 500 menentukan kesalahan yang dibuat klien, misalnya sintaks buruk atau permintaan ke sumber daya yang tidak ada. Anda dapat mencoba ini dengan meminta URL palsu dari situs web pilihan Anda, misalnya: http://< IIS7Server>/this_resource_does_not_exist. Anda mendapatkan kesalahan "404 - File tidak ditemukan".

Kesalahan Server

Kode status yang dimulai dengan 500 adalah kesalahan yang disebabkan oleh server. Penyebab paling umum untuk 500 kesalahan pada sistem IIS adalah:

  • Halaman ASP atau ASPX yang berisi kesalahan sintaks
  • Konfigurasi server web atau konfigurasi aplikasi tidak dapat dibaca atau tidak valid
  • Situs dihentikan

Penting untuk dicatat bahwa browser seperti IE sering mengganti kesalahan yang dikembalikan dari server web dengan kesalahan mereka sendiri. Ini membuat pemecahan masalah lebih sulit. Di IE Anda dapat menonaktifkan fitur ini. Buka menu "Alat", pilih "Opsi Internet", klik tab "Tingkat Lanjut" dan temukan kotak centang "Tampilkan pesan kesalahan HTTP yang ramah" dan hapus centang. Untuk melihat respons mentah, gunakan alat HTTP seperti WFETCH di Resource Kit IIS 6.0 (lihat "Tautan Terkait").

Kesalahan HTTP di IIS

Ada dua hal yang dapat terjadi ketika modul httpError (custerr.dll) mengalami kesalahan:

  • Kesalahan kustom dihasilkan
  • Kesalahan terperinci dihasilkan

Kesalahan kustom adalah halaman kesalahan yang dilihat pengguna reguler situs web Anda. Mereka berisi deskripsi kesalahan singkat tentang mengapa kesalahan terjadi, tetapi tidak ada yang lain. Berikut adalah kesalahan kustom yang dihasilkan saat Anda meminta sumber daya yang tidak ada, misalnya: http://< IIS7Server>/this_resource_does_not_exist

Cuplikan layar file atau direktori H T T P Error 404 tidak ditemukan di Internet Explorer.

Kesalahan terperinci ditujukan untuk administrator dan pengembang lokal. Mereka seharusnya memberikan informasi yang membantu segera memperbaiki masalah. Berikut adalah contoh permintaan yang sama, tetapi sekarang mengembalikan Kesalahan Terperinci:

Cuplikan layar Kesalahan Server di halaman web Aplikasi Situs Web Default, memperlihatkan bagian Penyebab dan Solusi untuk kesalahan tersebut.

Ini berbahaya, karena Kesalahan Terperinci berisi informasi tentang cara kerja dalam situs web Anda. Hanya personel tepercaya yang akan melihat Kesalahan Terperinci. Satu-satunya cara untuk memastikan hal ini adalah hanya menghasilkan kesalahan terperinci jika permintaan berasal dari komputer lokal. Segera setelah permintaan tidak lokal, kesalahan kustom dihasilkan. Lihat diagram alur berikut:

Diagram Substatus Status, Isi Entitas, dan Atur jalur Kesalahan untuk membuat kesalahan terperinci.

Aliran data

Pertama: Pemeriksaan kesalahan

Modul httpError menerima pemberitahuan jika respons akan dikirim (pemberitahuan RQ_SEND_RESPONSE). Modul httpError memeriksa kode status respons ini dan segera kembali jika kode status tidak lebih besar dari 400.

Kedua: Kesalahan Kustom atau Kesalahan Terperinci

Pemeriksaan berikutnya ditentukan oleh asal permintaan (adalah permintaan permintaan lokal atau jarak jauh) dan pengaturan properti errorMode. Properti errorMode diatur ke DetailedLocalOnly, yang berarti bahwa Kesalahan Kustom dihasilkan untuk setiap permintaan jarak jauh. Jika errorMode diatur ke "Kustom", semua respons kesalahan akan menjadi Kesalahan Kustom. Jika errorMode diatur ke "Terperinci" semua respons kesalahan akan menjadi Kesalahan Terperinci. Tabel berikut mengklarifikasi perilaku ini:

errorMode Meminta asal Tindakan
DetailLocalOnly (default) Lokal Kesalahan Terperinci
DetailLocalOnly (default) Jarak Jauh Kesalahan Kustom
Kustom Lokal Kesalahan Kustom
Kustom Jarak Jauh Kesalahan Kustom
Terperinci Lokal Kesalahan Terperinci
Terperinci Jarak Jauh Kesalahan Terperinci

Jika modul httpError menentukan bahwa Kesalahan Kustom harus dibuat, modul tersebut akan melihat ke konfigurasinya untuk melihat apakah dapat menemukan kesalahan yang cocok. Jika kecocokan ditemukan, file statis akan dikirim, mengalihkan permintaan atau menjalankan URL yang ditentukan. Jika tidak ada kecocokan yang dapat ditemukan, IIS mengirim pesan satu baris dasar yang berisi kode status. Bagian berikutnya menjelaskan konfigurasi Kesalahan Kustom secara rinci.

Jika custerr.dll menentukan bahwa Kesalahan Terperinci harus dihasilkan, pemeriksaan lain diperlukan. IIS tidak menyentuh respons jika modul menimpa entitas respons dengan deskripsi kesalahannya sendiri. Ini mungkin berisi informasi berharga. ASP.NET adalah contoh yang baik. Entitas respons kesalahan ASP.NET mungkin berisi tumpukan pengecualian dan deskripsi kesalahannya sendiri. Kesalahan Terperinci hanya dihasilkan jika isi entitas respons kosong.

<httpErrors> Konfigurasi

Berikut adalah bagian kesalahan kustom IIS yang diperoleh pada penginstalan bersih:

<httpErrors>
    <error statusCode="401" prefixLanguageFilePath="c:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
    <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
    <error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />
</httpErrors>

Anda melihat bahwa jika kode status respons adalah 401, IIS akan mengembalikan file bernama 401.htm.

Kode Sub-Status

Banyak kesalahan HTTP memiliki sub-status. Konfigurasi Kesalahan Kustom default IIS tidak membedakan kode sub-status berbasis. Ini mengirim halaman Kesalahan Kustom yang sama jika Anda memasukkan kredensial yang salah (401.1), atau jika Anda mendapatkan akses ditolak berdasarkan hak yang tidak valid untuk mengakses file (401.3). Anda dapat melihat kode sub-status yang berbeda dalam file log atau melalui Kesalahan Terperinci. Berikut adalah daftar 404 kode sub-status berbeda yang dihasilkan IIS:

Status Deskripsi
404.1 Situs tidak dapat ditemukan
404.2 Ditolak oleh Kebijakan. Permintaan PROGRAM ISAPI atau CGI tidak diizinkan dalam Daftar Pembatasan.
404.3 Handler file statis tidak memiliki file di MimeMap-nya dan karenanya menolak permintaan.
404.4 Tidak ada handler yang ditemukan untuk melayani permintaan.
404.5 Modul Pemfilteran Permintaan menolak urutan URL dalam permintaan.
404.6 Modul Pemfilteran Permintaan menolak kata kerja HTTP permintaan.
404.7 Modul Pemfilteran Permintaan menolak ekstensi file permintaan.
404.8 Modul Pemfilteran Permintaan menolak segmen URL tertentu (karakter di antara dua garis miring).
404.9 IIS menolak untuk menyajikan file tersembunyi.
404.11 Modul Pemfilteran Permintaan menolak permintaan yang lolos dua kali.
404.12 Modul Pemfilteran Permintaan menolak permintaan yang berisi karakter bit tinggi.
404.14 Modul Pemfilteran Permintaan menolak permintaan dengan URL yang terlalu panjang.
404.15 Modul Pemfilteran Permintaan menolak permintaan dengan string kueri yang terlalu panjang.
413.1 Modul Pemfilteran Permintaan menolak permintaan yang terlalu panjang (badan permintaan + entitas).
431 Modul Pemfilteran Permintaan menolak header yang terlalu panjang.

Anda dapat mengonfigurasi bagian httpErrors untuk menampilkan Kesalahan Kustom untuk kode sub-status tertentu. Jika Anda menambahkan baris berikut ke bagian konfigurasi httpErrors, IIS mengembalikan 404_3.htm jika file dengan ekstensi file diminta yang tidak disertakan dalam IIS MimeMap (<bagian konfigurasi staticContent> ).

<error statusCode="404" subStatusCode="3" prefixLanguageFilePath="c:\inetpub\custerr" path="404_3.htm" />

Berikut adalah cara membuat contoh berfungsi:

  1. Tambahkan entri di atas ke bagian konfigurasi httpErrors Anda.
  2. Buat file bernama 404_3.htm di direktori Anda c:\inetpub\custerr\en-us .
  3. Buat file bernama test.yyy di direktori Anda c:\inetpub\wwwroot .
  4. Sekarang minta http://localhost/test.yyy.

Ekstensi file .yyy bukan bagian dari IIS MimeMap dan penangan file statis tidak akan melayaninya.

Baru di IIS: Kesalahan Kustom Khusus bahasa

Setiap browser terbaru mencakup bahasa klien sebagai header permintaan. Berikut adalah contoh tampilan header ini:

Accept-Language: en-us

Sintaksis dan registri bahasa yang diterima ditentukan dalam RFC1766.

Saat menghasilkan kesalahan, IIS memperhitungkan header ini ketika mencari file kesalahan kustom yang dikembalikannya. Ini menghasilkan jalur untuk kesalahan kustom menggunakan logika berikut:

pengaturan konfigurasi prefixLanguageFilePath (misalnya c:\inetpub\custerr)+
Accept-Language header yang dikirim oleh klien (misalnya en-us) +
Pengaturan konfigurasi jalur (misalnya 404.htm)

Contoh:

Jika browser mengirim permintaan untuk sumber daya yang tidak ada dan header "Accept-Language" memiliki nilai "en-us," file yang dikembalikan akan menjadi c:\inetpub\custerr\en-us\404.htm.

Misalnya, jika Anda berasal dari Jerman, Anda ingin pesan kesalahan Anda dalam bahasa Jerman. Untuk melakukan ini, Anda harus menginstal Windows Vista Language Pack untuk bahasa Jerman. Ini membuat c:\inetpub\custerr\de-DE direktori dengan file kesalahan kustom di dalamnya. Sekarang jika browser mengirim header "Accept-Language" dengan nilai "de-DE, file yang dikembalikan akan menjadi c:\inetpub\custerr\de-DE\404.htm.

IIS akan selalu kembali ke bahasa sistem jika direktori "de-DE" tidak ada.

Catatan

Internet Explorer memungkinkan Anda mengonfigurasi header Accept-Language. Buka "Alat" - "Opsi Internet", pilih tab "Umum" dan klik tombol "Bahasa".

Opsi Kesalahan Kustom

Dalam contoh di atas, IIS mengirimkan konten file sebagai respons kesalahan kustom. IIS memiliki dua cara lain untuk menanggapi kesalahan: dengan menjalankan URL atau dengan mengalihkan permintaan.

ExecuteUrl

Jika Anda ingin melakukan lebih banyak hal dalam kesalahan kustom Anda, misalnya mengirim email atau mencatat kesalahan ke database, Anda dapat menjalankan url. Ini memungkinkan Anda untuk menjalankan konten dinamis seperti halaman ASP.NET. Contoh di bawah ini menggantikan kesalahan kustom 404. Sekarang IIS menjalankan /404.aspx setiap kali terjadi kesalahan 404.

<httpErrors>
<!-- default custom error for 401 errors -->
<!-- <error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />-->

<!-- ExecuteURL replaces default file response mode -->
<error statusCode="404" path=/404.aspx" responseMode="ExecuteURL"/>        
<error statusCode="403" prefixLanguageFilePath="c:\inetpub\custerr" path="403.htm" />
<error statusCode="404" prefixLanguageFilePath="c:\inetpub\custerr" path="404.htm" />
<error statusCode="405" prefixLanguageFilePath="c:\inetpub\custerr" path="405.htm" />
<error statusCode="406" prefixLanguageFilePath="c:\inetpub\custerr" path="406.htm" />
<error statusCode="412" prefixLanguageFilePath="c:\inetpub\custerr" path="412.htm" />
<error statusCode="500" prefixLanguageFilePath="c:\inetpub\custerr" path="500.htm" />
<error statusCode="501" prefixLanguageFilePath="c:\inetpub\custerr" path="501.htm" />
<error statusCode="502" prefixLanguageFilePath="c:\inetpub\custerr" path="502.htm" />

</httpErrors>

Pertimbangan Keamanan

Satu kata peringatan: Untuk alasan arsitektur, IIS hanya dapat menjalankan URL jika terletak di Kumpulan Aplikasi yang sama. Gunakan fitur pengalihan untuk menjalankan Kesalahan Kustom di Kumpulan Aplikasi yang berbeda.

IIS juga dapat mengembalikan Pengalihan 302 ke browser ketika terjadi kesalahan tertentu. Pengalihan bagus jika Anda memiliki farm server. Misalnya, Anda dapat mengalihkan semua kesalahan Anda ke lokasi pusat yang Anda pantau dengan cermat.

Namun ada risiko: responseMode="File" (yang merupakan default) memungkinkan Anda menentukan setiap file pada disk. Ini tidak akan berfungsi jika Anda sangat sadar keamanan.

Skenario yang dapat dikerjakan mungkin termasuk hanya mengizinkan delegasi pengaturan errorMode. Ini memungkinkan pengembang untuk menerima Kesalahan Terperinci untuk aplikasinya bahkan jika dia menggunakan klien jarak jauh. Semua yang diperlukan adalah mengatur errorMode="Detail". Berikut adalah cara mengonfigurasi skenario ini:

Izinkan delegasi bagian httpErrors:

<section name="httpErrors" overrideModeDefault="Allow" />

Kedua, buka bagian <httpErrors> di applicationHost.config dan ubah sehingga hanya errorMode yang didelegasikan:

<httpErrors lockAllAttributesExcept="errorMode" lockElements="error">
    <error statusCode="404" prefixLanguageFilePath="E:\inetpub\custerr" path="404.htm" />
    <error statusCode="401" prefixLanguageFilePath="E:\inetpub\custerr" path="401.htm" />
    <error statusCode="403" prefixLanguageFilePath="E:\inetpub\custerr" path="403.htm" />
    <error statusCode="405" prefixLanguageFilePath="E:\inetpub\custerr" path="405.htm" />
    <error statusCode="406" prefixLanguageFilePath="E:\inetpub\custerr" path="406.htm" />
    <error statusCode="412" prefixLanguageFilePath="E:\inetpub\custerr" path="412.htm" />
    <error statusCode="500" prefixLanguageFilePath="E:\inetpub\custerr" path="500.htm" />
    <error statusCode="501" prefixLanguageFilePath="E:\inetpub\custerr" path="501.htm" />
    <error statusCode="502" prefixLanguageFilePath="E:\inetpub\custerr" path="502.htm" />
</httpErrors>

Ringkasan

Kesalahan Kustom dan Terperinci adalah fitur IIS yang kuat. Ini membantu Anda memecahkan masalah tanpa mengorbankan keamanan Server IIS Anda. Banyak opsi konfigurasi membantu Anda menyesuaikan pengalaman pengguna Anda. Yang paling penting: bereksperimen dengan itu menyenangkan.

Lihat juga