相对路径,但对于端口?

Posted

技术标签:

【中文标题】相对路径,但对于端口?【英文标题】:Relative Path, but for Port? 【发布时间】:2012-01-09 03:56:49 【问题描述】:

我们都熟悉相对路径:从http://www.domain.com/hey./images/hello.jpg 的相对路径链接到http://www.domain.com/hey/images/hello.jpg

问题:当您位于http://www.domain.com/hey 时,如何声明到http://www.domain.com:1234 的相对路径?

【问题讨论】:

我不认为你可以。在这种情况下,端口实际上是域名的一部分。通过指定不带端口的域名(不使用相对链接),您基本上提供了一个不同的域。 另见***.com/q/6016120/60075 【参考方案1】:

这可以使用 javascript 通过设置 window.location.port 属性来实现。

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

【讨论】:

当然……但仅限于 JavaScript。尝试制作一个相对的样式表路径,例如 不是 100% 确定该问题适用于哪个上下文,但考虑到这个问题,我猜您也可以从同一个端口提供 CSS。那么相对路径将是相对的。 这仅适用于href 仅包含锚点的情况。请参阅my answer to another question,它有类似的解决方案,但也适用于其他 href。即修改event.target.port而不是window.location.port【参考方案2】:

您不能更改相对 URL 中 authority 的任何部分(即 host:port 部分)。 请参阅RFC 3986 的section 5.2.2 中描述的算法,以了解如何解释相对 URL。需要注意的重要一点是,权限只是从基本 URL 或正在解析的 URL 复制而来,并且权限的结构永远不会被解释。这意味着您不能更改它的任何部分,包括端口部分。

这是从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;

【讨论】:

感谢您对此问题的明确答复!【参考方案3】:

简单的答案:不可能。 如果主机发生变化,您需要使用绝对路径。

【讨论】:

【参考方案4】:

只需在 href 属性中写:

/:port/[path/]file.ext

【讨论】:

以上是关于相对路径,但对于端口?的主要内容,如果未能解决你的问题,请参考以下文章

java 绝对路径 / 相对路径总结

相对路径和绝对路径

对于4.2日遇到问题的解答:

linxu下面的绝对路径和相对路径

2.6-2.9绝对路径和相对路径

绝对路径与相对路径解析