Промежуточное программное обеспечение, вероятно, является лучшим решением.
Маршруты Catch-all работают, но имеют непредвиденные последствия. Вам придется вручную обработать 404 ошибки. Вы также можете заметить снижение производительности в зависимости от того, как настроены ваши маршруты.
В отличие от универсальных маршрутов, промежуточное ПО может работать до того, как будут сопоставлены любые маршруты. Промежуточное программное обеспечение также может быть присоединено к группе маршрутов или указанному c маршруту. Есть другие промежуточные классы, которые запускаются по умолчанию, такие как Аутентификация и 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
];
Затем вы сможете проанализировать свой маршрут любым удобным вам способом. Используйте logi c, чтобы определить, следует ли вызывать 301 или приложение должно продолжаться. Закрытие $next
приведет к go следующему промежуточному программному обеспечению или маршруту.
Я решил написать что-то подобное в своем классе промежуточного программного обеспечения. Однако этот код не идеален, и вам, вероятно, придется изменить его в соответствии с вашими потребностями.
<?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);
}
}