2011-01-22 34 views
31

Tại sao Javascript xử lý các URL tương đối khác với HTML chuẩn? Hãy nghĩ đến URL sau (hoặc chỉ duyệt qua URL): http://en.wikipedia.org/wiki/Rome. Mở Firebug console (hoặc một bảng điều khiển Javascript) và nhập như sau:Các URL tương đối trong các yêu cầu AJAX

var x = new XMLHttpRequest(); 
x.open("GET", "foo", true); 
x.send("bar"); 

Theo hệ thống của tôi yêu cầu được gửi tới "http://en.wikipedia.org/wiki/foo". "Rome" trong URL chỉ đơn giản là bỏ qua. Yêu cầu tương tự với dấu gạch chéo ở URL ("http://en.wikipedia.org/wiki/Rome/") gắn thêm "foo" vào URL đầy đủ.

Điều này có vẻ khiến việc mã hóa URL chính xác trong Javascript trở nên khó khăn. Có bất kỳ thư viện Javascript nào giúp khắc phục vấn đề này không?

(Tôi hỏi một tương tự question trước đây, nhưng hơn jQuery cụ thể, nơi này cũng sẽ xảy ra. Tôi hy vọng tôi nhận được một câu trả lời tốt hơn với câu hỏi độc lập có phần thư viện hơn này.)

+0

@Zardoz Bạn có thể gửi liên kết để mà khác câu hỏi tương tự? –

+0

Tất nhiên ... Tôi cũng đã chỉnh sửa văn bản có liên kết đến câu hỏi đó: http://stackoverflow.com/questions/4754559/relative-url-does-not-get-resolved-correctly-by-jquery – Zardoz

+2

@Zardoz Liên kết hoạt động theo cùng một cách. Nếu URL trang là hxxp: //en.wikipedia.org/wiki/Rome và trên trang là neo này: '', thì nhấp vào liên kết sẽ mở URL này: hxxp: // en.wikipedia.org/wiki/foo –

Trả lời

51

(cập nhật để làm cho nó dễ đọc hơn)

Đây là cách đường dẫn tương đối được cho là hoạt động.

Giả vờ rằng địa chỉ hiện tại là thế này:

Absolute:protocol://some.domain.name/dir1/dir2/filename


Nếu bạn chỉ định chỉ một tên tập tin mới "foo", bạn sẽ có được cùng một giao thức, máy chủ và dirs, chỉ tên tệp được thay đổi:

Tương đối:foo

Absolute:protocol://some.domain.name/dir1/dir2/foo


Nếu bạn chỉ định một con đường toàn "/ dir3/filename2" bạn nhận được cùng một giao thức và tên máy nhưng với con đường khác:

tương đối:/dir3/filename2

Tuyệt đối:protocol://some.domain.name/dir3/filename2


Bạn cũng có thể chỉ định tên máy chủ "//another.domain.name/dir5/filename3" và nhận được cùng một giao thức nhưng một máy chủ, dir và filename:

tương đối://another.domain.name/dir5/filename3

Absolute:protocol://another.domain.name/dir5/filename3


Điều gì có thể gây nhầm lẫn là một máy chủ web nội bộ có thể thêm một/ở cuối url nếu t anh ta chỉ định các điểm url vào một thư mục chứ không phải một tệp.

protocol://some.domain.name/somename

Nếu "somename" là một thư mục máy chủ web có thể dịch nó để (có thể với một chuyển hướng)

protocol://some.domain.name/somename/


CẬP NHẬT

Như cameron nói trong một bình luận: Để tham khảo, hãy xem bước 6 trong giây tion 4 của RFC 1808

+2

Để tham khảo, hãy xem bước 6 trong phần 4 của [RFC 1808] (http://www.ietf.org/rfc/rfc1808.txt) – Cameron

+0

@Cameron : Tuyệt quá! Thêm nó vào câu trả lời. – some

0

Hình như http://code.google.com/p/js-uri/ là thư viện và lựa chọn thao tác URL nói chung và loại hình này tính toán tuyệt đối-to-tương đối đặc biệt:

new URI(potentiallyRelativeLink).resolve(new URI(window.location.href)).toString() 
Các vấn đề liên quan