4

我有一个可以在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)解决方案是否更好,尽管需要大量代码?

4

3 回答 3

3

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


但是,如果您仍想以干净的方式更改 URL 的方案,您可以使用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://
于 2012-12-05T08:50:02.620 回答
0

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

于 2012-12-05T08:52:44.160 回答
0

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

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

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

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

于 2012-12-05T09:04:25.267 回答