【发布时间】:2014-02-28 10:18:08
【问题描述】:
我想定义一个带有参数的路由,该参数将包含一个斜杠/ 字符,例如example.com/view/abc/02,其中abc/02 是参数。
如何防止 Laravel 读取斜杠作为下一个路由参数的分隔符?因此,我现在收到了404 not found error。
【问题讨论】:
我想定义一个带有参数的路由,该参数将包含一个斜杠/ 字符,例如example.com/view/abc/02,其中abc/02 是参数。
如何防止 Laravel 读取斜杠作为下一个路由参数的分隔符?因此,我现在收到了404 not found error。
【问题讨论】:
将下面的包罗万象的路线添加到您的routes.php 的底部,然后记得运行composer dump-autoload。请注意使用“->where”指定参数的可能内容,使您能够使用包含斜杠的参数。
//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]
【讨论】:
$app->get('/documents/{document:.+}', 'DocumentController@show'); 中的工作原理类似
url/slash%2Fparameter/12- 带有类似url/{slashData}/{id} 的路由。这应该有效,但不是由于 laravel 错误。你的“解决方案”会给getData()整个slash/parameter/12,我必须自己从id中分离斜杠参数。那是 laravel 的工作,不是我的!
由于我认为是一个错误,urlencoded 斜杠在 Laravel 中不起作用。 https://github.com/laravel/framework/pull/4323 此拉取请求将解决该错误。
更新。
请注意,更改允许在解码路径中的值之前解析路由。
【讨论】:
我有类似的问题,但我的 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:)?.*)');
希望对你有帮助。
【讨论】:
我已经对Pierre 的回答投了赞成票,这是正确的,但在我看来比需要的要长,这是一个非常短的不耐烦的示例路线,可以解决问题:
Route::get('post/{slug}', [PostController::class, 'show'])->where('slug', '[\w\s\-_\/]+');
这就是你所需要的。确实,上面正则表达式中的\/(在where 方法中)就是您所需要的!
现在举例:
PostController 的show 方法。PostController 的show 方法。PostController 的show 方法。更多示例请阅读:Laravel Documentation - Regular Expression Constraints
【讨论】:
在 Laravel 8 中
Route::get('/search/{search}', function ($search) {
return $search;
})->where('search', '.*');
参考:
https://laravel.com/docs/8.x/routing#parameters-encoded-forward-slashes
【讨论】: