如何使用包含斜杠字符的参数定义Laravel路径

时间:2014-02-04 12:28:59

标签: php laravel

我想定义一个参数,该参数包含一个斜杠/字符,如example.com/view/abc/02,其中abc/02是参数。

如何防止Laravel读取斜杠作为下一个路径参数的分隔符?因此,我现在正在获得404 not found error

5 个答案:

答案 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)

由于我认为是一个bug,

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方法中)就是您所需要的!

例如:

  • domain / A --->“ A”将传递给show的{​​{1}}方法。
  • domain / A / B --->“ A / B”将传递给PostController的{​​{1}}方法。
  • domain / A / B / C --->“ A / B / C”将传递到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