如何在 codeigniter 中路由请求,以便我们可以提供静态 css、js 和 img 文件?

Posted

技术标签:

【中文标题】如何在 codeigniter 中路由请求,以便我们可以提供静态 css、js 和 img 文件?【英文标题】:How to route requests in codeigniter so we can serve static css, js and img files? 【发布时间】:2016-11-04 19:13:23 【问题描述】:

我正在为我的一个项目使用 codeigniter 框架,但我有一个小问题我无法解决。我想将 css 样式和 js 脚本与视图分开,所以我将它们分别放在单独的文件夹中,/css 和 /js 都位于我项目根文件夹中的 assets 文件夹中。整体结构是这样的:

/项目文件夹

----/应用程序

----/系统

----/资产

--------/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="assets/css/style.css">

生成的字符串是正确的路径,意思是 localhost/project-name/assets/css/styles.css,但是,请求会发送到这个 url:

http://localhost/project-name/MyLibrary/localhost/test-pages/assets/css/style.css

当然,不是文件所在的位置。有谁知道为什么会这样?

另外,如何解决这个问题?我应该手动添加路线吗?如果是这样,如何制作一个提供静态文件的控制器?

【问题讨论】:

base_url 是否设置在 config.php 中? 是的,是这样设置的:$config['base_url'] = 'localhost/test-pages/'; 尝试像这样将协议添加到 base_url:`$config['base_url'] = 'localhost/test-pages';` $config['base_url'] 应由'http://localhost/test-pages/' 分配。也需要协议方案。 【参考方案1】:

以这种方式尝试您的样式表链接

<link rel="stylesheet" href="<?php echo base_url('assets/css/style.css');?>">

【讨论】:

【参考方案2】:

我已经弄清楚为什么没有向正确的 url 发出请求。所以不,这与添加协议方案无关。 It has to do with how user agents calculate the base url。让我解释一下:

当我们在 HTML 中使用链接标签时,我们指定 href 属性,它是一个 URI。现在,如果它是绝对路径,真的没有问题,只是获取资源,但是,相对路径有一点问题,就像我使用的那样。您会看到,用户代理或浏览器被编程为将该 href 附加到基本 url,并且他们计算基本 url 的方式有不同,here's what W3C has to say:

用户代理必须计算基本 URI 以解析相对 URI 根据 [RFC1808],第 3 节。以下描述如何 [RFC1808] 专门适用于 HTML。

用户代理必须根据以下公式计算基本 URI 优先级(从高到低):

    基本 URI 由 BASE 元素设置。 基本 URI 由在协议交互期间发现的元数据给出,例如 HTTP 标头(参见 [RFC2616])。 默认情况下,基本 URI 是当前文档的基本 URI。并非所有 HTML 文档都有一个基本 URI(例如,一个有效的 HTML 文档可能会出现 在电子邮件中,并且不能由 URI 指定)。此类 HTML 文档 如果它们包含相对 URI 并依赖于 默认基础 URI。

所以,看完这篇文章,解决方法很简单,我只需要在带有 base 标签的 HTML 文档中指定要使用的 base url,如下所示:

<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>

它就像魔术一样工作。

无论如何,谢谢您的回复,希望这个回答对其他人有所帮助。

【讨论】:

以上是关于如何在 codeigniter 中路由请求,以便我们可以提供静态 css、js 和 img 文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 CodeIgniter 中重新路由页面时如何防止重复内容?

CodeIgniter - 如何在 url 路由中删除类名

我如何路由到控制器并在 codeigniter 中运行?

如何创建不覆盖其他控制器路由的 Codeigniter 路由?

Codeigniter路由:如何在url中显示名称而不是id号

如何在 CodeIgniter 中为 Laravel 中的第一个项目定义子域路由?