我有一个可以在http
和https
协议中查看的网站,这里的问题是链接和资产必须反映网站正在查看的协议。
一种解决方案是使用相对链接,但由于特殊原因,我不能使用相对链接,结果,我不得不寻找替代方案......
我最近了解到你可以编写一个这样的链接,以便使用当前的协议:
<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)解决方案是否更好,尽管需要大量的代码?
答案 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图标在用户的浏览器中被破坏。