2010-10-04 23 views
19

Tôi đã một nguồn tài nguyên đó là một . Điều này có nghĩa url của tôi trông như thế này: http://myapp/index/ . Và tôi cần phải thêm tham số truy vấn để nó trông như thế này: http://myapp/index/.?type=xml tôi sử dụng Freemarker cho việc trình bày các nguồn lực của tôi và làm một hack trăm mã hóa cho trường hợp này:Một nguồn url đó là một dấu chấm (% 2E)

<#if key?matches("\\.")> 
<li><a href="${contextPath}/index/%2E">${key}</a></li> 
</#if> 

này hoạt động tốt cho Firefox. Nhưng tất cả các trình duyệt khác như IE, Safari, Chrom, Opera chỉ bỏ qua dấu chấm được mã hóa url của tôi (http://myapp/index/%2E).

Mọi đề xuất?

Trả lời

14

Thực tế không được nêu rõ trong tiêu chuẩn (RFC 3986) cho dù phiên bản được mã hóa theo phần trăm của . hoặc .. có nghĩa là phải có cùng một thư mục/thư mục có nghĩa là phiên bản chưa thoát. Phần 3.3 chỉ nói về “Đoạn đường dẫn ...”, mà không làm rõ liệu chúng có khớp với ... trước hoặc sau khi mã hóa pct hay không.

Cá nhân tôi tìm thấy cách diễn giải của Firefox là %2E không có nghĩa là . thực tế nhất, nhưng tiếc là tất cả các trình duyệt khác không đồng ý. Điều này có nghĩa là bạn không thể có thành phần đường dẫn chỉ chứa . hoặc ...

Tôi nghĩ rằng đề xuất duy nhất có thể là "không làm điều đó"! Có các thành phần đường dẫn khác cũng rất phiền phức, thường do giới hạn của máy chủ: các chuỗi %2F, %00%5C trong đường dẫn cũng có thể bị chặn bởi một số máy chủ web và phân đoạn đường dẫn trống cũng có thể gây ra sự cố. Vì vậy, nói chung nó không thể phù hợp với tất cả các chuỗi byte có thể thành một thành phần đường dẫn.

+0

Tôi đoán tôi phải cấm điều đó, thx. – cuh

+1

Tôi nhận thấy rằng ngay cả khi% 2e là một phần của URL, ví dụ: 'http: // localhost/index% 2ehtml', Firefox (14) và Chrome chuyển nó thành' .'. Điều này được quy định trong phần 2.3. Sau đó trong phần 3.3, nó nói rằng '.' và' ..' là để tham chiếu tương đối trong tên đường dẫn. Vì vậy, 'http: // localhost /% 2e' về cơ bản có nghĩa là' http: // localhost/'. – slowpoison

+1

Điểm tốt, @slowpoison - "URI khác nhau về việc thay thế một ký tự không được đặt trước với octet mã ASCII được mã hóa phần trăm tương ứng của nó tương đương", và "." là một nhân vật không được bảo tồn. Ah tốt. – phyzome

5

Không thể thực hiện được. §2.3 nói rằng "." là một ký tự không được đặt trước và rằng "các URI khác nhau về việc thay thế một ký tự không được đặt trước với số octet được mã hóa bằng phần trăm US-ASCII tương ứng của nó là tương đương". Do đó, /%2E%2E/ giống với /../ và điều đó sẽ được chuẩn hóa.

(Đây là sự kết hợp của câu trả lời của bobince và nhận xét bằng cách làm chậm.)

Các vấn đề liên quan