Laravel маршрут для проверки нескольких строк - PullRequest
8 голосов
/ 21 апреля 2020

Я хочу перенаправления (301) для некоторых маршрутов, которые содержат следующее -

page=1 (строка запроса) или index.php или ?& (строка запроса)

У меня есть добавил маршрут как -

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

Когда я проверяю в https://regex101.com/, он работает, но в моем приложении он не работает.

Что может быть проблема?

Я сделал это через MiddleWare, но не хочу проверять все URL.

Есть ли другой способ добиться этого?

Ответы [ 2 ]

4 голосов
/ 27 апреля 2020

Таким образом, хитрость заключается не в том, чтобы сделать это в маршруте, а в том, чтобы сделать глобальный перехват всех маршрутов, который перехватит все маршруты, а затем вы можете выполнить любую обработку пути или строки запроса в вашем контроллере. Это сохраняет ваши маршруты чистыми и простыми в использовании и дает больше возможностей для обработки строк запроса и пути или базового URL. Обязательно удалите маршруты, которые вы хотите обработать с помощью этого метода catch all route.

маршруты / сеть. 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')){

        }
    }
}
1 голос
/ 27 апреля 2020

Промежуточное программное обеспечение, вероятно, является лучшим решением.

Маршруты 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);
    }
}
...