我正在为我拥有的项目使用codeigniter框架,但我有一个我无法解决的小问题。我想从视图中分离css样式和js脚本,所以我把它们分别放在单独的文件夹,/css和/js中,两者都在我项目的根文件夹中的资产文件夹中。整体结构如下:
/项目文件夹
——/应用程序
——/系统
——/资产
--------/css
--------/js
——index . php
现在,我有一个名为MyLibrary的控制器它有一个名为newentry的方法,当它被调用时,它会加载newentry视图
<?php
class MyLibrary extends CI_Controller
{
public function newentry()
{
//The upload form
$this->load->view('newentry');
}
}
newentry视图是一个简单的上传表单,使用style.css和script.js进行样式和验证等。我使用codeigniter的base_url()方法来包含上述文件的路径和文件名。
<html>
<head>
<link rel="stylesheet" type="text/css" href="<?php echo base_url();?>assets/css/style.css">
<title><?php echo $title; ?></title>
</head>
<body>
<form class = "dropezone" action = 'upload' method = 'POST' enctype = 'multipart/form-data'>
<input type="file" name="document" />
<input type="submit"/>
</form>
</body>
</html>
这一行是我遇到问题的地方:href = "资产/css/style.css ">
生成的字符串是正确的路径,即localhost/project-name/assets/css/styles.css,但是,请求被发送到这个url:
http://localhost/project-name/MyLibrary/localhost/test-pages/assets/css/style.css
当然不是文件所在的位置。有人知道为什么会这样吗?
还有,如何解决这个问题?我应该手工添加一条路线吗?如果是这样,如何使一个控制器服务静态文件?
试试用这种方式链接你的样式表
<link rel="stylesheet" href="<?php echo base_url('assets/css/style.css');?>">
我已经弄清楚为什么请求没有发送到正确的url。所以,不,这不是关于添加协议方案。It has to do with how user agents calculate the base url
。让我解释一下:
当我们在HTML中使用链接标记时,我们指定了href属性,这是一个URI。如果是绝对路径,那就没有问题了,资源只是被取走了,然而,相对路径有个小问题,就像我用的那个。你看,用户代理或浏览器是通过程序将href附加到基础url计算基础url有不同的方式,W3C是这样说的
用户代理必须计算基本URI来解析相对URI根据[RFC1808],第3节。下面描述了如何[RFC1808]特别适用于HTML。
用户代理必须按照以下方法计算基本URI优先级(优先级从高到低):
- base URI是由base元素设置的。
- 基本URI由在协议交互期间发现的元数据给出,例如HTTP头(参见[RFC2616])。
- 默认情况下,基本URI是当前文档的URI。并不是所有的HTML文档都有一个基本URI(例如,可能会出现一个有效的HTML文档)在电子邮件中,可能不是由URI指定的)。这样的HTML文档如果它们包含相对uri并依赖于
所以,在阅读了这篇文章之后,解决方案很简单,我只需要指定要使用的基础url,在HTML文档中使用基础标签,像这样:
<html>
<head>
<title>Home Page - wellcom</title>
<base href = "<?php echo base_url(); ?>">
<link rel="stylesheet" type="text/css" href="assets/css/style.css">
</head>
<body>
<h3>HANIX</h3>
</body>
</html>
效果很好
无论如何,谢谢你的回复,我希望这个答案能对别人有所帮助。