IIS6 ve IIS7 ve IIS7.5'e göre: URL'leri artı işaretli (+) tabanda (sorgulamada değil) kullanma


38

Temel URL'de artı işareti (+) bulunan herhangi bir URL'de (sorgulayıcı değil), IIS7 ve IIS7.5 (Windows Server 2008 ve 2008 R2), URL'yi bir ASP.NET uygulamasındaki varsayılan işleyiciye iletmiyor gibi görünüyor . Özel bir HTTP işleyicisiyle sorunu fark etmeye başladım, *.htmlancak aynı sorunu yaşıyorum *.aspx. IIS6'da (Server 2003) bu aynı URL'lerde sorun yoktur.

Sorunu çoğaltmak için, bir ASP.NET sitesinde, çeşitli adlarla basit bir Response.Write yapan bir ASPX dosyası grubu oluşturdum:

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

Üçüncü dosya, IIS7 [.5] 'in artı sembolleri boşluk olarak ele alıp almadığını görmek için yapılan bir testti (sorguda olduğu gibi); Durum böyle görünmüyor. Tüm bu dosyalar yerindeyken, herhangi bir ASP.NET işleyicisine ulaşmadan önce IIS6'da, IIS4 / 407'de ise 404'te isabet http://somehost/test_some+thing.aspxya da http://somehost/test_some%2bthing.aspxiyi çalışacaktır. IIS7 / 7.5'te, bir HTTP işleyicisini belirlemek için kullanılan son uzantıyı kaybetmeden URL'de bir artı işareti "görmesini" sağlamak için kaçırdığım bazı yapılandırmalar var mı?


Artı işaretinden kaçmak yardımcı olur mu acaba. Belki \+?
Dennis Williamson

Yanıtlar:


39

IIS ve plus'ın daha fazla kombinasyonunu aradıktan sonra, IIS7 [.5], URL'leri varsayılan olarak bir karakterin kullanılması korkusundan bir artı işaretiyle reddetmek üzere ayarlanmış görünüyor; Bu sembol querystring'de yine de izin veriliyor. Çözelti üzerine requestFiltering nitelik varsayılan değiştirmeye etmektir <system><webServer><security><requestFiltering>bir komut satırı çağrısı ile iki kat-kodlanmış karakterleri izin vermek (sonuçta modifiye senin ASP.NET web.config):

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

Bu, birisinin web sitesinde olmayı tercih ettiğinden biraz daha tehlikeli olabilir, ancak bir battaniyenin izin verdiğinden daha spesifik olmanın bir yolu yoktu. Uyarılar, bir URL’de bir artı kullanımı ve bunun bir boşluk olarak tipik çevirisi arasında meydana gelebilecek uyuşmazlıklarla ilgiliydi. Görünen o ki, diğer alternatif, URL’lerinizde bulunan artı karakterleri kullanmayı bırakmaktır.


2
Sadece bir Bilginize: Bunu kök seviye şablonunda yapmanız gerekmez. Bu, herhangi bir Web.config dosyasında yapılabilir veya <location /> etiketiyle bir alt klasöre uygulanabilir.
mdonatas

IIS Yöneticisinde: Sites => YourSite => İstek Filtreleme => Özellik Ayarlarını Düzenle ... => Çifte
kaçışa

9

IIS7'yi URL'lerin boşluklarına eşlemek için IIS7'yi ikna etmek için yeniden yazma kuralının nasıl yapıldığını öğrendim. Benim durumumda, eski yer imlerinin veya köprülerin çalışmasını sağlamaktı.

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

Daha fazla bilgi ve referanslar için blog gönderime bakın .


1
Yukarıdaki sadece güvenlik bölümünü kullanarak, yani dizgide URL'leri ve sorgu dizesindeki artı işaretlerini desteklemek zorunda olduğum bir sorunu çözdüm.
stephen

Benzersiz bir durumum var - bazı eski URL'ler iki sıralı artıya sahiptir, yani "++". IIS'nin buna karşı özel bir kuralı olduğu görülüyor. herhangi bir fikir?
Boomhauer

@ boomhauer bu URL'leri barındırmak için bir işleyici yazmanız veya farklı bir web sunucusu kullanmanız gerekebilir mi? Bir keresinde Apache mod_rewrite'ı bir sürü eski URL'ye yöneltip bunları çeşitli yeni yerlere yönlendirdim ve biraz daha esnek görünüyordu.
Nathan
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.