到子文件夹视图的直接链接返回404

时间:2016-09-03 06:36:12

标签: php .htaccess codeigniter view subdirectory

我无法使用直接链接直接加载我的CodeIgniter views文件夹中子文件夹中的视图。

这是文件夹结构:

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

我需要通过以下链接访问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/$1$2 [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/$1 [L]
</IfModule>

这是指向我的默认视图控制器routes.php的{​​{1}}:

Pages::view(path/to/file)

这是我的控制器:

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

$route['pages/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['(:any)'] = 'pages/view/$1';
每当我直接使用

时,

注意

<?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一样严格,my_app/controller/method是不允许的,除非my_app/folder/viewfolder分别对应viewcontroller

Zeeshan did that

Shantay,你留下来! Thank you

你是对的,我想要一个泛型方法来捕获我所有的静态页面查看请求。我们现在可以解决这个问题(我将在20小时内给予奖励)。

You were the only one who understood the assignment

3 个答案:

答案 0 :(得分:1)

在完成你的问题之后,我发现你正在尝试编写一些通用函数来处理你的视图。请参阅下面的代码,你可以处理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);
}

现在,在您的观看中,链接将如下所示:

<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.只需添加以下内容即可显示您的自定义

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

如果您有任何疑问或疑问,请与我联系。

此致 Zeeshan。

答案 1 :(得分:0)

我认为CodeIgniter的URI模式严格为controller/method,并且对subfolder/view_file不感兴趣。

我刚为About创建了一个控制器,其中包含将显示该页面的方法organizationhistory

<?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的页面。 WIG。

答案 2 :(得分:0)

我将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);
}

鉴于我的链接http://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/$1';
$route['pages/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['pages/view/(:any)'] = 'pages/view/$1';
$route['pages/view/(:any)/(:any)'] = 'pages/view/$1/$2';
$route['(:any)'] = 'pages/view/$1';
$route['(:any)/(:any)'] = 'pages/view/$1/$2';