Прямая ссылка на представление подпапки возвращает 404

Я не могу напрямую загрузить представление, которое находится во вложенной папке в моей папке views CodeIgniter с прямой ссылкой.

Вот структура папок:

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

Мне нужно получить доступ к 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> компании <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> компании <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 который направляет мой диспетчер представлений по умолчанию 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 а прямая связь все еще не работала.


ПРИМЕЧАНИЕ. Мое единственное решение прямо сейчас – сделать отдельные контроллеры для каждой из этих подпапок только для их просмотра! Неужели это невозможно сделать только с одним контроллером?

Как и шаблон url my_app/controller/method строго, а my_app/folder/view не разрешен, если folder и view соответствуют controller и method соответственно?


РЕШЕНИЕ

Zeeshan сделал это !

Шантай, ты останешься! Благодарю вас .

Вы правы, я собирался использовать общий метод, чтобы поймать все мои статические запросы на просмотр страницы. Мы можем закрыть этот вопрос сейчас (я награду за награду за 20 часов).

Ты был единственным, кто понял задание .

Solutions Collecting From Web of "Прямая ссылка на представление подпапки возвращает 404"

Пройдя свой вопрос, я обнаружил, что вы пытаетесь написать какую-то общую функцию, которая позаботится о загрузке ваших просмотров. Пожалуйста, обратитесь ниже, поскольку вы можете обрабатывать любую структуру в кодеигнитре.

Функция контроллера будет выглядеть следующим образом:

 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.

Я думаю, что код URI CodeIgniter является строго controller/method и не любит subfolder/view_file .

Я просто сделал контроллер для About с organization методов и history , которые покажут страницу.

 <?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); } } 

Я, вероятно, сделаю это для Contact Us , FAQs

По-видимому, это правильный ответ . Используйте контроллеры и методы для отображения страницы с 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); } 

Учитывая мою ссылку http://localhost:8080/practice/item-2/subitem-2 , значение сегментов URI выглядит следующим образом:

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

Я обновил routes.php с помощью жестко 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';