IIS6 กับ IIS7 และ IIS7.5: การจัดการ URL ที่มีเครื่องหมายบวก (+) เป็นฐาน (ไม่ใช่การสอบถาม)


38

สำหรับ URL ใด ๆ ที่มีเครื่องหมายบวก (+) ใน URL พื้นฐาน (ไม่ใช่การสอบถาม), IIS7 และ IIS7.5 (Windows Server 2008 และ 2008 R2) จะไม่ปรากฏขึ้นเพื่อส่งต่อ URL ไปยังตัวจัดการเริ่มต้นบนแอปพลิเคชัน ASP.NET . ผมเริ่มสังเกตเห็นปัญหากับที่กำหนดเอง HTTP จัดการบนแต่ฉันมีปัญหาเดียวกันกับ*.html *.aspxIIS6 (Server 2003) ไม่มีปัญหากับ URL เดียวกันนี้

เมื่อต้องการทำซ้ำปัญหาในไซต์ ASP.NET ฉันสร้างชุดของไฟล์ ASPX ที่ทำ Response.Write ง่ายๆด้วยชื่อต่าง ๆ :

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

ไฟล์ที่สามเป็นการทดสอบเพื่อดูว่า IIS7 [.5] กำลังใช้เครื่องหมายบวกเป็นช่องว่างหรือไม่ (เหมือนในการสอบถาม) ดูเหมือนจะไม่เป็นเช่นนั้น เมื่อไฟล์เหล่านี้เข้าแทนที่http://somehost/test_some+thing.aspxหรือhttp://somehost/test_some%2bthing.aspxจะทำงานได้ดีใน IIS6 แต่ 404 ใน IIS7 / IIS7.5 ก่อนที่จะไปที่ตัวจัดการ ASP.NET ใด ๆ มีการกำหนดค่าบางอย่างใน IIS7 / 7.5 ที่ฉันหายไปเพื่อ "ดู" เครื่องหมายบวกใน URL โดยไม่พลาดส่วนขยายสุดท้ายที่ใช้เพื่อกำหนดตัวจัดการ HTTP หรือไม่


ฉันสงสัยว่าการหลบหนีเครื่องหมายบวกจะช่วยได้หรือไม่ อาจจะ\+?
Dennis Williamson

คำตอบ:


39

หลังจากค้นหาชุดค่าผสมเพิ่มเติมของ IIS และบวกปรากฏว่า IIS7 [.5] ถูกตั้งค่าให้ปฏิเสธ URL ที่มีเครื่องหมายบวกโดยค่าเริ่มต้นจากความกลัวการใช้อักขระนั้น แม้ว่าจะยังคงอนุญาตให้ใช้สัญลักษณ์นั้นในการสอบถามได้ วิธีการแก้ปัญหาคือการปรับเปลี่ยนค่าเริ่มต้น requestFiltering แอตทริบิวต์ใน<system><webServer><security><requestFiltering>การอนุญาตให้ตัวละครเป็นทวีคูณเข้ารหัสด้วยการเรียกบรรทัดคำสั่ง (ในที่สุดการปรับเปลี่ยนของคุณ ASP.NET web.config):

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

นี่อาจเป็นอันตรายมากกว่าที่คน ๆ หนึ่งชอบที่จะอยู่กับเว็บไซต์ของพวกเขา แต่ดูเหมือนจะไม่มีทางที่จะเจาะจงมากกว่าผ้าห่มที่อนุญาต คำเตือนเกี่ยวกับการไม่ตรงกันที่อาจเกิดขึ้นระหว่างการใช้เครื่องหมายบวกใน URL และการแปลทั่วไปเป็นช่องว่าง ดูเหมือนว่าทางเลือกอื่น ๆ เท่านั้นคือการหยุดการใช้เครื่องหมายบวกใน URL ของคุณเลย


2
เพียงแค่ FYI: คุณไม่ต้องทำสิ่งนี้กับเทมเพลตระดับรูท สามารถทำได้ในไฟล์ Web.config ใด ๆ หรือนำไปใช้กับโฟลเดอร์ย่อยที่มีแท็ก <location />
mdonatas

ใน IIS Manager: Sites => YourSite => การกรองการร้องขอ => แก้ไขการตั้งค่าคุณสมบัติ ... => ทำเครื่องหมายอนุญาตการหลบหนีสองครั้ง => ตกลง
diynevala

9

ฉันเพิ่งค้นพบวิธีการสร้างกฎใหม่เพื่อโน้มน้าว IIS7 ให้แมปบวกกับช่องว่างใน URL ในกรณีของฉันมันคือการทำให้บุ๊คมาร์คดั้งเดิมหรือเชื่อมโยงหลายมิติทำงานได้

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

ดูบล็อกโพสต์ของฉันสำหรับรายละเอียดเพิ่มเติมและการอ้างอิง


1
ฉันแก้ไขปัญหาที่ฉันต้องสนับสนุน URL ดั้งเดิมด้วยเครื่องหมายบวกในสตริงการสืบค้นโดยใช้เฉพาะส่วนความปลอดภัยด้านบนเช่นการตั้งค่า allowDoubleEscaping เป็น "True"
stephen

ฉันมีกรณีที่ไม่ซ้ำกัน - URL ดั้งเดิมบางรายการมีจุดต่อสองจุดคือ "++" IIS ดูเหมือนจะมีกฎพิเศษสำหรับเรื่องนี้ ความคิดใด ๆ
boomhauer

@boomhauer คุณอาจต้องเขียนตัวจัดการ ... หรือใช้เว็บเซิร์ฟเวอร์อื่นเพื่อโฮสต์ URL เหล่านั้น มีอยู่ครั้งหนึ่งที่ฉันทำให้ Apache mod_rewrite จัดการกับ URL ดั้งเดิมจำนวนมากและเปลี่ยนเส้นทางไปยังสถานที่ใหม่ ๆ และดูเหมือนยืดหยุ่นกว่าเล็กน้อย
นาธาน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.