Подтвердить что ты не робот

Как определить маршрут Laravel с параметром, который содержит символ косой черты

Я хочу определить маршрут с параметром, который будет содержать символ slash /, такой как example.com/view/abc/02, где abc/02 - это параметр.

Как я могу запретить Laravel читать косую черту в качестве разделителя для следующего параметра маршрута? Из-за этого я получаю 404 not found error сейчас.

4b9b3361

Ответ 1

Добавьте ниже всего маршрута catch-all в конец вашего routes.php и не забудьте запустить composer dump-autoload после этого. Обратите внимание на использование "- > где", которое указывает возможное содержимое параметров, позволяющее использовать параметр, содержащий косую черту.

//routes.php
Route::get('view/{slashData?}', '[email protected]')
    ->where('slashData', '(.*)');

А чем в вашем контроллере вы просто обрабатываете данные, как обычно, (например, он не содержал косую черту).

//controller 
class ExampleController extends BaseController {

    public function getData($slashData = null)
    {
        if($slashData) 
        {
            //do stuff 
        }
    }

}

Это должно сработать для вас.

Кроме того, здесь у вас есть подробные документы Laravel о параметрах маршрута: [docs]

Ответ 2

urlencoded slashes не работают в Laravel из-за того, что я считаю ошибкой. https://github.com/laravel/framework/pull/4323 Этот запрос на растяжение разрешит эту ошибку.

Update.

Обратите внимание, что это изменение позволяет анализировать маршрут перед расшифровкой значений в пути.

Ответ 3

У меня есть аналогичная проблема, но мой URL-адрес содержит несколько параметров маршрута:

/test/{param1WithSlash}/{param2}/{param3}

И вот как я справился в этом случае:

    Route::get('test/{param1WithSlash}/{param2}/{param3}', function ($param1MayContainsSlash, $param2, $param3) {

        $content = "PATH: " . Request::path() . "</br>";
        $content .= "PARAM1: $param1WithSlash </br>";
        $content .= "PARAM2: $param2 </br>".PHP_EOL;
        $content .= "PARAM3: $param3 </br>".PHP_EOL;

        return Response::make($content);
    })->where('param1MayContainsSlash', '(.*(?:%2F:)?.*)');

Надеюсь, это поможет.