编写链接而不包括协议

时间:2012-12-05 08:43:55

标签: php html hyperlink protocols

我有一个可以在httphttps协议中查看的网站,这里的问题是链接和资产必须反映网站正在查看的协议。

一种解决方案是使用相对链接,但由于特殊原因,我不能使用相对链接,结果,我不得不寻找替代方案......

我最近了解到你可以编写一个这样的链接,以便使用当前的协议:

<a href="//www.example.net/test/">Test</a>

到目前为止,我一直在使用以下内容:

<?php

    // Get the current protocol
    $_PROTOCOL = $_SERVER['HTTPS']=='on' ? 'https://' : 'http://';

?>

<a href="<?php echo $_PROTOCOL; ?>www.example.net/test/">Test</a>

虽然第一个解决方案有效,但我最近才发现它不熟悉它是如何工作的以及它是否可靠。我知道旧的浏览器可能不喜欢它,但这并不会让我感到困扰,因为它只是非常古老的浏览器(显然)。

当我尝试为我的某个网站生成站点地图时,网址的编写方式非常奇怪:

http://beta.example.net///venue/

而不是

http://beta.example.net/venue/

这是为什么?这是因为我使用的链接吗?

我的原始(PHP)解决方案是否更好,尽管需要大量的代码?

3 个答案:

答案 0 :(得分:3)

您可以在任何想要使用常规URL的地方使用“//example.net”,它是符合标准§4.2的格式。 RFC 3986。


但是,如果您仍想以干净的方式更改网址的方案,则可以使用http_build_url

http://php.net/manual/en/function.http-build-url.php

像这样:

http_build_url("http://yoururl.org", array('scheme'=>'https')); // changes to https://

答案 1 :(得分:0)

站点地图中的错误链接是因为生成器错误。最佳解决方案是更新站点地图生成器以使其正常工作。简单的解决方案是使用$ protocol。

答案 2 :(得分:0)

您没有提供能够重现您所描述的问题的代码,其中链接显示了额外的斜杠。我的猜测是您正在使用的代码尝试组装整个URI,并且在您连接的部分中有尾随/前导斜杠。

$ _SERVER ['HTTPS']变量不保证设置为“on”,只是为了让您知道已定义的行为。它只是设置为非假值according to the manual,但这不应该是您在此处提供的代码中的问题。

使用协议相对URL绝对比让PHP为每次请求重建URI而进行额外工作更可取,并且也容易出错。我建议使用您认为需要的协议相对URL,但一般来说,建议您从头开始构建您的站点,或者使用HTTPS。协议相对URL可能仍会导致某些浏览器(例如IE)发出警告或通知用户该页面的SSL已损坏。

当您需要安全转移时,您希望始终检查这些内容并彻底测试它们。很容易意外地滑入http://foobar.com/img.jpg或无意中通过HTTP而不是HTTPS发送AJAX请求,并且突然显示该页面的SLL图标在用户的浏览器中被破坏。