2010-07-30 7 views
28

Tôi có một tuyến đường MVC đó là cho tôi địa ngục trên một máy chủ dàn chạy IIS. Tôi đang chạy máy chủ phát triển của Visual Studio 2010 cục bộ.Plus (+) trong MVC Đối số gây ra 404 trên IIS 7.0

Đây là một URL mẫu mà thực sự hoạt động trên hộp dev của tôi:

Root/CPUBoards/Full+Size 

Results 
Server Error404 - File or directory not found. 
The resource you are looking for might have been removed, had its name changed, or is temporarily unavailable. 

Dưới đây là hành vi hoàn toàn tôi nhìn thấy.

Localhost:

Root/CPUBoards/Full Size - Resolves 
Root/CPUBoards/Full%20Size - Resolves 
Root/CPUBoards/Full+Size - Resolves 

Staging Server với IIS 7.0:

Root/CPUBoards/Full Size - Resolves 
Root/CPUBoards/Full%20Size - Resolves 
Root/CPUBoards/Full+Size - 404 Not Found Error. 

Bất kỳ ý tưởng? Tôi cần phải làm việc với các phiên bản mã hóa vì nhiều lý do ... sẽ không lãng phí thời gian của bạn với họ.

HttpUtility.UrlEncode ("Full Size") trả về phiên bản có dấu cộng ... Full + Size. Điều này làm việc trên hộp dev của tôi, nhưng không phải trên máy chủ dàn dựng. Tôi muốn chỉ làm cho nó hoạt động trên máy chủ, vì tôi đã có mọi thứ khác được thử nghiệm và làm việc cục bộ, nhưng tôi không biết bắt đầu tìm kiếm trên cấu hình máy chủ để làm cho nó hoạt động theo cùng một cách.

Cảm ơn!

+0

thể bạn xây dựng tại địa phương sử dụng IIS 7 thay vì ASP.NET môi trương phat triển? – websch01ar

Trả lời

16

+ chỉ có ý nghĩa đặc biệt là không gian trong application/x-www-form-urlencoded dữ liệu như phần chuỗi truy vấn của URL.

Trong các phần khác của URL như thành phần đường dẫn, + nghĩa đen là dấu cộng. Vì vậy, việc giải quyết Full+Size thành tên chưa được mã hóa Full Size sẽ không hoạt động ở bất kỳ đâu.

Hình dạng đúng của không gian trong thành phần đường dẫn là %20. (Nó vẫn hoạt động khi bạn gõ một khoảng trống thực tế bởi vì trình duyệt phát hiện lỗi và chỉnh sửa nó cho bạn.) %20 cũng hoạt động trong dữ liệu được mã hóa dạng URL, vì vậy thường an toàn nhất để luôn sử dụng.

Đáng buồn là HttpUtility.UrlEncode được đặt tên sai. Nó tạo ra + trong đầu ra của nó thay vì %20, do đó, nó thực sự là một bộ mã hóa biểu mẫu URL và không phải là bộ mã hóa URL chuẩn. Thật không may tôi không biết về một chức năng ASP.NET để "thực sự URL mã hóa" chuỗi để sử dụng trong một con đường, vì vậy tất cả tôi có thể khuyên bạn nên làm một chuỗi thay thế của + đến %20 sau khi mã hóa.

Cách khác, tránh sử dụng dấu cách trong các phần đường dẫn, ví dụ: bằng cách thay thế chúng bằng -. Thông thường, các tiêu đề ‘slug’ được chèn vào URL, giảm tiêu đề thành chữ và số đơn giản và dấu câu ‘an toàn’, để tránh điền URL với các chuỗi %nn xấu xí.

+0

OK.Điều này rất hữu ích. Các URL "Phân đoạn" này đến từ cơ sở dữ liệu và chúng tôi muốn cho phép dữ liệu trong cơ sở dữ liệu trở nên tự nhiên. Chúng tôi cũng cần URL là duy nhất, vì vậy việc thay thế một loạt nội dung bằng '-' không phải là điều mong muốn. Ví dụ: chúng tôi có cả ký tự gạch dưới và dấu cách, cả hai đều muốn thay thế bằng dấu gạch ngang. Tôi cho rằng điều này có nghĩa là chúng tôi đang mắc kẹt bằng cách sử dụng "xấu" như% 20 để đại diện cho các nhân vật chính xác, nhưng đây là những trường hợp cạnh và sự thỏa hiệp không quá tệ. Tôi đoán tôi sẽ phải làm một số thay thế bằng tay trước khi công cụ mã hóa URL. Cảm ơn! –

+3

Thật không may bạn không thể * khá * nhận được chuỗi tùy ý vào các phần đường dẫn. '% 2F' (dạng mã hóa của'/') bị chặn bởi nhiều máy chủ web — theo mặc định trong Apache, và không thể tránh khỏi trong IIS. IIS cũng chặn '% 5C' và tất cả các máy chủ chặn'% 00' (các mã điều khiển khác cũng có thể gây ra nhiều khó khăn khác nhau, và dĩ nhiên Unicode trong các phần đường dẫn có một số phần mềm riêng). – bobince

20

Đây là cài đặt bảo mật IIS. Có một bộ lọc yêu cầu tiêu chuẩn loại bỏ các URL chứa các ký tự + (cộng).

Bạn có thể vô hiệu hóa nó cho web của bạn, thêm này vào web.config của bạn:

<configuration> 
    ... 
    <system.webServer> 
     ... 
     <security> 
      <requestFiltering allowDoubleEscaping="true" /> 
     </security> 
    </system.webServer> 
    ... 
</configuration> 
+0

Làm việc cho tôi. Thông tin chi tiết về 'allowDoubleEscaping' tại đây: http://stackoverflow.com/a/1453287/3678079 – webStuff

4

System.Web.HttpUtility.UrlPathEncode(string str) mã hóa một + đến một %20

+0

Tôi nghĩ rằng OP có phần được tìm ra - tại sao nó gây ra lỗi là vấn đề hơn. – Hannele