我希望重定向(301)包含以下内容的某些路由-
page=1
(查询字符串)或index.php
或?&
(查询字符串)
我已将路线添加为-
Route::get('/{any_url}', 'UsersController@processRedirect')->where('any_url', '(.*)index\.php(.*)|(.*)page=1(.*)|(.*)|?&(.*)');
当我在https://regex101.com/中尝试时,它正在工作,但在我的应用程序中却不起作用。
可能是什么问题?
我已经通过MiddleWare完成了此操作,但我不想检查所有URL。
还有其他方法可以实现吗?
因此,诀窍不是在路由中执行此操作,而是全局捕获所有路由,从而捕获所有路由,然后可以在控制器中对路径或查询字符串进行任何处理。这样可以使您的路由保持整洁且易于使用,并可以更大程度地处理查询字符串以及路径或基本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')){
}
}
}
中间件可能是更好的解决方案。
包罗万象的路线有效,但是会有意想不到的后果。您将必须手动处理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);
}
}