2011-11-29 11 views
18

Wszyscy znamy ścieżki względne: Ścieżka względna do ./images/hello.jpg z http://www.domain.com/hey łączy do łączy do .Względna ścieżka, ale w przypadku portu?

Jak określić względną ścieżkę do http://www.domain.com:1234, gdy jesteś na http://www.domain.com/hey?

+0

Nie sądzę, jest to możliwe. Port jest faktycznie częścią nazwy domeny w tym kontekście. Określając nazwę domeny bez portu (nie używając relatywnego łącza), zasadniczo dostarczasz domenę _różną_. –

+1

Zobacz także http://stackoverflow.com/q/6016120/60075 –

Odpowiedz

20

Można to osiągnąć za pomocą JavaScript, ustawiając właściwość window.location.port.

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

na pewno ... ale tylko w JavaScript. Spróbuj utworzyć relatywną ścieżkę StyleSheet dla przykładu –

+0

Nie jesteś w 100% pewny, który kontekst dotyczy pytania, ale biorąc pod uwagę pytanie, domyślam się, że możesz również obsługiwać CSS z tego samego portu. Następnie względne ścieżki będą względne. – peterp

+0

@Julien: Domyślam się, że moje założenie było prawidłowe. – peterp

2

Prosta odpowiedź: nie jest możliwa. Musisz użyć bezwzględnej ścieżki, jeśli zmienia się host.

18

Nie można zmieniać dowolną część organu (tj host: port część) względnych adresów URL. Zobacz algorytm opisany w section 5.2.2 z RFC 3986, aby zobaczyć, jak interpretowane są adresy URL względne. Ważne jest, aby zauważyć, że autorytet jest po prostu kopiowany z podstawowego adresu URL lub z adresu URL, który jest rozwiązywany, a struktura organu nigdy nie jest interpretowana. Oznacza to, że nie można zmienić żadnej z jej części, w tym części portu.

Oto algorytm w pseudo-kodzie kopiowane z 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

Dzięki za ostateczną odpowiedź na ten temat! –

-5

Wystarczy można napisać w atrybucie href:

/:port/[path/]file.ext 
Powiązane problemy