用于检查多个字符串的Laravel路由

问题描述 投票:6回答:2

我希望重定向(301)包含以下内容的某些路由-

page=1(查询字符串)或index.php?&(查询字符串)

我已将路线添加为-

Route::get('/{any_url}', 'UsersController@processRedirect')->where('any_url', '(.*)index\.php(.*)|(.*)page=1(.*)|(.*)|?&(.*)');

当我在https://regex101.com/中尝试时,它正在工作,但在我的应用程序中却不起作用。

可能是什么问题?

我已经通过MiddleWare完成了此操作,但我不想检查所有URL。

还有其他方法可以实现吗?

php laravel laravel-5 laravel-routing
2个回答
3
投票

因此,诀窍不是在路由中执行此操作,而是全局捕获所有路由,从而捕获所有路由,然后可以在控制器中对路径或查询字符串进行任何处理。这样可以使您的路由保持整洁且易于使用,并可以更大程度地处理查询字符串以及路径或基本URL。确保使用此“捕获所有路由”来删除要处理的路由。

routes / web.php

//make this last route to catch
Route::any('/{any}', "ProcessRequestController@handler")->where("any", ".*");

App / Http / Controllers / ProcessController.php

namespace App\Http\Controllers;

use Illuminate\Http\Request;


class ProcessRequestController extends Controller{

    public function handler(Request $request){
        //from here you can now access each section of the route a little more conviently.
        $request->path();
        if($request->has('page')){

        }
    }
}

0
投票

中间件可能是更好的解决方案。

包罗万象的路线有效,但是会有意想不到的后果。您将必须手动处理404错误。您可能还会注意到性能下降,具体取决于路由的设置方式。

与全部路由不同,中间件可以在匹配任何路由之前运行。中间件也可以附加到一组路由或特定路由。默认情况下,还有其他中间件类正在运行,例如Authentication和CORS。

这里是有关中间件的最新文档。自Laravel 5以来,中间件并没有太大变化,但是最新文档只是更好地解释了这一概念。 https://laravel.com/docs/7.x/middleware


这是使用中间件解决问题的方法。

创建中间件类。

php artisan make:middleware My301Filter

如果您希望中间件在所有请求上运行,请在app/http/kernel.php中注册该类>

protected $middleware = [
    // ...
    \App\Http\Middleware\My301Filter::class
];

然后,您可以使用任意方式解析路线。使用逻辑确定是否应调用301或应用程序应继续运行。 $next闭包将转到下一个中​​间件或路由。

我选择在中间件类中编写类似的内容。但是,此代码并不完美,您可能必须对其进行更改以满足您的需求。

<?php

namespace App\Http\Middleware;

use Closure;

class My301Filter
{

    // ...

    public function handle($request, Closure $next)
    {
        $needles = ["page=1", "index.php", "?&"];

        foreach ($needles as $needle) {
            if (strpos($request->getRequestUri(), $needle) !== false) {
                return redirect('/some/route', 301);
            }
        }

        return $next($request);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.