2010-01-21 94 views
117

Может ли PHP сделать вызов перенаправления после выполнения функции? Я создаю функцию, по завершении которой я хочу, чтобы она перенаправляла файл, расположенный в той же корневой папке. Это можно сделать?PHP page redirect

if { 
     //i am using echo here 
} 

else if ($_SESSION['qnum'] > 10) { 
      session_destroy(); 
      echo "Some error occured."; 
      //redirect to user.php 
     } 
+0

Я поиск по этому поводу, и я нашел этот ответ, связанные в http://stackoverflow.com/questions/13539752/redirect-function/13539808 – user1972007

ответ

216

Да, вы использовали бы функцию header.

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */ 
exit(); 

Это хорошая практика, чтобы назвать exit() правильные послесловия, так что код ниже него не получает казнены.

Кроме того, из документации:

Помните, что заголовок() должна вызываться перед любой фактический вывод направляется, либо с помощью обычных HTML-теги, пустые строки в файле, или из PHP. Очень распространенной ошибкой является чтение кода с функциями include() или require(), функций или другой функции доступа к файлам, а также пробелы или пустые строки, которые выводятся перед вызовом header(). Та же проблема существует при использовании одного файла PHP/HTML.

Это означает, что вы не должны эха ничего перед функцией header(), так как это, скорее всего, вызовет ошибку. Кроме того, вам нужно будет убедиться, что этот код запускается и перед любым другим выходом.

+0

Вы также должны установить HTTP-статус на 302. –

+7

«Второй особый случай - это заголовок« Местоположение: ». Он не только отправляет этот заголовок обратно в браузер, но также возвращает код состояния REDIRECT (302) браузера, если код состояния 201 или 3xx уже не установлен ». – colithium

+2

Меня беспокоит «послесловие». –

-1

header() функция делает это:

 
header("Location: user.php"); 
+0

Используйте абсолютные URL-адрес в соответствии со спецификацией HTTP. – Gumbo

+0

Верно, но сначала убедитесь, что вы удалили эхо, или вы можете столкнуться с «Заголовками allready send»;) – fijter

0

Да.

По сути, пока ничего не выводится, вы можете делать все, что хотите (убить сеанс, удалить файлы cookie пользователя, вычислить цифры Pi до 'n' и т. Д.) До выпуска заголовка местоположения.

7
header("Location: http://www.domain.com/user.php"); 

Но вы не можете сначала сделать эхо, а затем перенаправить.

+0

, пожалуйста, см. Редактирование. – amit

44

Использование javascript как отказоустойчивого будет гарантировать, что пользователь перенаправлен (даже если заголовки уже отправлены). Здесь вы идете:

// $url should be an absolute url 
function redirect($url){ 
    if (headers_sent()){ 
     die('<script type="text/javascript">window.location=\''.$url.'\';</script‌​>'); 
    }else{ 
     header('Location: ' . $url); 
     die(); 
    }  
} 

Если вам нужно правильно обрабатывать относительные пути, я написал функцию, что (но это выходит за рамки данного вопроса).

+1

это действительно не работает. – amit

+7

как описательно. – brianreavis

+7

Измените эту строку на это, и она будет ... 'die ('');' – Gabe

0

Я бы, вероятно, установил сообщение как переменную сеанса, перенаправил пользователя на другую страницу, которая отображает сообщение и уничтожает сеанс.

0

Функция header() в PHP делает это, но убедитесь, что вы вызываете ее, прежде чем любое другое содержимое файла будет отправлено в браузер, иначе вы получите сообщение об ошибке.

JavaScript является альтернативой, если вы уже отправили содержимое файла.

8
$url='the/url/you/want/to/go'; 
    echo '<META HTTP-EQUIV=REFRESH CONTENT="1; '.$url.'">'; 

это работает для меня хорошо.

+1

это тоже работает для меня. Спасибо – Kyrie

+0

Работаю также для меня –

+0

Да, это была спасательная жизнь для меня; Я динамически заполняю заголовки страниц и идентификаторы тела из заголовка, поэтому независимо от того, я всегда отправлял заголовки. И для меня это всего лишь бот-ответ веб-формы. Хороший, спасибо. – SteveCinq

0

Фактически, я нашел это в коде php на основе cms.

redirect ('? Module = blog', 0);

так можно. В этом случае вы вошли в систему на уровне администратора, поэтому никакого вреда не фол (я полагаю). первая часть - это URL, а вторая? Я не могу найти документацию для целого числа, но я думаю, что это либо время, либо данные, поскольку они привязаны к форме.

Я также хотел обновить страницу после события, и это было лучше, если бы это было хорошо.

0

Вы можете использовать этот код для перенаправления в php

<?php 
/* Redirect browser */ 
header("Location: http://example.com/"); 
/* Make sure that code below does not get executed when we redirect. */ 
exit; 
?> 
9

Простой способ заключается в использовании:

echo '<script>window.location.href = "the-target-page.php";</script>'; 
+0

Это уже упоминалось в другом ответе. Что нового добавить в тему? –

3
<?php 

    http_redirect("relpath", array("name" => "value"), true, HTTP_REDIRECT_PERM); 

?> 
0

, если вы хотите включить перенаправление в файл PHP без того, он вверху, вы можете активировать буферизацию вывода вверху, а затем перенаправить вызов из любой точки страницы. Пример;

<?php 
ob_start(); //first line 
... do some work here 
... do some more 
header("Location: http://www.yourwebsite.com/user.php"); 
exit(); 
... do some work here 
... do some more 
0

Как metioned по nixxx добавления ob_start() перед добавлением кода PHP предотвратит заголовки уже прислал сообщение об ошибке.

Он работал для меня

Код ниже и работает. Но сначала загружает страницу, а затем перенаправляет, когда я ее использую.

echo '<META HTTP-EQUIV=REFRESH CONTENT="1; '.$redirect_url.'">';