С новой установкой CodeIgniter 2 и нетронутым welcome.php следующим образом:
class Welcome extends CI_Controller {
public function index()
{
$this->load->view('welcome_message');
}
}
и следующие запросы:
url http response expected actual
/index.php/welcome 200 200
/index.php/welcome/wtf 404 404
/index.php/welcome/welcome 404 200 ?
/index.php/welcome/welcome/welcome 404 200 ?
/index.php/welcome/welcome/welcome/welcome 404 200 ?
/index.php/welcome/welcome/wtf 404 200 ?
Обратите внимание на последние четыре запроса. Почему CodeIgniter демонстрирует такое поведение? Можно ли отключить?
Мое наивное быстрое исправление приведено ниже, но мне интересно, можно ли что-то изменить глобально, чтобы адресовать другие контроллеры.
class Welcome extends CI_Controller {
public function index()
{
$this->load->helper('url');
if (strpos(uri_string(), 'welcome/welcome') !== false) {
show_404();
}
$this->load->view('welcome_message');
}
}
нет, включен полный исходный код приветственного класса. Я поигрался с добавлением метода приветствия, но, как ни странно, ci выдает ошибку. не спрашиваю нового разработчика, но я пытаюсь решить эту проблему с помощью устаревшего приложения, уже использующего ci2. не был уверен, связано ли это с ci или с логикой приложения, похоже, ci.
я не могу воспроизвести это в ci3. у вас есть определенные маршруты?
никаких других модификаций в код внесено не было
что именно происходит, когда вы переходите на одну из страниц, которые дают 200, когда должно быть 404? Пустой экран? Кроме того, ваше решение на самом деле не одно, так как кто-то может просто ввести что-то еще, кроме welcome/welcome.
index метод отображается с приветственным сообщением
условие проверяет, содержит ли uri приветствие / приветствие, поэтому охватывает последние 4 запроса, если это что-то еще, это 404, что и ожидается






Я предполагаю, что второй welcome должен действовать как псевдоним для index, поэтому он работает. Таким образом, он оценивается как welcome(controller)/welcome(index/method)/param(passed to method). Но не цитируйте меня по этому поводу, я не знаком с CI2.
Возможно, вы сможете сделать что-то вроде этого (используя свой код):
class MY_Controller extends CI_Controller {
public function __construct() {
$this->load->helper('url');
$seg1 = $this->uri->segment(1);
$seg2 = $this->uri->segment(2);
if (strpos(uri_string(), "{$seg1}/{$seg2}") !== false) {
show_404();
}
}
}
все контроллеры должны будут расширить MY_Controller, который будет храниться в application/core
Посмотрев код CI, я думаю, что это вызвано функцией fetch_method класса CI_Router. Посмотрите :
function fetch_method()
{
if ($this->method == $this->fetch_class())
{
return 'index';
}
return $this->method;
}
Итак, по умолчанию маршрутизатор устанавливает метод для индексации, если имя метода совпадает с именем класса.
Вы можете изменить это, создав файл MY_Router.php в папке core.
<?php
class MY_Router extends CI_Router {
function fetch_method()
{
return $this->method;
}
}
просто любопытно. в вашем контроллере приветствия есть ли у вас метод под названием welcome? далее, почему вы не используете ci3 для нового разработчика?