Параметры маршрута Laravel Not Trimmed (обычно работает при добавлении пробела) - PullRequest
0 голосов
/ 27 июня 2018

У меня есть следующий маршрут в web.php:

Route::get('posts/{encoded_id}/{slug}', 'PostController@show')

... и работает нормально:

http://example.test/posts/1Dl89aRjpk/this-is-some-title

Но «проблема» в том, что он также будет работать, когда я добавлю пробел в конце параметра маршрута {encoded_id}:

http://example.test/posts/1Dl89aRjpk /this-is-some-title

// or

http://example.test/posts/1Dl89aRjpk%20 /this-is-some-title

// or

http://example.test/posts/1Dl89aRjpk%20%20 /this-is-some-title

С добавленными пробелами в конце - это будет работать нормально, и есть нет 404:

Post::where('encoded_id', $encoded_id)->firstOrFail();

... но почему? И как мне сделать так, чтобы он потерпел неудачу (выдать 404)?

Может быть из-за типа поля в БД (CHAR)?

$table->char('encoded_id', 10)

Если вот почему - есть ли способ настроить MySQL в databases.php, чтобы это предотвратило это?

А может, это как-то связано с .htaccess (я использую XAMPP / Windows)?

Я использую Laravel 5.6.

EDIT:

Я спрашиваю, почему это происходит и как я могу это предотвратить, а не как обрезать параметр маршрута. Например, добавьте пробел в конце question id на URL-адресе stackoverflow, и вы получите 404:

https://stackoverflow.com/questions/51068436 /laravel-route-parameters-not-trimmed-it-normally-works-when-whitespace-is-added

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Опираясь на ответ балпинга. Некоторые другие решения будут:

Заменить все конечные пробелы на #

preg_replace("/\s+$/", "#", $encoded_id);

Используйте отделку в сочетании с str_pad и strlen. Это обрезает пробелы спереди и сзади, но дополняет строку символами #, поэтому она по-прежнему имеет первоначальную длину.

str_pad(trim($encoded_id), strlen($encoded_id), '#');
0 голосов
/ 27 июня 2018

Это связано с ожидаемым поведением SQL. В вашем контроллере вы получаете полный $encoded_id с пробелами. Все, что Laravel делает для вас, вызывает запрос выбора SQL с WHERE. SQL игнорирует завершающие пробелы в WHERE сравнении.

См. вопрос .

Если вы хотите 404, замените пробелы в идентификаторе на некоторый фиктивный символ:

$encoded_id = str_replace(' ', '#', $encoded_id);

Делайте это только в том случае, если гарантировано, что идентификатор не содержит пробелов или хеш-меток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...