IIS6 vs IIS7 dan IIS7.5: menangani URL dengan tanda tambah (+) di pangkalan (bukan querystring)

39

Untuk setiap URL dengan tanda tambah (+) di URL dasar (bukan querystring), IIS7 dan IIS7.5 (Windows Server 2008 dan 2008 R2) tampaknya tidak meneruskan URL ke penangan default pada aplikasi ASP.NET aplikasi . Saya mulai memperhatikan masalah dengan handler HTTP khusus aktif *.htmltetapi saya memiliki masalah yang sama dengannya *.aspx. IIS6 (Server 2003) tidak memiliki masalah dengan URL yang sama ini.

Untuk mereplikasi masalah ini, di situs ASP.NET, saya membuat satu set file ASPX yang melakukan Response.Write sederhana dengan berbagai nama:

  1. test_something.aspx
  2. test_some + thing.aspx
  3. test_some thing.aspx

File ketiga adalah tes untuk melihat apakah IIS7 [.5] memperlakukan simbol plus sebagai spasi (seperti dalam querystring); sepertinya ini bukan masalahnya. Dengan semua file ini di tempat, memukul http://somehost/test_some+thing.aspxatau http://somehost/test_some%2bthing.aspxakan berfungsi dengan baik di IIS6 tetapi 404 di IIS7 / IIS7.5 sebelum sampai ke penangan ASP.NET. Apakah ada konfigurasi di IIS7 / 7.5 yang saya lewatkan untuk membuatnya "melihat" tanda tambah di URL tanpa melewatkan ekstensi akhir yang digunakan untuk menentukan HTTP handler?

patridge
sumber
Saya ingin tahu apakah keluar dari tanda plus akan membantu. Mungkin \+?
Dijeda sampai pemberitahuan lebih lanjut.

Jawaban:

40

Setelah mencari lebih banyak kombinasi IIS dan plus, tampaknya IIS7 [.5] diatur untuk menolak URL dengan tanda tambah secara default karena takut penggunaan karakter itu; simbol itu masih diperbolehkan dalam querystring. The solusi adalah untuk mengubah default atribut requestFiltering pada <system><webServer><security><requestFiltering>untuk memungkinkan karakter ganda-dikodekan dengan panggilan baris perintah (akhirnya memodifikasi Anda ASP.NET web.config):

%windir%\system32\inetsrv\appcmd set config "Default Web Site" -section:system.webServer/security/requestFiltering -allowDoubleEscaping:true

Ini mungkin sedikit lebih berbahaya daripada yang lebih suka dengan situs web mereka, tetapi tampaknya tidak ada cara untuk lebih spesifik daripada selimut yang diizinkan. Peringatan terkait ketidaksesuaian yang bisa terjadi antara menggunakan nilai tambah di URL dan terjemahannya sebagai spasi. Sepertinya satu-satunya alternatif lain adalah berhenti menggunakan karakter plus di URL Anda sama sekali.

patridge
sumber
2
Hanya FYI: Anda tidak perlu melakukan ini pada templat level root. Ini dapat dilakukan dalam file Web.config apa pun atau diterapkan pada subfolder dengan tag <location />.
mdonatas
Di IIS Manager: Sites => YourSite => Pemfilteran Permintaan => Edit Pengaturan Fitur ... => Periksa Izinkan pelolosan ganda => OK
diynevala
9

Saya baru tahu cara membuat aturan penulisan ulang untuk meyakinkan IIS7 untuk memetakan plus untuk spasi di URL. Dalam kasus saya ini adalah untuk menjaga bookmark lama atau hyperlink berfungsi.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering allowDoubleEscaping="True" />
    </security>
    <rewrite>
      <rules>
        <rule name="RewriteUserFriendlyURL1" stopProcessing="false">
          <match url="\+" />
          <conditions>
            <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
            <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          </conditions>
          <action type="Rewrite" url="{UrlDecode:{REQUEST_URI}}" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

Lihat posting blog saya untuk rincian dan referensi lebih lanjut.

Nathan
sumber
1
Saya memecahkan masalah di mana saya harus mendukung URL lawas dengan tanda plus di string kueri hanya menggunakan bagian keamanan di atas yaitu pengaturan allowDoubleEscaping ke "True".
stephen
Saya punya kasus unik - beberapa url lawas memiliki dua plusses berurutan, yaitu "++". IIS tampaknya memiliki aturan khusus yang menentang hal ini. ada ide?
boomhauer
@ boomhauer Anda mungkin perlu menulis handler ... atau menggunakan server web yang berbeda untuk menghosting URL itu? Suatu kali saya membuat Apache mod_rewrite menangani banyak URL lama dan mengarahkannya ke berbagai tempat baru, dan sepertinya sedikit lebih fleksibel.
Nathan