IIS6 so với IIS7 và IIS7.5: xử lý các URL có dấu cộng (+) trong cơ sở (không phải chuỗi truy vấn)


38

Đối với bất kỳ URL nào có dấu cộng (+) trong URL cơ sở (không phải chuỗi truy vấn), IIS7 và IIS7.5 (Windows Server 2008 và 2008 R2) sẽ không xuất hiện để chuyển URL tới trình xử lý mặc định trên ứng dụng ASP.NET . Tôi bắt đầu nhận thấy vấn đề với trình xử lý HTTP tùy chỉnh trên *.htmlnhưng tôi có cùng vấn đề với *.aspx. IIS6 (Server 2003) không có vấn đề với các URL tương tự.

Để tái tạo vấn đề, trong một trang web ASP.NET, tôi đã tạo một tập hợp các tệp ASPX thực hiện một Phản hồi đơn giản. Viết với nhiều tên khác nhau:

  1. test_s Something.aspx
  2. test_some + thing.aspx
  3. test_some điều.aspx

Tệp thứ ba là một thử nghiệm để xem liệu IIS7 [.5] có coi các ký hiệu cộng là khoảng trắng không (như trong chuỗi truy vấn); Điều này không xuất hiện để được các trường hợp. Với tất cả các tệp này, việc nhấn http://somehost/test_some+thing.aspxhoặc http://somehost/test_some%2bthing.aspxsẽ hoạt động tốt trong IIS6 nhưng 404 trong IIS7 / IIS7.5 trước khi truy cập bất kỳ trình xử lý ASP.NET nào. Có một số cấu hình trong IIS7 / 7.5 mà tôi bị thiếu để làm cho nó "nhìn thấy" một dấu cộng trong URL mà không bỏ lỡ tiện ích mở rộng cuối cùng được sử dụng để xác định trình xử lý HTTP không?


Tôi tự hỏi nếu thoát khỏi dấu cộng sẽ giúp. Có lẽ \+nào?
Tạm dừng cho đến khi có thông báo mới.

Câu trả lời:


39

Sau khi tìm kiếm thêm các kết hợp IIS và dấu cộng, có vẻ như IIS7 [.5] được thiết lập để từ chối các URL có dấu cộng theo mặc định vì sợ sử dụng ký tự đó; biểu tượng đó vẫn được cho phép trong chuỗi truy vấn, mặc dù. Các giải pháp là để thay đổi mặc định thuộc tính requestFiltering trên <system><webServer><security><requestFiltering>để cho phép nhân vật kép được mã hóa với một cuộc gọi dòng lệnh (cuối cùng sửa đổi của bạn ASP.NET web.config):

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

Điều này có thể nguy hiểm hơn một chút so với trang web của họ, nhưng dường như không có cách nào cụ thể hơn là cho phép chăn. Các cảnh báo liên quan đến sự không khớp có thể xảy ra giữa việc sử dụng dấu cộng trong URL và bản dịch điển hình của nó dưới dạng khoảng trắng. Có vẻ như chỉ có một sự thay thế khác là ngừng sử dụng các ký tự cộng trong URL của bạn.


2
Chỉ là một FYI: Bạn không cần phải làm điều này trên mẫu cấp độ gốc. Điều này có thể được thực hiện trong bất kỳ tệp Web.config nào hoặc được áp dụng cho thư mục con có thẻ <location />.
mdonatas

Trong Trình quản lý IIS: Trang web => YourSite => Lọc yêu cầu => Chỉnh sửa cài đặt tính năng ... => Kiểm tra Cho phép thoát kép => OK
diynevala

9

Tôi chỉ tìm ra cách tạo quy tắc viết lại để thuyết phục IIS7 ánh xạ các điểm cộng vào khoảng trắng trong URL. Trong trường hợp của tôi, đó là để giữ các dấu trang cũ hoặc siêu liên kết hoạt động.

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

Xem bài viết trên blog của tôi để biết thêm chi tiết và tham khảo.


1
Tôi đã giải quyết một vấn đề trong đó tôi phải hỗ trợ các URL kế thừa có dấu cộng trong chuỗi truy vấn chỉ bằng phần bảo mật ở trên, tức là đặt allowDoubleEscaping thành "True".
stephen

Tôi có một trường hợp duy nhất - một số url kế thừa có hai kìm nối tiếp, tức là "++". IIS dường như có một quy tắc đặc biệt chống lại điều này. có ý kiến ​​gì không
boomhauer

@boomhauer bạn có thể cần phải viết một trình xử lý ... hoặc sử dụng một máy chủ web khác để lưu trữ các URL đó? Một lần tôi đã tạo cho Apache mod_rewrite xử lý một loạt các URL kế thừa và chuyển hướng chúng đến nhiều địa điểm mới khác nhau và nó có vẻ linh hoạt hơn một chút.
Nathan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.