【问题标题】:Redirect to Controller results 404 Page Not Found重定向到控制器结果 404 页面未找到
【发布时间】:2020-07-31 06:12:10
【问题描述】:

我正在使用 Laragon 作为本地服务器在 Codeignitor 中创建一个 Web 应用程序。当我尝试“重定向”到控制器时 - 我得到“404 Page Not Found”。如果我重定向到 View - 它可以工作。我可以使用“表单打开”等其他方法访问控制器。

这是我的 .htaccess 文件:

    RewriteEngine on
    RewriteCond $1 !^(index\.php|assets|images|js|css|uploads|favicon.png)
    RewriteCond %(REQUEST_FILENAME) !-f
    RewriteCond %(REQUEST_FILENAME) !-d
    RewriteRule ^(.*)$ index.php/$1 [L]

这是我的控制器 - 对于我使用重定向到视图“页面登录”和控制器“私人区域”的测试。我可以访问视图,但控制器发送到 404 Page Not Found。

if($this->form_validation->run()){
    $result = $this->login_model->can_login($this->input->post('user_email'), $this->input->post('user_password'));
    if($result == ''){
        redirect('private_area');
    }
    else {
        $this->session->set_flashdata('message', $result);
        redirect('page-login');

仅供参考,我可以使用其他方法(例如 Form Open)访问控制器(在本例中为“注册”),如下所示:

<?php echo form_open('register/validation'); ?> 

为什么会出现 404 错误?

【问题讨论】:

  • 您对路由、控制器和视图的概念感到困惑。如果你明白这一点,它会变得更清楚。您不会重定向到控制器或视图 - 您会重定向到 routes。同样form_open() 不将控制器作为参数,而是将路由。 The intro tutorial,和the routes documentation,描述的很好。
  • 您在重定向功能中提到了 private_area,而您提到了控制器名称 Private-area。两者是不同的。您应该重定向到私人区域。
  • 谢谢@Don'tPanic!你搞定了。我想我解决了我的问题 - 请参阅下面的答案。干杯!

标签: php .htaccess codeigniter laragon


【解决方案1】:

您的重定向语法不正确:

CI function redirect() 的结构如下:

redirect($uri = '', $method = 'auto', $code = NULL)

请记住使用相对路径,例如 '/my_controller/my_function'

如本例所示:

redirect('/login/form/');

您需要自动加载/加载 URL 助手:$this-&gt;load-&gt;helper('url');

form_open() 语法正确,您需要自动加载/加载表单助手:$this-&gt;load-&gt;helper('form');

【讨论】:

    【解决方案2】:

    redirect()函数

    “标头重定向”到指定的 URI。如果您指定将构建链接的完整站点 URL,但对于本地链接,只需将 URI 段提供给您要定向到的控制器即可创建链接。该函数将根据您的配置文件值构建 URL。 (-source)

    所以,url必须是

    redirect("/controller/method/parameters");
    

    或完整的网址

    在您的代码中,Codeigniter 将查找 private_area 控制器的 index() 方法。

    【讨论】:

      【解决方案3】:

      谢谢大家!

      所以我认为@Don'tPanic 做到了。我认为“重定向”会指向一个控制器——但它指向一个路由。所以我在我的 Routes.php 文件中创建了一个路由

      $route['private_area'] = 'private_area';
      

      一切正常。这是正确的做法吗?

      即在 Routes.php 文件中定义路由...然后根据需要使用“重定向”调用它们?

      【讨论】:

      • 您不需要为此创建路由。 redirect('/private_area') 没有它也应该可以工作,它指向控制器 private_area() 及其函数 index()
      • @Vickel 但事实并非如此。但是,当我输入redirect('private_area/index') 时,它确实可以工作....我不知道为什么它需要定义函数 index() 因为它应该默认为...不应该吗?
      • 这取决于您的 base_url 设置,文档说 redirect() 对指定的 URI 执行“标头重定向”。如果您指定将构建链接的完整站点 URL,但对于本地链接,只需将 URI 段提供给您要定向到的控制器即可创建链接。该函数将根据您的配置文件值构建 URL。
      • 正如我在评论中链接到的文档中所述,设置映射到/[controller-class]/[controller-method]/[arguments] 的路由是一种标准的 MVC 模式。如果您没有路由,CI 将尝试使用此模式猜测要做什么。所以严格来说,如果你的路由段完全映射到相应的控制器和方法,你就不需要路由。但是添加它们并不难,您最终会对哪些路线映射到哪里有一个清晰、有据可查的理解——这是更好的做法。
      猜你喜欢
      • 1970-01-01
      • 2019-04-26
      • 2013-10-04
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2013-03-31
      • 2020-10-03
      • 1970-01-01
      相关资源
      最近更新 更多