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)