Как можно улучшить строгость маршрутизации в Laravel?

У вас есть роут, который выглядит следующим образом: 

<pre><code class="php">Route::get('a/{article}', [ArticleController::class, 'show'])
    ->name('article.show');</code></pre> 

Вы ожидаете, что будут обрабатываться URL типа <code>/a/7</code>, <code>/a/123</code> и подобные. Однако, вы заметили, что страница <code>/a/7</code> также открывается для адресов с буквенными символами после цифр, таких как <code>/a/7asd</code> или <code>/a/7qwerty</code>, и это возвращает код 200. 

Как можно исправить данное поведение, и в чем может быть причина этой проблемы?
  • 15 ноября 2024 г. 2:53
Ответы на вопрос 2
Это поведение связано с тем, что Laravel по умолчанию использует регулярные выражения для параметров маршрутов. Параметр `{article}` в вашем маршруте соответствует любому значению, включая цифры, буквы и любые другие символы, за исключением `/`. Поэтому URL-ы, такие как `/a/7asd` или `/a/7qwerty`, также успешно сопоставляются с данным маршрутом и обрабатываются.

Чтобы улучшить строгость маршрутизации и ограничить допустимые значения для параметра `{article}`, вы можете использовать регулярные выражения в определении маршрута, чтобы разрешить только числовые значения. Для этого замените `{article}` на `{article}` с указанием регулярного выражения. Вот как это сделать:

```php
Route::get('a/{article}', [ArticleController::class, 'show'])
    ->where('article', '[0-9]+')
    ->name('article.show');
```

В данном случае, `where('article', '[0-9]+')` устанавливает правило, что параметр `article` может состоять только из одной или более цифр (от 0 до 9). Таким образом, URL типа `/a/7` будет соответствовать маршруту, а URL'ы типа `/a/7asd` или `/a/7qwerty` будут возвращать 404 ошибку, так как они не удовлетворяют установленному регулярному выражению.

Использование ограничений на параметры маршрутов помогает сделать ваше приложение более безопасным и избегать неожиданных результатов при запросах к неправильным URL.
Читайте доки, в доках всё описано. https://laravel.com/docs/11.x/routing#parameters-r...
Похожие вопросы