【问题标题】:base_url() gives wrong link if inside href attribute如果在 href 属性内,base_url() 会给出错误的链接
【发布时间】:2018-02-05 04:34:39
【问题描述】:

刚开始学习Codeigniter 3.1.7,就遇到了奇怪的事情。

我的网站安装在子目录domain.com/site1 中,但会发生以下情况:

<h1><?php echo base_url(); ?></h1>

这将打印 domain.com/site1/

<h1><a href="<?php echo base_url(); ?>">Link</a></h1>

这会生成一个 href = domain.com/site1/domain.com/site1

这怎么可能?我错过了什么?

【问题讨论】:

  • > 我错过了什么? “http://”
  • 没有返回两次。如果不指定协议或“//”,浏览器会将其视为相对 url,并自动为其添加域和路径前缀。
  • 我不认为这是愚蠢的。 @Maadinsh 应该为此提交答案,恕我直言。评论写得很好。
  • 好吧,让他这么做吧。另外,最好把 // 放在那里,这样 SSL 就无关紧要了。
  • 对; // 是自动检测其所处环境的更好方法。

标签: php codeigniter href environment


【解决方案1】:

base_url() 不会两次返回 url。 如果不指定协议,浏览器会将其视为相对链接,并自动为其添加当前域和路径的前缀。

一个正确的例子是这样的:

<h1><a href="//<?php echo base_url(); ?>">Link</a></h1>

根据 CodeIgniter 文档,看起来您也可以将协议作为第二个参数传递: https://www.codeigniter.com/user_guide/helpers/url_helper.html#base_url


注意:最好在其中使用//,这样SSL 就无关紧要了。

使用// 是更好的方法,以便自动检测它所在的环境并留在其中。

旁注:当运行旨在在安全环境中运行的脚本时,还要确保没有 http:// 对脚本、图像、css 等的引用,因为这将包含某些浏览器的混合环境会警告你。

【讨论】:

  • 您的附注与此问题无关,因为应通过正确设置 CSP header 来正确处理此问题。
  • @Martin 那是我的编辑(见修订中的评论),你为什么这么认为?
  • @FunkFortyNiner note 位是很好的建议,但旁注暗示网站管理员/情妇/订阅者需要更换所有内部http: 链接(对于这个和许多其他安全原因)他们应该简单地实现一个内容安全策略标头,其中包括一个upgrade-insecure-requests指令:-)
  • @Martin 我明白了。好吧,在良好的编码实践中,我使用// 作为基本 url,并且过去主动更改了很多。如果只需要添加该指令,那就太好了。如果您觉得旁注应该受到打击,请告诉我,我会这样做。 ;-)
  • @FunkFortyNiner 我觉得我冒犯了你的感情:-( 这不是本意。但是此 CSP 标头旨在消除手动更新所有旧 http://links 的需要。而且我确信 CSP 也在编写最佳实践 :-D
猜你喜欢
  • 2019-04-17
  • 2017-04-09
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2011-11-25
  • 2015-05-09
  • 2014-06-18
  • 2012-10-18
相关资源
最近更新 更多