将 link 定向到子文件夹视图 returns 404

Direct link to a subfolder view returns 404

我无法使用直接 link.

直接加载我的 CodeIgniter views 文件夹中子文件夹中的视图

文件夹结构如下:

my_project/
    application/
        views/
            pages/
                about.php
                about/
                    organization.php
                    history.php

我需要通过 link 访问 organization.phphistory.php,例如:

<div id="container">
    <ul>
        <li>
            <a href='<?php echo base_url('about'); ?>'>About</a>
        </li>
        <li>
            <a href='<?php echo base_url('about/organization'); ?>'>About/Organization</a>
        </li>
        <li>
            <a href='<?php echo base_url('about/history'); ?>'>About/History</a>
        </li>
    </ul>
</div>

但是我得到了 404。

我的htaccess:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /my_project/

# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteRule (.*?)index\.php/*(.*) /my_project/ [R=301,NE,L]

# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /my_project/index.php/ [L]
</IfModule>

这是我的 routes.php 指向我的默认视图控制器 Pages::view(path/to/file):

$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

$route['pages/(:any)/(:any)'] = 'pages/view//';
$route['(:any)'] = 'pages/view/';

这是我的控制器:

<?php
class Pages extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    public function view($page = 'home')
    {
        if(!file_exists(APPPATH.'views/pages/'.$page.'.php'))
        {
            show_404();
        }

        $data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
        $this->load->view('templates/header', $data);
        $this->load->view('pages/'.$page, $data);
        $this->load->view('templates/footer', $data);
    }
}

注意 每当我直接使用

$this->load->view('pages/views/about/organization');

没关系。与打印相同:

file_exists(APPPATH.'views/pages/about/organization.php');

我不知道是什么搞砸了。

我是否必须为这些子文件夹制作自定义控制器?这是我现在能想到的唯一解决方案。


注意 我也将此子文件夹(实际上是整个项目)的权限设置为 777 并且直接 link 仍然无效。


注意 我现在唯一的解决方案是为每个子文件夹制作 单独的 控制器,以便查看它们!这真的不可能只用一个控制器吗?

像 url 模式一样 my_app/controller/method 是严格的,my_app/folder/view 是不允许的,除非 folderview 对应于 controllermethod分别?


解决方案

Zeeshan did that!

Shantay,你留下来! Thank you

你是对的,我正在寻找一个 通用 方法来捕获我所有的静态页面视图请求。我们现在可以关闭此问题(我将在 20 小时内奖励赏金)。

You were the only one who understood the assignment.

我认为 CodeIgniter 的 URI 模式是严格的 controller/method 并且不喜欢 subfolder/view_file

我刚刚使用方法 organizationhistoryAbout 创建了一个控制器,它将显示该页面。

<?php
class About extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
        $this->load->helper('url');
    }

    function organization($page = 'organization')
    {
        if(!file_exists(APPPATH.'views/pages/about/'.$page.'.php'))
        {
            show_404();
        }

        $data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
        $this->load->view('templates/header', $data);
        $this->load->view('pages/about/'.$page, $data);
        $this->load->view('templates/footer', $data);
    }

    function history($page = 'history')
    {
        if(!file_exists(APPPATH.'views/pages/about/'.$page.'.php'))
        {
            show_404();
        }

        $data['title'] = strtoupper(str_replace(["-", "–"], ' ', $page));
        $this->load->view('templates/header', $data);
        $this->load->view('pages/about/'.$page, $data);
        $this->load->view('templates/footer', $data);
    }
}

I will probably do this for Contact Us, FAQs...

Apparently this is the correct answer。使用控制器和方法来显示具有 subfolder/view 形式的页面。假发

我将 Pages::view() 修改为没有默认参数:

<?php
class Pages extends CI_Controller
{
    function __construct()
    {
        parent::__construct();
    }

    public function view()
    {
        $page = $this->uri->segment(1);
        if(!empty($this->uri->segment(2))) {
            $page .= '/'.$this->uri->segment(2);
        }

        if(!file_exists(APPPATH.'views/pages/'.$page.'.php'))
        {
            show_404();
        }

        $data = "";
        $this->load->view('templates/header', $data);
        $this->load->view('pages/'.$page, $data);
        $this->load->view('templates/footer', $data);
    }
}

到目前为止,我网站中的页面只有一级子文件夹,因此我对以下内容进行了硬编码:

$page = $this->uri->segment(1);
if(!empty($this->uri->segment(2))) {
    $page .= '/'.$this->uri->segment(2);
}

鉴于我的linkhttp://localhost:8080/practice/item-2/subitem-2,URI段的值如下:

$this->uri->segment(1) == 'item-2'
$this->uri->segment(2) == 'subitem-1'

我还使用硬编码捕手更新了 routes.php

$route['default_controller'] = 'welcome';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

$route['pages/(:any)'] = 'pages/view/';
$route['pages/(:any)/(:any)'] = 'pages/view//';
$route['pages/view/(:any)'] = 'pages/view/';
$route['pages/view/(:any)/(:any)'] = 'pages/view//';
$route['(:any)'] = 'pages/view/';
$route['(:any)/(:any)'] = 'pages/view//';

看完你的问题后,我发现你正在尝试编写一些通用函数来负责加载你的 views.Please 请参阅下面的内容,因为你可以处理 codeigniter 中的任何结构。

控制器功能将像这样

public function view($folder='',$page = 'home')
{       
    $path = $folder!=""?$folder.'/':'';
    $path = $page!=""?$path.$page:$page;

    $this->load->view('templates/header', $data);
    **$this->load->view($path, $data);**
    $this->load->view('templates/footer', $data);
}

现在在您看来 link 将是这样的:

<div id="container">
<ul>
    <li>
        <a href='<?php echo base_url."about/"; ?>'>About</a>
    </li>
    <li>
        <a href='<?php echo base_url."about/organization" ?>'>About/Organization</a>
    </li>
    <li>
        <a href='<?php echo base_url."about/history" ?>'>About/History</a>
    </li>
</ul>

另请注意,在 Codeigniter 中您不需要处理 404 manually.Just 添加以下内容以显示您的自定义

$route['404_override'] = 'mycustom404';//mycustom404 is controller for 404

如果您有任何疑问或疑问,请告诉我。

此致, 齐山