【问题标题】:How to define a Laravel route with a parameter that contains a slash character如何使用包含斜杠字符的参数定义 Laravel 路由
【发布时间】:2014-02-28 10:18:08
【问题描述】:

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

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

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    将下面的包罗万象的路线添加到您的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]

    【讨论】:

    • 我不同意,这是一种解决 laravel 路由不足的技巧。查看我的答案和 laravel 包,它提供了编码斜杠的修复。
    • 它在 Lumen $app->get('/documents/{document:.+}', 'DocumentController@show'); 中的工作原理类似
    • 在我的用例中,我在“斜线参数”之后有另一个参数,如下所示:url/slash%2Fparameter/12- 带有类似url/{slashData}/{id} 的路由。这应该有效,但不是由于 laravel 错误。你的“解决方案”会给getData()整个slash/parameter/12,我必须自己从id中分离斜杠参数。那是 laravel 的工作,不是我的!
    • @Chistopher K. 你可以完全接受斜杠参数,只是不要在斜杠上使用 url 编码;这是 Laravel 中的一个单独的错误 (github.com/laravel/framework/issues/22125)。但是,如果您使用 url/slash/parameter/12 作为示例,然后像这样创建路由: Route::get('/url/{slashData}/{id}', 'SomeController@someMethod')->where( ['slashData' => '[^/]+/[^/]+','id' => '[0-9]+']) 它可以正常工作(用 Laravel 5.6 测试)。
    • 这个'(.*)'是什么意思这个'/'?
    【解决方案2】:

    由于我认为是一个错误,urlencoded 斜杠在 Laravel 中不起作用。 https://github.com/laravel/framework/pull/4323 此拉取请求将解决该错误。

    更新。

    请注意,更改允许在解码路径中的值之前解析路由。

    【讨论】:

    • 错误修复被拒绝所以我写了一个包... github.com/Artistan/Urlencode
    【解决方案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:)?.*)');
    

    希望对你有帮助。

    【讨论】:

    • 太棒了,谢谢!这对我来说是有效的,也适用于多个参数,每个参数都包含一个或多个斜杠。
    • 这必须是公认的答案。这确实是标准解决方案,因为它是 Laravel 的文档推荐的:laravel.com/docs/5.1/…
    【解决方案4】:

    我已经对Pierre 的回答投了赞成票,这是正确的,但在我看来比需要的要长,这是一个非常短的不耐烦的示例路线,可以解决问题:

    Route::get('post/{slug}', [PostController::class, 'show'])->where('slug', '[\w\s\-_\/]+');
    

    这就是你所需要的。确实,上面正则表达式中的\/(在where 方法中)就是您所需要的!

    现在举例:

    • domain/A ---> "A" 将被传递给PostControllershow 方法。
    • domain/A/B ---> "A/B" 将传递给PostControllershow 方法。
    • domain/A/B/C ---> "A/B/C" 将被传递给PostControllershow 方法。
    • 等等……

    更多示例请阅读:Laravel Documentation - Regular Expression Constraints

    【讨论】:

      【解决方案5】:

      在 Laravel 8 中

      Route::get('/search/{search}', function ($search) {
          return $search;
      })->where('search', '.*');
      

      参考:

      https://laravel.com/docs/8.x/routing#parameters-encoded-forward-slashes

      【讨论】:

        猜你喜欢
        • 2016-04-06
        • 1970-01-01
        • 2016-11-20
        • 2011-05-15
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 2018-02-20
        • 1970-01-01
        相关资源
        最近更新 更多