将 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.php
和 history.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
是不允许的,除非 folder
和 view
对应于 controller
和method
分别?
解决方案
Zeeshan did that!
Shantay,你留下来! Thank you。
你是对的,我正在寻找一个 通用 方法来捕获我所有的静态页面视图请求。我们现在可以关闭此问题(我将在 20 小时内奖励赏金)。
我认为 CodeIgniter 的 URI 模式是严格的 controller/method
并且不喜欢 subfolder/view_file
。
我刚刚使用方法 organization
和 history
为 About
创建了一个控制器,它将显示该页面。
<?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
如果您有任何疑问或疑问,请告诉我。
此致,
齐山
我无法使用直接 link.
直接加载我的 CodeIgniterviews
文件夹中子文件夹中的视图
文件夹结构如下:
my_project/
application/
views/
pages/
about.php
about/
organization.php
history.php
我需要通过 link 访问 organization.php
和 history.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
是不允许的,除非 folder
和 view
对应于 controller
和method
分别?
解决方案
Zeeshan did that!
Shantay,你留下来! Thank you。
你是对的,我正在寻找一个 通用 方法来捕获我所有的静态页面视图请求。我们现在可以关闭此问题(我将在 20 小时内奖励赏金)。
我认为 CodeIgniter 的 URI 模式是严格的 controller/method
并且不喜欢 subfolder/view_file
。
我刚刚使用方法 organization
和 history
为 About
创建了一个控制器,它将显示该页面。
<?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
如果您有任何疑问或疑问,请告诉我。
此致, 齐山