Как сделать перенаправление в PHP?

Можно ли перенаправить пользователя на другую страницу с помощью PHP?

Скажите, что пользователь перешел на сайт www.example.com/page.php и я хочу перенаправить их на www.example.com/index.php , как бы мне это сделать без использования метаобновления? Возможное?

Это может даже защитить мои страницы от неавторизованных пользователей.

Резюме существующих ответов плюс мои собственные два цента:

1. Основной ответ

Вы можете использовать функцию header () для отправки нового HTTP-заголовка, но это должно быть отправлено в браузер перед любым HTML или текстом (например, перед объявлением <!DOCTYPE ...> ).

 header('Location: '.$newURL); 

2. Важные подробности

die () или exit ()

 header("Location: http://example.com/myOtherPage.php"); die(); 

Почему вы должны использовать die() или exit() : The Daily WTF

Абсолютный URL

URL должен быть абсолютным. См. RFC 2616 . Но в большинстве случаев будет принят и относительный URL.

Коды состояния

PHP «Location» -header по-прежнему использует HTTP-302 -редакторный код, но это не тот, который вы должны использовать. Вы должны рассмотреть либо 301 (постоянная переадресация), либо 303 (другое).

Примечание: W3C упоминает, что заголовок 303 несовместим с «многими пользовательскими агентами pre-HTTP / 1.1. В настоящее время используемыми браузерами являются все пользовательские агенты HTTP / 1.1. Это неверно для многих других пользовательских агентов, таких как пауки и роботы.

3. Документация

Заголовки HTTP и функция header () в PHP

  • Что говорится в руководстве по PHP
  • Что говорит Википедия
  • Что говорит W3C

4. Альтернативы

Вы можете использовать альтернативный метод http_redirect ($ url); который требует установки пакета PECL .

5. Вспомогательные функции

Эта функция не включает код статуса 303:

 function Redirect($url, $permanent = false) { header('Location: ' . $url, true, $permanent ? 301 : 302); exit(); } Redirect('http://example.com/', false); 

Это более гибко:

 function redirect($url, $statusCode = 303) { header('Location: ' . $url, true, $statusCode); die(); } 

6. Обходной путь

Как упоминалось, header () перенаправляет работу только до того, как все будет выписано. Обычно они выходят из строя, если вызывается inmidst вывод HTML . Тогда вы можете использовать обход HTML-заголовка (не очень профессиональный!), Например:

  <meta http-equiv="Location" content="http://example.com/"> 

Или Javascript перенаправляет даже.

 window.location.replace("http://example.com/"); 
 function Redirect($url, $permanent = false) { if (headers_sent() === false) { header('Location: ' . $url, true, ($permanent === true) ? 301 : 302); } exit(); } Redirect('http://www.google.com/', false); 

Не забудьте умереть () / exit ()!

Вывод JavaScript из PHP с использованием эха, который будет выполнять эту работу.

 echo '<script type="text/javascript"> window.location = "http://www.google.com/" </script>'; 

Вы не можете сделать это на PHP, если не буферизовать вывод страницы, а затем проверить условие переадресации. Это может быть слишком много хлопот. Помните, что заголовки – это первое, что отправлено со страницы. Большая часть перенаправления обычно требуется позже на странице. Для этого вам нужно буферизировать весь вывод страницы и позже проверить состояние переадресации. В этот момент вы можете либо перенаправить заголовок пользователя страницы (), либо просто эхо-буферизованный вывод.

Подробнее о буферизации (преимуществах)

Что такое буферизация вывода?

Используйте функцию header() для отправки заголовка HTTP-заголовка :

 header('Location: '.$newURL); 

Вопреки мнению некоторых, die() имеет ничего общего с перенаправлением. Используйте его только в том случае, если вы хотите перенаправить вместо обычного выполнения.

example.php:

 <?php header('Location: static.html'); $fh = fopen('/tmp/track.txt','a'); fwrite($fh, $_SERVER['REMOTE_ADDR'].' '.date('c')."\n"); fclose($fh); ?> 

Результат или 3 исполнения:

 bart@hal9k:~> cat /tmp/track.txt 127.0.0.1 2009-04-21T09:50:02+02:00 127.0.0.1 2009-04-21T09:50:05+02:00 127.0.0.1 2009-04-21T09:50:08+02:00 

Возобновление – обязательный die() / exit() – это некоторая городская легенда, которая не имеет никакого отношения к фактическому PHP. Не имеет никакого отношения к клиенту «уважая» Location: header. Отправка заголовка не останавливает выполнение PHP, независимо от используемого клиента.

Большинство из этих ответов забывают о очень важном шаге!

 header("Location: myOtherPage.php"); die(); 

Оставив эту жизненно важную вторую строку, вы увидите, что вы попали в The Daily WTF . Проблема в том, что браузеру не нужно уважать заголовки, которые возвращают ваша страница, поэтому при игнорировании заголовков остальная часть страницы будет выполнена без перенаправления.

1. Использование функции заголовка с exit()

 <?php header('Location: target-page.php'); exit(); ?> 

но если вы используете функцию заголовка, то несколько раз вы получите сообщение «warning like header уже send», которое не будет эхо или распечатываться перед отправкой заголовков, или вы можете просто использовать функцию die() или exit() после функции заголовка.

,

2. Без заголовка

 <?php echo "<script>location.href='target-page.php';</script>"; ?> 

здесь вы не столкнетесь с какой-либо проблемой

3. Использование функции заголовка с ob_start() и ob_end_flush()

 ob_start(); //this should be first line of your page header('Location: target-page.php'); ob_end_flush(); //this should be last line of your page 
 <?php header('Location: another-php-file.php'); exit(); ?> 

или если вы уже открыли теги php, используйте это:

 header('Location: another-php-file.php'); exit(); 

Вы также можете перенаправить на внешние страницы, например:

 header('Location: https://www.google.com'); exit(); 

Убедитесь, что вы включили exit() или include die()

Многие из этих ответов верны, но они предполагают, что у вас есть абсолютный URL-адрес, что может и не быть. Если вы хотите использовать относительный URL-адрес и генерировать остальные, вы можете сделать что-то вроде этого …

 $url = 'http://' . $_SERVER['HTTP_HOST']; // Get the server $url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory $url .= '/your-relative/path-goes/here/'; // <-- Your relative path header('Location: ' . $url, true, 302); // Use either 301 or 302 

Я уже ответил на этот вопрос, но я сделаю это снова, так как между тем я узнал, что есть особые случаи, если вы работаете в CLI (перенаправления не могут произойти и, следовательно, не должны exit() ), или если на вашем веб-сервере работает PHP как (F) CGI (для правильной переадресации требуется предварительно настроенный заголовок Status ).

 function Redirect($url, $code = 302) { if (strncmp('cli', PHP_SAPI, 3) !== 0) { if (headers_sent() !== true) { if (strlen(session_id()) > 0) // if using sessions { session_regenerate_id(true); // avoids session fixation attacks session_write_close(); // avoids having sessions lock other requests } if (strncmp('cgi', PHP_SAPI, 3) === 0) { header(sprintf('Status: %03u', $code), true, $code); } header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302); } exit(); } } 

Я также рассмотрел вопрос о поддержке различных кодов перенаправления HTTP ( 301 , 302 , 303 и 307 ), поскольку он был рассмотрен в комментариях к моему предыдущему ответу, вот описания:

  • 301 – Постоянно перемещается
  • 302 – найдено
  • 303 – Смотреть другие
  • 307 – Временная переадресация (HTTP / 1.1)
 header("Location: /index.php"); exit(0); 

header( 'Location: http://www.yoursite.com/new_page.html' );

вы можете использовать некоторые java-скриптовые методы, например, ниже

  1)self.location="http://www.example.com/index.php"; 2)window.location.href="http://www.example.com/index.php"; 3)document.location.href = 'http://www.example.com/index.php'; 4)window.location.replace("http://www.example.com/index.php"); 

Вы можете использовать переменные сеанса для контроля доступа к страницам и авторизации действительных пользователей.

 <?php session_start(); if ( !isset( $_SESSION["valid_user"]) ) { header("location:../index"); } // Page goes here ?> 

http://php.net/manual/en/reserved.variables.session.php

Как и другие здесь, вы отправили заголовок местоположения:

 header( "Location: http://www.mywebsite.com/otherpage.php" ); 

но вам нужно сделать это, прежде чем отправлять какой-либо другой вывод в браузер.

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

Накануне семантической сети правильность – это то, что нужно учитывать. К сожалению, PHP-адрес «Location» -header по-прежнему использует HTTP-302 -правовой код, который, строго говоря, не самый лучший для перенаправления. Вместо него он должен использовать 303 .

W3C достаточно любезен, чтобы упомянуть, что 303-заголовок несовместим со «многими пользовательскими агентами до HTTP / 1.1», что в настоящее время не будет использовать браузер. Таким образом, 302 является реликвией, которая не должна использоваться.

… или вы могли просто игнорировать его, как и все остальные …

Наверное, слишком поздно, чтобы ответить на этот вопрос. Тем не менее, вот мои мысли:

ИМХО, лучший способ перенаправить входящий запрос – это использовать заголовки местоположений, которые идут

 <?php header("Location: /index.php"); ?> 

После того, как этот оператор будет выполнен, а вывод отправлен, браузер начнет перенаправлять пользователя. Однако убедитесь, что перед отправкой заголовков не было никакого выхода (любого echo / var_dump), иначе это приведет к ошибкам.

Хотя это быстрый и грязный способ достичь того, что изначально было задано, но в конечном итоге это станет катастрофой для SEO, так как этот тип перенаправления всегда интерпретируется как перенаправление 301/302, поэтому поисковые системы будут всегда просматривайте свою индексную страницу как перенаправленную страницу, а не страницу целевой страницы / главной страницы. Следовательно, это повлияет на настройки SEO на веб-сайте.

Лучший способ перенаправления с PHP – это следующий код …

  header("Location: /index.php"); 

Убедитесь, что код не будет работать после

 header("Location: /index.php"); 

Все коды должны быть выполнены до указанной выше строки.

Предположим,

Дело 1:

 echo "I am a web developer"; header("Location: /index.php"); 

Он правильно перенаправит место (index.php).

Случай 2:

 return $something; header("Location: /index.php"); 

Вышеупомянутый код не будет перенаправлен на местоположение (index.php).

Надеюсь, это понятно.

 <?php header('Location: redirectpage.php'); header('Location: redirectpage.php');exit(); echo "<script>location.href='redirectpage.php';</script>"; ?> 

Это регулярный и обычный PHP-переадресация, но вы можете перенаправить страницу с несколькими секундами ожидания ниже кода:

 <?php header('refresh:5;url=redirectpage.php '); //Note: here 5 means 5 seconds wait for redirect. ?> 

Да, можно использовать PHP, мы перенаправимся на другую страницу, попробуем это:

 <?php header("location:./");//redirect to index file header("location:index.php");//redirect to index file header("location:example.php"); ?> 

Да, вы можете использовать функцию header ()

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

А также наилучшей практикой является вызов функции exit () сразу после функции header() чтобы избежать выполнения кода.

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

вы можете обновить заголовок в заголовке php:

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

 ob_start(); header("Location: ".$website); ob_end_flush(); 

Если вы используете Apache, вы также можете использовать .htaccess для перенаправления.

 Redirect 301 / http://new-site.com/ 
 <?php $url = "targetpage" Function redirect$url(){ If (headers_sent()) == false{ Echo '<script>window.location.href="' . $url . '";</script>'; }} ?>