2011-02-08 32 views
30

Bài đăng SO dưới đây là toàn diện, nhưng cả ba phương pháp được mô tả đều không mã hóa trong các khoảng thời gian.Làm cách nào để mã hóa các khoảng thời gian cho URL trong Javascript?

bài viết: Encode URL in JavaScript?

Ví dụ, nếu tôi chạy ba phương pháp (ví dụ, trốn thoát, encodeURI, encodeURIComponent), không ai trong số họ mã hóa giai đoạn.

Vì vậy, "food.store" xuất hiện dưới dạng "food.store", làm URL bị hỏng. Nó phá vỡ URL vì ứng dụng Rails không thể nhận ra URL là hợp lệ và hiển thị trang lỗi 404. Có lẽ đó là một lỗi cấu hình trong tập tin tuyến đường Rails?

Cách tốt nhất để mã hóa khoảng thời gian bằng Javascript cho URL là gì?

+8

Bằng cách nào nó sẽ phá vỡ URL? Thời gian không phải được mã hóa theo như tôi biết. – igorw

+0

Cảm ơn, đã cập nhật câu hỏi để phản ánh câu hỏi của bạn. – Crashalot

+0

Tôi đã thêm "ruby-on-rails" vào thẻ của bạn - đây không phải là vấn đề chung về URL, mà là vấn đề về Rails hoặc một vấn đề cụ thể đối với ứng dụng của bạn. – Pointy

Trả lời

25

Thời gian không được ngắt url, nhưng tôi không biết bạn đang sử dụng khoảng thời gian như thế nào, vì vậy tôi thực sự không thể nói. Không có hàm nào tôi biết mã hóa '.' cho một url, có nghĩa là bạn sẽ phải sử dụng chức năng của riêng bạn để mã hóa '.' .

Bạn có thể mã hóa base64 dữ liệu, nhưng tôi không tin rằng có một cách riêng để làm điều đó trong js. Bạn cũng có thể thay thế tất cả các khoảng thời gian bằng mã ASCII tương đương (% 2E) trên cả phía máy khách và phía máy chủ.

Về cơ bản, thường không cần mã hóa '.', Vì vậy nếu cần, bạn sẽ cần đưa ra giải pháp của riêng mình. Bạn cũng có thể muốn thử nghiệm thêm để đảm bảo '.' sẽ thực sự phá vỡ url.

hth

+0

Cảm ơn, đã cập nhật câu hỏi để phản ánh câu hỏi của bạn. – Crashalot

+1

@crashalot Tôi nghĩ rằng cấu hình định tuyến Rails của bạn cần phải được sửa. Tôi không phải là một anh chàng rails, nhưng có thể Rails không hỗ trợ thời gian. Kiểm tra url này, tôi tin rằng nó giải quyết vấn đề của bạn: http://masonoise.wordpress.com/2010/02/04/rails-routes-with-string-ids-and-periods/ – superultranova

+0

Tôi không thể tìm thấy các tuyến đường của tôi nên sử dụng công việc này crappy hacky xung quanh: Tag.find_by_name (params [: id] + '.' + params [: định dạng]) – rogerdpack

7

Thời gian không cần phải được mã hóa trong URL. Here là RFC để xem xét.

Nếu một khoảng thời gian là "phá vỡ" một cái gì đó, có thể máy chủ của bạn đang thực hiện giải thích URL của riêng mình, đó là điều tốt để làm tất nhiên, nhưng điều đó có nghĩa là bạn phải tìm ra một số lược đồ mã hóa của riêng bạn khi metacharacters của riêng bạn cần thoát.

+0

Cảm ơn, đã cập nhật câu hỏi để phản ánh câu hỏi của bạn. – Crashalot

46

Tôi biết đây là một chủ đề cũ, nhưng tôi không thấy bất cứ nơi nào ở đây bất kỳ ví dụ về URL đã bị gây ra vấn đề gốc. Tôi đã gặp phải một vấn đề tương tự như bản thân mình một vài ngày trước với một ứng dụng Java. Trong trường hợp của tôi, chuỗi có dấu chấm nằm ở cuối phần tử đường dẫn của URL ví dụ.

http://myserver.com/app/servlet/test.string

Trong trường hợp này, các thư viện mùa xuân Tôi đang sử dụng chỉ đi qua tôi 'test' một phần của chuỗi đó để tham số phương pháp chú thích liên quan của lớp điều khiển của tôi, có lẽ vì nó được xử lý ' .string 'như là một phần mở rộng tập tin và tước nó đi. Có lẽ đây là cùng một vấn đề cơ bản với vấn đề ban đầu ở trên?

Dù sao, tôi đã có thể giải quyết vấn đề này đơn giản bằng cách thêm dấu gạch chéo vào URL. Chỉ cần ném cái này ra ngoài trong trường hợp nó có ích cho bất kỳ ai khác.

John

+2

cảm ơn tôi đã có cùng một vấn đề :) – bdeonovic

+2

Cảm ơn yoU! Tôi đã đập đầu vào tường với vấn đề này bằng cách sử dụng .NET WebApi2. Tôi vừa thêm dấu gạch chéo và nó sẽ bị xóa. Cảm ơn! –

+2

Hmm, điều này không hoạt động bằng cách sử dụng đường ray 3.2; các dấu gạch chéo được ăn trước (trước khi giai đoạn và sau "loại" bị tước bỏ. Bất kỳ ý tưởng? –

1

Nếu có thể, sử dụng tệp .htaccess sẽ làm cho nó thực sự tuyệt vời và dễ dàng. Chỉ cần thêm dấu \ trước dấu chấm. Một cái gì đó như: \.

2

Tôi có cùng một câu hỏi và có thể giải pháp của tôi có thể giúp người khác trong tương lai.

Trong trường hợp của tôi, url được tạo bằng javascript.Các khoảng thời gian được sử dụng để phân tách các giá trị trong url (sling selectors), do đó bản thân các bộ chọn không được phép có dấu chấm.

giải pháp của tôi là để thay thế tất cả các giai đoạn với các thực thể html như là Hình 1:

Hình 1: Giải pháp

var urlPart = 'foo.bar'; 
var safeUrlPart = encodeURIComponent(urlPart.replace(/\./g, '.')); 

console.log(safeUrlPart); // foo%26%2346%3Bbar 
console.log(decodeURIComponent(safeUrlPart)); // foo.bar 
6

Tôi đã gặp vấn đề tương tự khi .htaccess của tôi đã phá vỡ các giá trị đầu vào bằng. Vì tôi không muốn thay đổi những gì .htaccess đang làm gì tôi đã sử dụng này để sửa chữa nó:

var val="foo.bar"; 
var safevalue=encodeURIComponent(val).replace(/\./g, '%2E'); 

này làm tất cả các mã hóa tiêu chuẩn sau đó thay thế. với ascii tương đương% 2E. PHP tự động chuyển trở lại. trong giá trị $ _REQUEST nhưng .htaccess không nhìn thấy nó như là một khoảng thời gian để mọi thứ đều tốt.

+0

Thoát Javascript() cũng sẽ chuyển đổi% 2E trở về giai đoạn gốc; đây là câu trả lời hay nhất, trực tiếp nhất. – mpoplin

+0

Đối với các URL được mã hóa theo kiểu thời trang này trên trang được hiển thị ít nhất, trình duyệt giải mã các khoảng thời gian được mã hóa trở lại trước khi bạn theo các liên kết, do đó, điều này không giải quyết được vấn đề trong nhiều trường hợp. –

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