尾随/在路线模式

Slim 将带有尾部斜杠的 URL 模式与没有尾部斜杠的 URL 模式区别对待。也就是说,/user/user/是不同的,因此可以附加不同的回调。

对于 GET 请求,永久重定向没问题,但对于其他请求方法,如 POST 或 PUT,浏览器将使用 GET 方法发送第二个请求。为避免这种情况,您只需删除尾部的斜杠并将操纵的 url 传递给下一个中间件。

如果您想将所有以 a 结尾的 URL 重定向/重写/为非尾随/等效项,则可以添加此中间件:

<?php
use Psr\Http\Message\RequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Factory\AppFactory;
use Slim\Psr7\Response;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

$app->add(function (Request $request, RequestHandler $handler) {
    $uri = $request->getUri();
    $path = $uri->getPath();
    
    if ($path != '/' && substr($path, -1) == '/') {
        // recursively remove slashes when its more than 1 slash
        $path = rtrim($path, '/');

        // permanently redirect paths with a trailing slash
        // to their non-trailing counterpart
        $uri = $uri->withPath($path);
        
        if ($request->getMethod() == 'GET') {
            $response = new Response();
            return $response
                ->withHeader('Location', (string) $uri)
                ->withStatus(301);
        } else {
            $request = $request->withUri($uri);
        }
    }

    return $handler->handle($request);
});

或者,考虑middlewares/trailing-slash中间件,它还允许您强制将尾部斜杠附加到所有 URL:

use Middlewares\TrailingSlash;

$app->add(new TrailingSlash(true)); // true adds the trailing slash (false removes it)