Url rewriting 在laravel 5.1 route拦截之前更改get url

Url rewriting 在laravel 5.1 route拦截之前更改get url,url-rewriting,routing,laravel-5.1,pretty-print,Url Rewriting,Routing,Laravel 5.1,Pretty Print,在最终掌握了Laravel的关键部分之后,我准备重构我所有的过程代码 我有一个问题,其他一些程序使用以下url: 据我所知,laravel路线如下: 我应该如何在laravel中截取旧样式的url,或者在调用laravel路由并翻译它之前截取旧样式的url,以便路由能够处理它?只要您只使用GET执行此操作,您就可以使用中间件来解决您的问题 创建中间件 php artisan make:middleware RedirectIfOldUrl …或者随便你怎么称呼它 将定义添加到您的应用程序/H

在最终掌握了Laravel的关键部分之后,我准备重构我所有的过程代码

我有一个问题,其他一些程序使用以下url:

据我所知,laravel路线如下:


我应该如何在laravel中截取旧样式的url,或者在调用laravel路由并翻译它之前截取旧样式的url,以便路由能够处理它?

只要您只使用
GET
执行此操作,您就可以使用中间件来解决您的问题

创建中间件

php artisan make:middleware RedirectIfOldUrl

…或者随便你怎么称呼它

将定义添加到您的
应用程序/Http/Kernel.php

\App\Http\Middleware\RedirectIfOldUrl::class,
添加到
$Middleware
数组(而不是
$routeMiddleware
)数组中

这将导致在每次请求时调用中间件

处理请求

public function handle($request, Closure $next)
{

    if (str_contains($request->getRequestUri(), '.php?')) {

        //Remove .php from the request url
        $url = str_replace('.php', '', $request->url());

        foreach ($request->input() as $key => $value) {

            $url .= "/{$key}/{$value}";
        }

        return redirect($url);
    }

    return $next($request);
}
以上是一个非常基本的实现,或者您在问题中提到的。您可能需要调整逻辑,使其完全适合您的应用程序,但它应该为您指明正确的方向


希望这有帮助

只要您只使用
GET
执行此操作,您就可以使用中间件来解决您的问题

创建中间件

php artisan make:middleware RedirectIfOldUrl

…或者随便你怎么称呼它

将定义添加到您的
应用程序/Http/Kernel.php

\App\Http\Middleware\RedirectIfOldUrl::class,
添加到
$Middleware
数组(而不是
$routeMiddleware
)数组中

这将导致在每次请求时调用中间件

处理请求

public function handle($request, Closure $next)
{

    if (str_contains($request->getRequestUri(), '.php?')) {

        //Remove .php from the request url
        $url = str_replace('.php', '', $request->url());

        foreach ($request->input() as $key => $value) {

            $url .= "/{$key}/{$value}";
        }

        return redirect($url);
    }

    return $next($request);
}
以上是一个非常基本的实现,或者您在问题中提到的。您可能需要调整逻辑,使其完全适合您的应用程序,但它应该为您指明正确的方向


希望这有帮助

我在Laravel 6.2中使用这个中间件重写了路径,并将其添加到
app\Http\Kernel.php

<?php

namespace App\Http\Middleware;

use Closure;

class Localize
{
    public function handle($request, Closure $next)
    {
        if(substr($_SERVER['REQUEST_URI'], 0, 4 ) === "/es/" || $_SERVER['REQUEST_URI'] === "/es") {
          $request->server->set('REQUEST_URI', substr($_SERVER['REQUEST_URI'], 4));
          app()->setLocale('es');
        }
        return $next($request);
    }
}

我在Laravel 6.2中使用这个中间件重写了路径,并将其添加到
app\Http\Kernel.php

<?php

namespace App\Http\Middleware;

use Closure;

class Localize
{
    public function handle($request, Closure $next)
    {
        if(substr($_SERVER['REQUEST_URI'], 0, 4 ) === "/es/" || $_SERVER['REQUEST_URI'] === "/es") {
          $request->server->set('REQUEST_URI', substr($_SERVER['REQUEST_URI'], 4));
          app()->setLocale('es');
        }
        return $next($request);
    }
}


看起来是一个很好的解决方案,我会尝试回去这是一个完美的解决方案,不能再投票一次,但在这种情况下会这么做。Ross-可以做类似的事情来修改请求吗。我想在路由器处理url之前修改它,而不是重定向它。。。因此/en/my-url和/es/my-url等都由/my-url处理route@Ben,IMO,如果它们将由同一个端点处理,只需使两条路由都指向该端点即可。@RossWilson是否可以处理请求而不是重定向。我现在有一个旧的终端,无法处理重定向。看起来像是一个解决方案,我会尝试回去这是一个完美的解决方案,不能再升级一次,但在这种情况下会这样做。罗斯-可以做类似的事来修改请求。我想在路由器处理url之前修改它,而不是重定向它。。。因此/en/my-url和/es/my-url等都由/my-url处理route@Ben,IMO,如果它们将由同一个端点处理,只需使两条路由都指向该端点即可。@RossWilson是否可以处理请求而不是重定向。我现在有一个旧的终端无法处理重定向。对我来说不起作用。它试图找到一个包含lang的路由,结果是一个404。@JeremyBelolo你把中间件添加到Kernal.php了吗<代码>\App\Http\Middleware\Localize::class,
当然:)可能与Laravel 8有所不同…@JeremyBelolo我在6.2中这样做了,尽管在set()之前使用$request->server getter会有问题,但我为此打开了一个问题,但它已经关闭了:我认为现在很明显没有合法的方法可以做到这一点。对我来说不起作用。它试图找到一个包含lang的路由,结果是一个404。@JeremyBelolo你把中间件添加到Kernal.php了吗
\App\Http\Middleware\Localize::class,
当然:)可能与Laravel 8有所不同…@JeremyBelolo我在6.2中做了这件事,尽管在set()之前使用$request->server getter会有问题,但我为此打开了一个问题,但它已经关闭了:我认为现在很明显没有合法的方法来做这件事。