如何使用苗条重定向

Posted

技术标签:

【中文标题】如何使用苗条重定向【英文标题】:how to use slim redirect 【发布时间】:2014-06-17 17:36:58 【问题描述】:

我有问题。我正在使用 slim,并且我的主页有路由:

$app->get('/', function() use ($app)  ... 

在我的一个控制器中,我想重定向到主页,所以我写了

$app->response->redirect('/', 303);

但不是重定向到“/”路由,而是重定向到我的本地服务器的根目录,即http://localhost/

我做错了什么?我应该如何使用重定向方法?

【问题讨论】:

【参考方案1】:

超薄 4:

$response->withHeader('Location', '/redirect/to');

或者代替固定字符串:

use Slim\Routing\RouteContext;

$routeParser = RouteContext::fromRequest($request)->getRouteParser();
$url = $routeParser->urlFor('login');

return $response->withHeader('Location', $url);

Slim 文档:http://www.slimframework.com/docs/v4/objects/response.html#returning-a-redirect 路由上下文:https://discourse.slimframework.com/t/redirect-to-another-route/3582

【讨论】:

【参考方案2】:

修身 3

$app->get('/', function ($req, $res, $args) 
  $url = 'https://example.org';
  return $res->withRedirect($url);
);

参考:https://www.slimframework.com/docs/v3/objects/response.html#returning-a-redirect

【讨论】:

能否提供此 API 的文档参考/URL? @MNR 虽然在Cookbook entry regarding trailing slashes 中使用过,但文档中并未明确提及。 (这里是 Response 对象的 withRedirect 方法的source code。) 参考:slimframework.com/docs/v3/objects/…【参考方案3】:

我想我遇到了类似的问题,问题出在我的 .htaccess 配置文件上。它实际上应该是这样的:

RewriteEngine On
RewriteBase /api #if your web service is inside a subfolder of your app, 
# you need to pre-append the relative path to that folder, hope this helps you!

RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^(.*)$ index.php [QSA,L]

【讨论】:

【参考方案4】:

对于 Slim v3.x:

使用$response->withStatus(302)->withHeader('Location', $url); 代替$app->redirect();

在 Slim v2.x 中,可以使用辅助函数 $app->redirect();触发重定向请求。在 Slim v3.x 中,可以像这样使用 Response 类来做同样的事情(参见下面的例子)[1]。

使用pathFor() 代替urlFor()

urlFor() 已重命名为 pathFor() 并且可以在路由器对象中找到。 此外,pathFor() 是基本路径感知[2]。

例子:

$app->get('/', function ( $request, $response, $args ) use ( $app ) 
  $url = $this->router->pathFor('loginRoute');
  return $response->withStatus(302)->withHeader('Location', $url);
);

注意:可以通过传递参数名称和值的关联数组作为pathFor() 的第二个参数来提供附加参数,例如:$this->router->pathFor('viewPost', ['id' => 1]);

路由器的 pathFor() 方法接受两个参数:

    路线名称 路由模式占位符和替换值的关联数组[3]

参考资料:

    Changed Redirect urlFor() is now pathFor() in the router Route names

【讨论】:

【参考方案5】:

来自 Slim3 文档 http://www.slimframework.com/docs/start/upgrade.html

$app->get('/', function ($req, $res, $args) 
  return $res->withStatus(302)->withHeader('Location', 'your-new-uri');
);

【讨论】:

它很完美,并且根据 Slim v3.x 文档也适用于我,谢谢。 你也可以使用$res->withRedirect('your-new-uri'); 我在 Slim 4 中收到 withRedirect method not found 错误,所以不得不使用这个答案。 @sulaimansudirman 这里也一样!知道为什么 withRedirect 对我们有用吗?【参考方案6】:

Slim 允许您命名路由,然后使用 urlFor() 根据此名称重定向回它们。在您的示例中,将您的路线更改为:

$app->get('/', function() use ($app)  ... )->name("root");

然后你的重定向变成:

$app->response->redirect($app->urlFor('root'), 303);

有关详细信息,请参阅 Slim 文档中的 Route Helpers。

【讨论】:

为了避免 URL 劫持,你应该使用 307,因为 HTTP 1.1。【参考方案7】:
//Set Default index or home page
$app->get('/', function() use ($app) 
      $app->response->redirect('login.php');
);

【讨论】:

【参考方案8】:

给你的“/”路线起个名字,

$app = new \Slim\Slim();
$app->get('/', function () 
       echo "root page";
    )->name('root');


$app->get('/foo', function () use ($app) 
       $app->redirect($app->urlFor('root') );
    );

$app->run();

这应该为您提供正确的重定向网址

http://docs.slimframework.com/routing/names/ http://docs.slimframework.com/routing/helpers/#redirect

【讨论】:

【参考方案9】:

我认为使用 ./ 代替 / 也可以。

【讨论】:

以上是关于如何使用苗条重定向的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ajax jQuery 重定向指定重定向 url

如何使用js 重定向到原来的页面

JSP如何实现网页重定向

如何在苗条的故事书中使用“插槽”

如何使用 301 重定向而不是 302 将 HTTP 站点重定向到 HTTPS 站点

如何使用HTTP重定向(在Django)来传递信息