$1 в маршрутизации возвращает ошибку 404 вместо передачи сегмента URL методу контроллера.

Когда я перехожу к /public/index.php/main/anything, я получаю эту ошибку:

404 Controller or its method is not found: {0}::{1}

У меня есть проект codeigniter 4, основанный на примере в документации (https://codeigniter4.github.io/userguide/tutorial/news_section.html)

Я добавил эти 3 маршрута:

$routes->get('main/(:any)','main/Main::view/$1');
$routes->get('main', 'main/Main::index');
$routes->get('/', 'Home::index');

остальные настройки здесь:

$routes->setDefaultNamespace('App\Controllers');
$routes->setDefaultController('Home');
$routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
$routes->setAutoRoute(true);

Когда я перехожу к /public/index.php/main, я получаю хорошие результаты индекса.

Я пытался:

main/Main::view

без передачи $ 1, и он отлично работает.

Однако, как только я добавляю $1, я получаю указанную выше ошибку 404. Я также пробовал с :segment тот же результат: ошибка 404.

Я даже не попал в метод просмотра, где я пытался что-то повторить.

Мне нужен последний сегмент кода, так как мне нужно передать его моей модели для дальнейшей обработки.

Также было бы неплохо узнать, как настроить маршрутизацию, чтобы избавиться от части public/index.php, не создавая проблем с безопасностью.

Файл public/.htaccess выглядит так:

Options All -Indexes
<IfModule mod_rewrite.c>
    Options +FollowSymlinks
    RewriteEngine On

    RewriteRule ^(.*)/$ /$1 [L,R=301]

    RewriteCond %{HTTPS} !=on
    RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
    RewriteRule ^ http://%1%{REQUEST_URI} [R=301,L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php/$1 [L]

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>

<IfModule !mod_rewrite.c>
    ErrorDocument 404 index.php
</IfModule>

    ServerSignature Off
<Files ~ "\.(env|json|config.js|md|gitignore|gitattributes|lock)$">
    Order allow,deny
    Deny from all
</Files>

ОБНОВЛЕНИЕ: я воссоздал демонстрационный проект, и вышеизложенное работает, пока файл Main.php находится в папке «Контроллеры». Мой находился в подпапке Controllers/main, и файл маршрутов был настроен соответствующим образом. Таким образом, этот код не работает с подпапкой, что плохо, если мы хотим сохранить наш код организованным. Так что я приветствую решения. Спасибо.


person Dgloria    schedule 23.10.2019    source источник
comment
Среда — Vagrant box с PHP 7.2 на Centos7.   -  person Dgloria    schedule 23.10.2019
comment
возможно, вам просто нужно инвертировать порядок ваших двух первых маршрутов php $routes->get('main', 'main/Main::index'); $routes->get('main/(:any)','main/Main::view/$1');   -  person Nathanael    schedule 23.10.2019
comment
пробовал так, не получилось.   -  person Dgloria    schedule 23.10.2019
comment
Только что попробовал установить curl, тоже не помогло. Постараюсь пройти полное руководство с шага 1, посмотрим, сработает ли оно.   -  person Dgloria    schedule 24.10.2019


Ответы (1)


Я встречаюсь с той же проблемой некоторое время и нашел решение.

Как ты сказал,

ОБНОВЛЕНИЕ: я воссоздал демонстрационный проект, и вышеизложенное работает, пока файл Main.php находится в папке «Контроллеры». Мой находился в подпапке Controllers/main, и файл маршрутов был настроен соответствующим образом. Таким образом, этот код не работает с подпапкой, что плохо, если мы хотим сохранить наш код организованным. Так что я приветствую решения. Спасибо.

Этот раздел напомнил мне регистр имени папки, потому что мое имя папки все в нижнем регистре, как и ваше.

Я изменил имя папки на заглавное, а также изменил то же слово в конфигурации маршрутизации namespace и URI. После этого все заработало.


Я также обнаружил, что в Codeigniter 4 есть примечание руководство пользователя, сказал, что имя папки должно начинаться с заглавной буквы,

Примечание

Система попытается сопоставить URI с контроллерами, сопоставив каждый сегмент с папками/файлами в APPPATH/контроллерах, если совпадение с определенными маршрутами не было найдено. Вот почему ваши папки/файлы ДОЛЖНЫ начинаться с заглавной буквы, а остальные ДОЛЖНЫ быть строчными. Если вам нужно другое соглашение об именах, вам нужно вручную определить его с помощью функции маршрутизации URI.

person hit1205    schedule 29.06.2020
comment
Не следует больше использовать Codeigniter, так что эта тема в любом случае устарела. :( - person Dgloria; 04.07.2020