Допускается повторение класса CodeIgniter в URL-адресе

С новой установкой 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');
    }
}

просто любопытно. в вашем контроллере приветствия есть ли у вас метод под названием welcome? далее, почему вы не используете ci3 для нового разработчика?

Alex 18.07.2018 04:01

нет, включен полный исходный код приветственного класса. Я поигрался с добавлением метода приветствия, но, как ни странно, ci выдает ошибку. не спрашиваю нового разработчика, но я пытаюсь решить эту проблему с помощью устаревшего приложения, уже использующего ci2. не был уверен, связано ли это с ci или с логикой приложения, похоже, ci.

redgoose 18.07.2018 04:05

я не могу воспроизвести это в ci3. у вас есть определенные маршруты?

Alex 18.07.2018 04:06

никаких других модификаций в код внесено не было

redgoose 18.07.2018 04:08

что именно происходит, когда вы переходите на одну из страниц, которые дают 200, когда должно быть 404? Пустой экран? Кроме того, ваше решение на самом деле не одно, так как кто-то может просто ввести что-то еще, кроме welcome/welcome.

Alex 18.07.2018 04:08

index метод отображается с приветственным сообщением

redgoose 18.07.2018 04:09

условие проверяет, содержит ли uri приветствие / приветствие, поэтому охватывает последние 4 запроса, если это что-то еще, это 404, что и ожидается

redgoose 18.07.2018 04:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я предполагаю, что второй 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;
    }
}

Другие вопросы по теме