Php 写入不包含协议的链接
我有一个网站,可以在Php 写入不包含协议的链接,php,html,hyperlink,protocols,Php,Html,Hyperlink,Protocols,我有一个网站,可以在http和https协议中查看,这里的问题是链接和资产必须反映网站正在查看的协议 一个解决方案是使用相对链接,但由于特殊原因,我不能使用相对链接,结果,我不得不找到一个替代方案 我最近了解到,为了使用当前协议,您可以编写这样的链接: <a href="//www.example.net/test/">Test</a> 而不是 http://beta.example.net/venue/ 为什么会这样?这是因为我使用的链接吗 我的原始(PHP)解决方
http
和https
协议中查看,这里的问题是链接和资产必须反映网站正在查看的协议
一个解决方案是使用相对链接,但由于特殊原因,我不能使用相对链接,结果,我不得不找到一个替代方案
我最近了解到,为了使用当前协议,您可以编写这样的链接:
<a href="//www.example.net/test/">Test</a>
而不是
http://beta.example.net/venue/
为什么会这样?这是因为我使用的链接吗
我的原始(PHP)解决方案更好吗?尽管有大量代码可以使用?你可以在任何你想使用常规URL的地方使用“//example.net”,这是一种符合标准§4.2的格式。RFC 3986
但是,如果仍然希望以干净的方式更改URL的方案,可以使用
http\u build\u URL
:
像这样:
http_build_url("http://yoururl.org", array('scheme'=>'https')); // changes to https://
站点地图中的错误链接是因为生成器错误。最好的解决方案是更新站点地图生成器,使其正常工作。简单的解决方案是使用$protocol。您没有提供代码来重现您描述的问题,这些链接显示了额外的斜杠。我猜您正在使用的代码试图组装整个URI,并且在连接的部分中有尾随/前导斜杠 $_SERVER['HTTPS']变量不能保证设置为“on”,只是为了让您了解定义的行为。它只是被设置为一个非false值,但在这里提供的代码中,这不应该是一个问题 使用与协议相关的URL肯定比让PHP为每个请求重新构建URI做额外的工作更可取,而且容易出错。我建议在您认为需要的地方使用协议相关URL,但一般来说,建议您从头开始构建站点,使用HTTPS或不使用HTTPS。协议相关URL仍然可能导致某些浏览器(例如IE)发出警告或通知用户页面的SSL已断开
当您需要安全传输时,您希望始终检查这些内容并彻底测试它们。很容易无意中插入一个或无意中通过HTTP而不是HTTPS发送一个AJAX请求,突然该页面的SLL图标在用户浏览器中被破坏。最好使用“//example.net/test”。甚至谷歌的CDN也使用这种格式,所以你可以确定它能在所有浏览器中工作。你的php解决方案有什么问题?我唯一要更改的是将
协议存储为常量而不是变量,这样您就可以跨站点的不同范围使用它,这样定义(“协议”,$\u服务器[“HTTPS”]=“on”?“HTTPS”:“http”)
@YaronUliel我的PHP解决方案没有问题,但是HTML解决方案更简单,需要的代码更少。我不想为我网站中的每个链接都编写echo$\u协议
!!关于使用常量的建议是好的,尽管如此+1:-)我认为你在悄悄地夸大了实现它所需的代码量-这并不是说你不需要编写链接。是的,我完全同意你的观点,基于客户端的解决方案(如果它符合你的要求的话)会更好。我只是告诉你如何以一种简单的方式改变方案,比做一个简单的工作要省力。你可以使用“//example.net”很好,谢谢你,请你修改你的答案,加入关于//example.net
的信息,因为这是我感兴趣的:-)编辑由网站地图生成的URL不是问题,我需要一秒钟。我只是想知道使用PHP
还是使用HTML方法更好?产生wierd链接的代码就在那里<代码>`就这么简单。站点地图生成器很可能已损坏。我不认为服务器变量是可靠的,这也是我问这个问题的原因之一,代码本身不会导致您描述的结果,不。您的问题可能在其他地方表现出来。请自己尝试,转到并输入带有这些链接的url!这也可能与.htaccess
重写有关。我不知道您正在使用某些第三方工具生成这些URL,问题中也没有提到这一点。我的假设是您使用的是上面演示的PHP代码,它不会重现这个问题。我也看不出使用您提供的链接是如何产生问题的。因此,没有足够的信息让我重现这个问题并帮助您调试它。别担心,我不需要调试它,我只是想确保生成坏链接的不是我的页面,这似乎是事实,所以我不担心:-)
http://beta.example.net/venue/
http_build_url("http://yoururl.org", array('scheme'=>'https')); // changes to https://