超链接中不同端口号的相对URL?

如果我不知道主机名,有没有一种方法没有Javascript /服务器端脚本链接到同一个盒子上的不同的端口号?

例如:

<a href=":8080">Look at the other port</a> 

(这个例子不起作用,因为它会把8080当作我想要导航的string)

如果这能够工作,这将是很好的,我不明白为什么不这样做,因为:是URI组件内的端口分隔的保留字符,所以浏览器可以真实地将其解释为相对于此URL的端口,但不幸的是,没有办法做到这一点。

因此,您将需要使用Javascript才能做到这一点。

 // delegate event for performance, and save attaching a million events to each anchor document.addEventListener('click', function(event) { var target = event.target; if (target.tagName.toLowerCase() == 'a') { var port = target.getAttribute('href').match(/^:(\d+)(.*)/); if (port) { target.href = port[2]; target.port = port[1]; } } }, false); 

在Firefox 4中testing

小提琴: http : //jsfiddle.net/JtF39/79/


更新 :修复了将端口附加到url结尾的错误,并且还添加了对相对和绝对url的支持:

 <a href=":8080/test/blah">Test absolute</a> <a href=":7051./test/blah">Test relative</a> 

这些怎么样:

点击时修改端口号:

 <a href="/other/" onclick="javascript:event.target.port=8080">Look at another port</a> 

但是,如果将鼠标hover在链接上,则不会显示包含新端口号的链接。 直到你点击它才添加端口号。 另外,如果用户在链接上单击右键并select“复制链接位置”,则他们将获得没有端口号的未修改的URL。 所以这并不理想。

这里有一个方法可以在页面加载后立即更改URL,所以hover在链接上或执行“复制链接位置”将会获取带有端口号的更新后的URL:

 <html> <head> <script> function setHref() { document.getElementById('modify-me').href = window.location.protocol + "//" + window.location.hostname + ":8080/other/"; } </script> </head> <body onload="setHref()"> <a href="/other/" id="modify-me">Look at another port</a> </body> </html> 

您可以使用document.write轻松完成,并且将鼠标hover在其上时,URL将正确显示。 您也不需要使用此方法的唯一ID,它适用于Chrome,FireFox和IE。 由于我们只引用variables而不加载任何外部脚本,因此在这里使用document.write不会影响页面加载性能。

 <script language="JavaScript"> document.write('<a href="' + window.location.protocol + '//' + window.location.hostname + ':8080' + window.location.pathname + '" >Link to same page on port 8080:</a> ' ); </script> 

没有JavaScript,你将不得不依靠一些服务器端脚本。 例如,如果您使用ASP,像…

 <a href="<%=Request.ServerVariables("SERVER_NAME")%>:8080">Look at the other port</a> 

应该pipe用。 但是,确切的格式将取决于您使用的技术。

修改鼠标hover的端口号:

 <a href="/other/" onmouseover="javascript:event.target.port=8080">Look at another port</a> 

这是https://stackoverflow.com/a/13522508/1497139的改进,它没有正确显示链接的缺点。;

摔跤后,我发现实际上,SERVER_NAME是一个保留的variables。 所以,如果你在页面上(www.example.com:8080),你应该可以删除8080并调用另一个端口。 例如,这个修改后的代码只是为我工作,并将我从任何基础端口移动到端口8069(根据需要replace您的端口)

 <div> <a href="http://<?php print $_SERVER{'SERVER_NAME'}; ?>:8069"><img src="images/example.png"/>Example Base (http)</a> </div> 

无需复杂的javascript:只需在锚点后插入一个脚本节点,然后在javascript中获取节点,并使用window.location.origin方法修改其href属性。

  <a id="trans">Look at the other port</a> <script> document.getElementById('trans').href='http://'+window.location.origin+':8081'; </script> 

id属性必须是唯一的页面范围,因此您可能需要使用其他方法来检索节点对象。

在Linux上使用apache和Firefox进行testing。

基于加里霍尔的答案 ,但更改页面加载而不是点击url。

我想用css显示url:

 a:after { content: attr(href); } 

所以我需要将锚点的href转换为包含将被访问的实际url。

 function fixPortUrls(){ var nodeArray = document.querySelectorAll('a[href]'); for (var i = 0; i < nodeArray.length; i++) { var a = nodeArray[i]; // a -> eg: <a href=":8080/test">Test</a> var port = a.getAttribute('href').match(/^:(\d+)(.*)/); //port -> ['8080','/test/blah'] if (port) { a.href = port[2]; //a -> <a href="/test">Test</a> a.port = port[1]; //a -> <a href="http://localhost:8080/test">Test</a> } } } 

在页面加载时调用上述function。

或者在一行上:

 function fixPortUrls(){var na=document.querySelectorAll('a[href]');for(var i=0;i<na.length;i++){var a=na[i];var u=a.getAttribute('href').match(/^:(\d+)(.*)/);u&&a.href=u[2]&&a.port=u[1];}} 

(我正在使用for而不是forEach所以它在IE7中工作。)

生成url服务器端更好:

 // PHP: <a href="<?=$_SERVER['SERVER_NAME']?>:8080/index.php"> // ASP.net <a href="<%=Request.ServerVariables("SERVER_NAME")%>:8080/index.asp">