Ошибка Laravel 7 404 при маршруте с более чем 2 уровнями

#php #laravel #routes #laravel-7

#php #laravel #маршруты #laravel-7

Вопрос:

Я столкнулся с проводной проблемой с Laravel, где маршруты с несколькими параметрами (обязательными / необязательными) не работают.

Информация об окружающей среде

  • Локально: Windows, XAMPP, PHP 7.3
  • Производство: Ubuntu 18.04, PHP 7.4

Изначально я подозревал проблему с файлом .htaccess, но, похоже, это не проблема. Это отлично работает на моем локальном сервере, но по какой-то причине это не работает на сервере Ubuntu.

Следующий код работает отлично.

 Route::any('route/me/','Tst@routeme');
  

Однако ни одно из следующих действий не работает:

 Route::any('route/me/here/','Tst@routeme');

Route::any('route/me/here/{id?}','Tst@routeme');

Route::any('route/me/here/and/here','Tst@routeme');
  

Любые предложения, где я могу найти, чтобы исправить это, пожалуйста?

Комментарии:

1. Мне любопытно, почему в вашей локальной и производственной средах используются разные версии PHP? Кроме того, когда вы говорите, что маршруты не работают, что именно происходит?

2. вы используете Route::any вместо Route::get, поэтому любая база ‘route / me’ на доступных методах маршрутизатора будет проверяться на get ‘route / me’, post ‘route / me’, put ‘route / me’, patch ‘route / me’, delete ‘route / me’, опции ‘route / me’. попробуйте изменить ::any на ::get и проверьте на своем терминале php artisan route:list

3. @spholt, я знаю, что это некрасиво, но у моего локального есть другие клиентские проекты, которым требуется версия. Отсюда разница :

Ответ №1:

Моим первым предложением было бы разместить маршрут с большинством параметров вверху, например:

 Route::any('route/me/here/and/here','Tst@routeme');

Route::any('route/me/here/{id?}','Tst@routeme');

Route::any('route/me/here/','Tst@routeme');
  

Это больше похоже на то, какой из маршрутов совпадает первым, выполняется первым, поэтому маршрут с наименьшим параметром совпадает последним сверху донизу.

Во-вторых, я бы посоветовал вам сгруппировать маршруты следующим образом:

 Route::prefix('route/me')->group(function () {
    Route::get('here/and/here', 'Tst@routeme');
    Route::get('here/{id?}', 'Tst@routeme');
    Route::get('here', 'Tst@routeme');
});
  

для лучшей читаемости…

Комментарии:

1. Пробовал и это, но не сильно помогло; (

Ответ №2:

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


Homestead Docs

Окно Homestead vagrant, предоставленное командой Laravel, является надежным выбором и хорошо документировано. Это Ubuntu 18.04 / 20.04, и на нем может быть настроено множество дополнений. Вы можете легко настроить, какую версию PHP использует тот или иной проект, с помощью одной строки в Homestead.yaml файле.

Docker Docs

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


Их не так сложно настроить (легко выполнить в течение дня или двух) и они позволяют вам практически идеально копировать ваши производственные среды.

Это очень поможет в тех случаях, когда «но это работает на моей машине»!

Ответ №3:

обновляю свой собственный вопрос, чтобы это могло помочь другим.

Я бы сказал, вероятно, это последнее, что кто-то (или, по крайней мере, я) не смог проверить. Я попытался составить список маршрутов на моем сервере и обнаружил, что мой недавно добавленный маршрут не найден.

 php artisan route:list

  

Ранее я очистил кэш, перезапустил apache, но это не помогло. Наконец-то обнаружил, что следующие команды являются спасением, когда маршруты кэшируются и не работают.
Итак, то, что сработало у меня — очистка кэша «маршрута».

 php artisan route:cache 
php artisan route:clear
  

Моя искренняя благодарность @Spholt, @Akbar khan, @Spholt, @Gzai Kun за помощь.