2011-11-29 6 views
18

Tutti conosciamo i percorsi relativi: un percorso relativo a ./images/hello.jpg da http://www.domain.com/hey collegamenti a http://www.domain.com/hey/images/hello.jpg.Percorso relativo, ma per Porto?

Problema: Come si stato un percorso relativo alla http://www.domain.com:1234 quando sei a http://www.domain.com/hey?

+0

Non credo che si può. La porta fa effettivamente parte del nome di dominio in questo contesto. Specificando il nome del dominio senza la porta (non usando un collegamento relativo) si fornisce fondamentalmente un dominio _differente_. –

+1

Vedi anche http://stackoverflow.com/q/6016120/60075 –

risposta

20

Questo può essere ottenuto utilizzando JavaScript impostando la proprietà window.location.port.

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

sicuro ... ma solo in JavaScript. Prova a creare un percorso StyleSheet relativo, ad esempio –

+0

Non sicuro al 100% del contesto in cui si applica la domanda, ma vista la domanda, suppongo che potresti anche servire il CSS dalla stessa porta. Quindi i percorsi relativi saranno relativi. – peterp

+0

@ Julien: Suppongo che la mia ipotesi di contesto sia corretta. – peterp

2

Risposta semplice: non possibile. È necessario utilizzare un percorso assoluto se l'host cambia.

18

Non è possibile modificare qualsiasi parte dell'autorità (vale a dire la host: port parte) negli URL relativi. Vedere l'algoritmo descritto in section 5.2.2 di RFC 3986 per vedere come vengono interpretati gli URL relativi. È importante notare che l'autorità viene semplicemente copiata dall'URL di base o dall'URL che viene risolto e la struttura dell'autorità non viene mai interpretata. Ciò implica che non è possibile modificare nessuna delle sue parti, inclusa la parte della porta.

Ecco l'algoritmo in pseudo-codice copiato dal 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

Grazie per una risposta definitiva su questo problema! –

-5

Semplicemente si può scrivere in href:

/:port/[path/]file.ext