Tôi có một trang web xử lý "/" và "% 2F" trong phần đường dẫn (không chuỗi truy vấn) của một URL khác nhau. Đây có phải là một điều xấu để làm theo RFC hoặc thế giới thực?Dấu gạch chéo ("/") tương đương với dấu gạch chéo được mã hóa ("% 2F") trong phần đường dẫn của URL HTTP
Tôi hỏi vì tôi tiếp tục gặp phải một chút bất ngờ với khung web tôi đang sử dụng (Ruby on Rails) cũng như các lớp bên dưới (Hành khách, Apache, vd, tôi phải bật "ALLOW_ENCODED_SLASHES" cho Apache) . Bây giờ tôi đang nghiêng về việc loại bỏ các dấu gạch chéo mã hóa hoàn toàn, nhưng tôi tự hỏi liệu tôi có nên nộp báo cáo lỗi mà tôi thấy hành vi kỳ lạ liên quan đến các dấu gạch chéo được mã hóa hay không.
Là tại sao tôi có dấu gạch chéo được mã hóa ở nơi đầu tiên, về cơ bản tôi có các tuyến đường như thế này:
:controller/:foo/:bar
nơi: foo là một cái gì đó giống như một con đường có thể chứa dấu gạch chéo. Tôi nghĩ rằng điều đơn giản nhất để làm là chỉ cần thoát URL foo
để các dấu gạch chéo bị bỏ qua bởi cơ chế định tuyến. Bây giờ tôi đang có nghi ngờ, và nó khá rõ ràng rằng các khuôn khổ không thực sự hỗ trợ này, nhưng theo RFC là nó sai để làm điều đó theo cách này?
Dưới đây là một số thông tin tôi đã thu thập được:
RFC 1738 (URL):
thường một URL có sự giải thích tương tự khi một octet được đại diện bởi một nhân vật và khi nó được mã hóa. Tuy nhiên, điều này không đúng đối với các ký tự dành riêng: mã hóa một ký tự dành riêng cho một lược đồ cụ thể có thể thay đổi ngữ nghĩa của một URL.
RFC 2396 (URI):
Những nhân vật được gọi là "dành riêng", vì việc sử dụng của họ trong phần URI được giới hạn mục đích dự trữ của họ. Nếu dữ liệu cho thành phần URI sẽ xung đột với mục đích được bảo lưu, thì dữ liệu mâu thuẫn phải được thoát trước khi tạo URI.
(không thoát ở đây có nghĩa là một cái gì đó khác hơn là mã hóa các nhân vật reserved?)
RFC 2616 (HTTP/1.1):
nhân vật khác hơn là những người trong "dành riêng" và "không an toàn "bộ (xem RFC 2396 [42]) tương đương với mã hóa" "%" HEX HEX "của chúng.
Ngoài ra còn có this bug report cho Rails, nơi họ dường như mong đợi các dấu gạch chéo được mã hóa để hành xử khác nhau:
Đúng vậy, tôi mong đợi kết quả khác nhau vì họ đang chỉ vào các nguồn lực khác nhau.
Tìm kiếm tệp 'foo/bar' trong thư mục gốc. Phiên bản không thoát được tìm kiếm thanh tập tin trong thư mục foo.
Rõ ràng từ RFC mà nguyên so với được mã hóa tương đương với các ký tự không được đặt trước, nhưng câu chuyện dành cho ký tự dành riêng là gì?
Liên quan: http://stackoverflow.com/q/14631200/1591669 – unor
Người dùng PHP sử dụng bộ điều khiển phía trước: $ _GET & $ _REQUEST đã được mã hóa. Điều này có thể gây ra sự cố với dấu gạch chéo vì bạn sẽ không thể biết dấu gạch chéo là gì và% 2F là gì. Nếu bạn hoàn toàn cần xem yêu cầu khi nó được gửi, hãy xem trong $ _SERVER ['REQUEST_URI']. Xem thêm [urldecode() @ php.net] (http://php.net/manual/en/function.urldecode.php) –