1

我有我的routes.php作为

$route['home'] = 'pages/home';
$route['login'] = 'pages/login';
$route['default_controller'] = 'pages/home';

和控制器pages.php作为

class Pages extends CI_Controller {

    public function home() {
        $this->load->view('templates/header');
        $this->load->view('pages/home');
        $this->load->view('templates/one');
        $this->load->view('templates/two');
        $this->load->view('templates/footer');
        }

    public function login() {
         //if ( ! file_exists('application/views/templates/'.$page.'.php')) {
     //     echo "no file";
     //   }
     //  $data['title'] = ucfirst($page);
        $this->load->view('templates/header');
        $this->load->view('templates/login');
        $this->load->view('templates/footer');
        }
    }

上一篇:我刚开始使用 CodeIgniter,我从基本教程中得到的,在阅读了许多 stackoverflow 答案后,调用domain/login将根据路由规则路由function loginPages class(控制器)$route['login'] = 'pages/login';

问题:这个简单的代码显示 404 错误。我不明白为什么会这样,因为所有文件都存在于模板文件夹中。对域的正常调用也可以正常工作,但如果我调用domain/home,我再次收到 404 错误。请帮助我做错了什么。

4

2 回答 2

1

所以我对 CodeIgniter 也有点陌生,所以我很抱歉在这方面做得这么慢。您面临的问题是您没有放入 index.php。您的 URL 必须是 domain/index.php/login。如果您不想将 index.php 添加到每个调用中,则必须执行以下操作:

  1. 在你的应用程序文件夹中添加一个 .htaccess 文件,让它看起来像这样:

    <IfModule mod_rewrite.c>
    
        # activate URL rewriting
        RewriteEngine on
    
        # the folders mentioned here will be accessible and not rewritten
        RewriteCond $1 !^(resources|system|application|ext)
    
        # do not rewrite for php files in the document root, robots.txt or the maintenance page
        RewriteCond $1 !^([^\..]+\.php|robots\.txt)
    
        # but rewrite everything else
        RewriteRule ^(.*)$ index.php/$1 [L]
    </IfModule>    
    <IfModule !mod_rewrite.c>
    
        # If we don't have mod_rewrite installed, all 404's
        # can be sent to index.php, and everything works as normal.
    
        ErrorDocument 404 index.php
    
    </IfModule> 
    
  2. 打开 mode_rewrite ( How to enable mod_rewrite for Apache 2.2 or https://askubuntu.com/questions/48362/how-to-enable-mod-rewrite-in-apache )

  3. 重启你的服务器

这会将所有域/登录请求转发到您的前端控制器(index.php)。RewriteCond $1 !^(resources|system|application|ext)行将允许您使某些文件夹不被重写。因此,如果您在应用程序下有一个名为“resources”的文件夹,而不是将其转发到 domain/index.php/resources,它只会转到 domain/resources。

实际上没有 .htaccess 文件的过程是这样的:

  1. 检查 URI 中的 domain/front_controller/route 模式并查看路由是否存在并正确转发

通过进行域/登录,您没有遵循该模式,因此发送了 404。将 front_controller (index.php) 添加到 URI 使其遵循路由模式并转发到您的路由配置。

有些人认为他们的 URI 中的前端控制器“丑陋”,所以他们添加了一个 mod_rewrite,基本上每次访问该目录时都会将 front_controller 添加到 URI 中。这样他们就可以坚持域/控制器/操作。这也被认为更安全,因为唯一可以直接访问的目录是重写中特别说明的目录。

于 2013-09-24T18:59:14.710 回答
1

现在明白了 !

  1. 实际上定义

    base_url = 'mysite.com'

    inconfig.php仅适用于调用default_controllerin 路由规则,因此您的 while mysite.com调用将正常工作并向您显示主页,*解释 default_controller* 路由规则,但对mysite.com/xyz的任何调用都将失败,即使您有主控制器中的函数 xyz,路由规则为$route['xyz'] = 'pages/home'

    其余所有 URL 调用都必须作为

    domain/index.php/controller/function/arg,

  2. 正如@Bill Garrison 和codeigniter 的开发人员用户指南.htaccess所建议的那样,应该在从域名中删除index.php 的规则中编写规则,然后路由器的url 将正常工作!

对于阅读的人来说,一个重要的建议是在提出疑问之前彻底阅读文档。:)

于 2013-09-25T18:10:46.450 回答