Как использовать тонкое перенаправление
У меня проблема. Я использую slim, и у меня есть маршрут для моей главной страницы:
$app->get('/', function() use ($app) { ...
В одном из моих контроллеров я хочу перенаправить на главную страницу, поэтому пишу
$app->response->redirect('/', 303);
Но вместо перенаправления на маршрут '/' я перенаправляюсь к корню моего локального сервера, который http://localhost/
Что я делаю неправильно? Как использовать метод перенаправления?
Ответы
Ответ 1
Slim позволяет вам называть маршруты, а затем перенаправлять их обратно на основе этого имени, используя urlFor()
. В вашем примере измените свой маршрут на:
$app->get('/', function() use ($app) { ... })->name("root");
а затем ваше перенаправление будет:
$app->response->redirect($app->urlFor('root'), 303);
Для получения дополнительной информации см. "Помощники маршрута" в документации Slim.
Ответ 2
Из документов Slim3
http://www.slimframework.com/docs/start/upgrade.html
$app->get('/', function ($req, $res, $args) {
return $res->withStatus(302)->withHeader('Location', 'your-new-uri');
});
Ответ 3
Slim 3
$app->get('/', function ($req, $res, $args) {
$url = 'https://example.org';
return $response->withRedirect($url);
});
Ссылка: https://www.slimframework.com/docs/v3/objects/response.html#returning-a-redirect
Ответ 4
укажите название маршрута //,
$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();
Это должно дать вам правильный URL-адрес для перенаправления
http://docs.slimframework.com/routing/names/
http://docs.slimframework.com/routing/helpers/#redirect
Ответ 5
//Set Default index or home page
$app->get('/', function() use ($app) {
$app->response->redirect('login.php');
});
Ответ 6
Для Slim v3.x:
Используйте $response->withStatus(302)->withHeader('Location', $url);
вместо $app->redirect();
В Slim v2.x можно использовать вспомогательную функцию $app- > redirect(); для запуска запроса перенаправления. В Slim v3.x можно сделать то же самое с использованием класса Response (см. Следующий пример) [1].
Используйте pathFor()
вместо urlFor()
:
URL-адрес() был переименован в 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]);
.
Метод pathpath() маршрутизаторов принимает два аргумента:
- Название маршрута
- Ассоциативный массив заполнителей шаблонов маршрутов и значений замены [3]
Литература:
Ответ 7
Я думаю, что столкнулся с подобной проблемой, и проблема была в моем конфигурационном файле .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]
Ответ 8
Я думаю, что использование./вместо/будет работать.