2011-11-29 29 views
18

Chúng ta đều quen thuộc với đường dẫn tương đối: Đường dẫn tương đối đến ./images/hello.jpg từ http://www.domain.com/hey liên kết đến http://www.domain.com/hey/images/hello.jpg.Đường dẫn tương đối, nhưng đối với Cổng?

Sự cố: Làm cách nào để chỉ ra đường dẫn tương đối đến http://www.domain.com:1234 khi bạn ở http://www.domain.com/hey?

+0

Tôi không nghĩ rằng bạn có thể. Cổng có hiệu quả là một phần của tên miền trong ngữ cảnh này. Bằng cách chỉ định tên miền không có cổng (không sử dụng liên kết tương đối), về cơ bản bạn cung cấp miền _different_. –

+1

Xem thêm http://stackoverflow.com/q/6016120/60075 –

Trả lời

20

Điều này có thể đạt được bằng cách sử dụng JavaScript bằng cách đặt thuộc tính window.location.port.

<a href="#" onclick="javascript:window.location.port=8080">go</a> 
+0

chắc chắn ... nhưng chỉ bằng JavaScript. Cố gắng tạo một đường dẫn StyleSheet tương đối ví dụ –

+0

Không chắc chắn 100% ngữ cảnh nào được áp dụng, nhưng với câu hỏi tôi đoán bạn cũng có thể phục vụ CSS từ cùng một cổng. Sau đó, đường dẫn tương đối sẽ là tương đối. – peterp

+0

@Julien: Đoán giả định bối cảnh của tôi là chính xác. – peterp

2

Câu trả lời đơn giản: không thể. Bạn cần sử dụng đường dẫn tuyệt đối nếu máy chủ thay đổi.

18

Bạn không thể thay đổi bất kỳ phần nào của quyền (ví dụ: các host: phần cổng) trong URL tương đối. Xem thuật toán được mô tả trong section 5.2.2 của RFC 3986 để xem cách URL tương đối được diễn giải. Điều quan trọng cần lưu ý là quyền hạn được sao chép đơn giản từ URL cơ sở hoặc từ URL đang được giải quyết và cấu trúc của cơ quan không bao giờ được diễn giải. Điều này ngụ ý rằng bạn không thể thay đổi bất kỳ phần nào của nó, bao gồm cả phần cổng.

Dưới đây là các thuật toán mã giả hay sao chép từ RFC:

-- The URI reference is parsed into the five URI components 
    -- 
    (R.scheme, R.authority, R.path, R.query, R.fragment) = parse(R); 

    -- A non-strict parser may ignore a scheme in the reference 
    -- if it is identical to the base URI's scheme. 
    -- 
    if ((not strict) and (R.scheme == Base.scheme)) then 
    undefine(R.scheme); 
    endif; 

    if defined(R.scheme) then 
    T.scheme = R.scheme; 
    T.authority = R.authority; 
    T.path  = remove_dot_segments(R.path); 
    T.query  = R.query; 
    else 
    if defined(R.authority) then 
     T.authority = R.authority; 
     T.path  = remove_dot_segments(R.path); 
     T.query  = R.query; 
    else 
     if (R.path == "") then 
      T.path = Base.path; 
      if defined(R.query) then 
       T.query = R.query; 
      else 
       T.query = Base.query; 
      endif; 
     else 
      if (R.path starts-with "/") then 
       T.path = remove_dot_segments(R.path); 
      else 
       T.path = merge(Base.path, R.path); 
       T.path = remove_dot_segments(T.path); 
      endif; 
      T.query = R.query; 
     endif; 
     T.authority = Base.authority; 
    endif; 
    T.scheme = Base.scheme; 
    endif; 

    T.fragment = R.fragment; 
+0

Cảm ơn bạn đã trả lời dứt khoát về vấn đề này! –

-5

Đơn giản chỉ cần bạn có thể viết trong thuộc tính href:

/:port/[path/]file.ext 
Các vấn đề liên quan