我想定义一个参数,该参数包含一个斜杠/
字符,如example.com/view/abc/02
,其中abc/02
是参数。
如何防止Laravel读取斜杠作为下一个路径参数的分隔符?因此,我现在正在获得404 not found error
。
答案 0 :(得分:84)
将以下全能路线添加到routes.php
的底部,然后记得再次运行composer dump-autoload
。请注意使用“ - > where”指定params的可能内容,使您可以使用包含斜杠的param。
//routes.php
Route::get('view/{slashData?}', 'ExampleController@getData')
->where('slashData', '(.*)');
而在你的控制器中,你只需按照通常的方式处理数据(就像它没有包含斜杠一样)。
//controller
class ExampleController extends BaseController {
public function getData($slashData = null)
{
if($slashData)
{
//do stuff
}
}
}
这对你有用。
此外,您还可以在此处获得有关路线参数的详细Laravel文档:[docs]
答案 1 :(得分:5)
urlencoded斜杠在Laravel中不起作用。 https://github.com/laravel/framework/pull/4323 这个拉取请求将解决该错误。
更新
请注意,更改允许在解码路径中的值之前解析路由。
答案 2 :(得分:3)
我有类似的问题,但我的网址包含多个路由参数:
/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:)?.*)');
希望它可以提供帮助。
答案 3 :(得分:0)
我已经赞成Pierre的回答,这是正确的,但是我认为它比需要的时间更长,这是一条很短的针对病人的示例路线,可以解决问题:
Route::get('post/{slug}', [PostController::class, 'show'])->where('slug', '[\w\s\-_\/]+');
这就是您所需要的。实际上,上面正则表达式中的\/
(在where
方法中)就是您所需要的!
例如:
show
的{{1}}方法。PostController
的{{1}}方法。show
的{{1}}方法。有关更多示例,请阅读:Laravel Documentation - Regular Expression Constraints
答案 4 :(得分:0)
在 Laravel 8 中
Route::get('/search/{search}', function ($search) {
return $search;
})->where('search', '.*');
参考:
https://laravel.com/docs/8.x/routing#parameters-encoded-forward-slashes