Швидка навігаціяна цій сторінці:
Якщо ви вирішили написати скрипт і зробити редирект PHP, переваги цього кроку очевидні: PHP – серверно орієнтована моваскриптів; перенаправлення виконуватиметься за допомогою скрипта на сервері, а не в браузері відвідувачів. Деякі перенаправлення можуть бути виконані на стороні клієнта через редирект js (тобто через JavaScript редирект).
Це більш гнучкий та універсальний підхід, і ви можете виконати декілька типів редиректу у PHP, на відміну від інших методів. Ось - найбільш часті видиредиректа, які можна зробити в PHP: a) 301 редирект PHP (статус постійного перенаправлення); b) 302 редирект PHP (тимчасовий статус переадресації); с) Оновлення.
Ця стаття буде корисна, в першу чергу, для веб-майстрів-початківців, які шукають способи реалізації перенаправлення URL, якщо це неможливо з використанням інших поширених рішень, таких як Htaccess.
Заголовок мови PHP функції
Наприклад, припустимо, ви хочете зробити редирект до цього URL http://www.somewebsite.com/target.php. У вихідному PHP сторінкиВам просто слід викликати цей скрипт редиректу:
Спробуйте також провести цей простий експеримент на вашому локальному хостингу:
1) Відкрийте текстовий редакторта введіть цей код:
Збережіть його як targetpage.php.
2) Відкрийте інший порожній текстовий файлта введіть цей код:
Збережіть його як originatingpage.php.
3) Тепер запустіть веб-браузер. У адресному рядкубраузера введіть: http://localhost/originatingpage.php
4) Ви помітите, що після натискання кнопки введення, ця URL: http://localhost/originatingpage.php робить редирект на http://localhost/targetpage.php та на targetpage.php, і ви бачите слова «Hi this is codex -x».
Одна з найпоширеніших помилок може бути в оформленні коду htmlредиректу:
Спробуйте виконати цей експеримент:
Перейдіть до скрипту originatingpage.php і додайте будь-який HTML тег:
header('Location: http://localhost/targetpage.php');
Припустимо, у вас є такий код:
2) Збережіть файл.
3) Запустіть знову скрипт originating.php у . Якщо ви не бачите будь-які помилки, ви помітите, що вона, як і раніше, чисто перенаправляє до targetpage.php
4) Тепер спробуйте змінити цільову URL, щоб вказати на реальний сайт, наприклад:
5) Завантажте originatingpage.php на віддалений хостинг у кореневий каталог сайту.
6) Виконайте скрипт у браузері за допомогою виклику originatingpage.php URL, наприклад: http://www.php-developer.org/originatingpage.php
7) Ви помітите, що цього разу ви зіткнетеся з помилкою:
Warning: Cannot modify header information - headers already sent by
Що тут відбувається? Причиною проблеми є те, що у вас уже виведений HTML-код перед заголовком функції.
У чому користь редиректу?
Завдяки редиректу ви можете здійснювати перенаправлення користувачів з однієї веб-сторінки на іншу. Також, якщо, наприклад, на вашому сайті тексти посилань на статті перебувають у непривабливому вигляді (набір цифр або знаків), їх можна змінити, застосувавши транслітерацію та зробивши редирект на ці посилання. Можливості перенаправлення практично необмежені! Користь цього методу підвищення індексації сторінок, поліпшення показників сайту, залучення користувачів очевидна.
(PHP 4, PHP 5, PHP 7)
header — Send a raw HTTP header
Description
header (string $header [, bool $replace = TRUE [, int $http_response_code ]]) : void
header() is used to send a raw HTTP header. See the » HTTP/1.1 specification for more information on HTTP headers.
Remember that header()мусить бути названий протягом будь-якого нового випуску, це означає, що це звичайні HTML tags, blank lines в файлі, або від PHP. It is a very common error для read code with include, or require, функцій, або інший файл access функцій, і мають місця або empty lines, що є output before header() is called.
Існують такі проблеми, коли ви використовуєте один PHP/HTML файл.
/* This will give an error. Note the output
* above, which is before the header() call */
header();
?>
exit;
Parameters
The header string. Там є два спеціальних case header calls. The first is a header that starts with the string " HTTP/ " (case is not significant), який буде використовуватися на малюнку з HTTP статусу коду до send. Для прикладу, якщо ви маєте configured Apache для використання PHP script to handle requests for missing files (using the ErrorDocument
directive), Ви можете зробити, щоб зробити те, що ваш script генерує property status code.
?>
header ("HTTP/1.0 404 Not Found"); Second special case є "Location:" header. Чи не тільки це дає цю версію, то її браузер, але це також returns a REDIRECT 201 (302) status code to the browser unless the or a status code has already been set.
header ( "Location: http://www.example.com/"); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
header();
?>
Replace
Опційна заміна параметрів, які відображають, коли заголовок повинен отримувати попередній подібний заголовок, або призначити другий заголовок того ж типу. By default it will replace, but if you pass in FALSE as the second argument you can force multiple headers of the same type. For example:
header ("WWW-Authenticate: Negotiate");
header ("WWW-Authenticate: NTLM", false);
?>
Http_response_code
Forces the HTTP response code to the specified value. Зауважте, що цей параметр тільки має ефект, якщо він не є empty.
Return Values
No value is returned.
Changelog
Version | Description |
---|---|
5.1.2 | Ця функція now prevents more than one header to be sent at once as protection against header injection attacks. |
Examples
Example #1 Download dialog
Якщо ви збираєтеся користуватися користувачем, щоб захистити вашу інформацію, ви можете скористатися документом, таким чином, щоб створити PDF-файл, ви можете використовувати » » Контент-Disposition header, щоб отримати відповідний filename, а також браузер для того, щоб відобразити save dialog.
// We'll be outputting a PDF
header ( "Content-Type: application/pdf");
// It will be called downloaded.pdf
header ( "Content-Disposition: attachment; filename="downloaded.pdf"");
// The PDF source is in original.pdf
readfile ("original.pdf");
?>
Example #2 Caching directives
PHP scripts often generate dynamic content that must not be cached the client browser or any proxy caches between the server and the client browser. Багато proxies and clients can be forced to disable caching with:
header ( "Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ( "Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in the past
?>
Ви можете дізнатися, що ваші сторінки заборонені навіть якщо ви не можете відповісти на всіх headers. Є номер з опціями, що користувачі можуть бути здатні до налаштування для свого браузера, що змінює його дещо caching behavior. Під час подання headers над, ви повинні заздалегідь any settings що може іншівикликати відтворення вашого script to be cached.
«Ан обsolete version of the HTTP 1.1 specifications (IETF RFC 2616) необхідна для повної absolute URI для реdirection. IETF HTTP working group found that the most popular web browsers tolerate the passing of relative URL and, consequently, the updated HTTP 1.1 specifications (IETF RFC 7231) relaxed the original constraint, allowing the use of relative URLs in Location head.
Workaround: не має двох headers.
Also, be aware that IE versions 5, 6, 7, and 8 double-compress already-compressed files і ні reverse the process correctly, so ZIP файли і подібні є corrupted on download.
Workaround: disable compression (за даними тексту/html) для цих конкретних версій з IE, e.g., використовуючи Apache"s "BrowserMatch" directive.
BrowserMatch ".*MSIE.*" gzip-only-text/html
4. Relative URIs are NOT allowed
wrong: Location: /something.php?a=1
wrong: Location: ?a=1Це буде зробити proxy server і http clients happier.
15 років тому
Якщо ви повинні використовувати, HTTP Response 204 може бути дуже зручним. 204 tells the server to immediately termiante this request. або змінювати поточну веб-сторінку.
Header("status: 204"); (or the other call)
header("HTTP/1.0 204 No Response");15 років тому
A call to session_write_close() before the statement
header ("Location: URL");
exit();
?>
is recommended if you want to be sure the session is updated before proceeding to the redirection.Будь-який об'єкт, де script accessed by redirection wasn"t loading the session correctly because the precedent script hadn"t time to update it (we used a database handler).
9 місяців тому
// Beware, що adding a space між ключовим словом "Location" і колонами causa an Internal Sever Error
//Ці line causa the error
7
header("Location: index.php&controller=produit&action=index");// While It must be written without the space
header("Location: index.php&controller=produit&action=index");1 рік тому
Header call can be misleading to novice php users.
Коли "header call" is stated, it refers the top leftmost position of the file and not "header()" function itself.
"10 років тому
Тут є php script. I wrote to stream a file and crypt it with xor operation on the bytes and with key:
Розробка роботи дуже хороша, але швидкість буде скоротитися за 2, вона є тепер 520KiB/s. User is now asked for a md5 password (інстаїд керування ним в коді безпосередньо). Там є деяка частина в Російській Федерації, коли вона є моїм природним мовленням, як це йти.
// Stream files and encrypt the data on-the-fly
// Settings
// - File to stream
$file = "FILE_out";
// - Reading buffer
$bufferlength = 3840;
// - Key in hex
//$keychar = "9cdfb439c7876e703e307864c9167a15";// Function: Convertion hex key in string в binary
function hex2bin ($h) (
if (! is_string ($h )) return null ;
$ r = array ();
for ($a = 0; ($a * 2)< strlen ($h ); $a ++) {
$ta = hexdec ($h [2 * $a]);
$ tb = hexdec ($ h [(2 * $ a + 1)]);
$r [$a] = (int) (($ta<< 4 ) + $tb );
}
return $r;
}// Function to send the auth headers
function askPassword ($text = "Enter the password") (
header ( "WWW-Authenticate: Basic realm="". utf8_decode ($text). """);
header ("HTTP/1.0 401 Unauthorized");
return 1;
}// Key is asked at the first start
if (!isset($_SERVER ["PHP_AUTH_PW"])) (
askPassword();
echo "Une clé est nécessaire!
" ;
exit;
}
// Get the key in hex
$keychar = $_SERVER ["PHP_AUTH_PW"];// Натисніть клавішу і натисніть кнопку
$ key = hex2bin ($ keychar);
$ keylength = count ($ key);
// Test si la clé est valide en hex
if ($key == "" || $keylength<= 4 ) {
askPassword ("Clé incorrecte!");
//echo "Clé incorrecte!"
";
exit();
}
// Teste si la clé est de longueur d'un puissance de 2
if (($keylength % 2 ) != 0 ) (
askPassword ( "Clé de longueur incorrecte (multiple de 2 uniquement)");
//echo "Clé de longueur incorrecte (puissance de 2 uniquement)
";
exit();
}// Headers
header ( "Content-Type: application/octet-stream; ");
header ( "Content-Transfer-Encoding: binary");
header ("Content-Length: " . filesize ($file ) . "; " );
header ("filename=\"" . $file . "\"; " );
flush (); // this doesn"t really matter.// Opening the file in read-only
$ fp = fopen ($ file, "r");
while (! feof ($ fp ))
{
// Read a buffer size of the file
$buffer = fread ($fp, $bufferlength);
$ j = 0;
for ($i = 0; $i< $bufferlength ; $i ++) {
// The key is read in loop to crypt the whole file
if ($i % $keylength == 0 ) (
$ j = 0;
}
// Apply a xor operation між key and the file to crypt
// Ця операція є на багато CPU часу (Stream 1MiB/s on my server; Intel E2180)
$tmp = pack ("C", $key [$j]);
$bufferE = ($buffer [$ i] ^ $ tmp); //<==== Le fameux XOR/*
echo "
key[".$j."]: ";
var_dump($tmp);
echo "
buffer[".$i."]: ";
var_dump($buffer[$i]);
echo "
bufferE: ";
var_dump($bufferE);
echo "
";
//*/// Send the encrypted data
12:06 - Як перенаправити користувача на іншу сторінку?
echo $bufferE;
// Clean the memory
$bufferE = "";
$j++;
}
$buffer = "";
flush (); // this is essential for large downloads
/*
fclose($fp);
exit();
//*/
}
// Close the file and it"s finished
fclose ($ fp);Є кілька рішень:
1) javascript
2) HTML
3) php
4) .htaccess
1) ось приклад коду мовою javascript:Type="text/javascript">
Вам тільки потрібно створити файл index.htm (або index.html або index.php - ОДИН з них! це важливо) і помістити код до нього, попередньо замінивши http://www.mysite.com/ на адресу вашого сайту.
Можна вказувати шлях до папки або безпосередньо на файл, наприклад http://www.mysite.com/cat/file.phpБраузер користувача буде негайно перенаправлений на вказану вами сторінку.
*якщо браузер підтримує перенаправлення. зараз майже всі браузери підтримують перенаправлення, хіба що якщо браузер хитро налаштований самим користувачем =)Щоб перед перенаправленням показати користувачеві якесь повідомлення, скористайтеся іншою версією скрипта:
type="text/javascript">
Зараз ви будете переміщені!
Якщо Ваш браузер не підтримує перенаправлення, натисніть сюди: %СЮДИ
http://somesite2.com/ - замініть на адресу вашого сайту.
2) Щоб перенаправити браузер користувача засобами HTML, використовуйте тег META:
http://www.blahblahblahsite.com/ -- замініть на адресу вашого сайту
10 означає, що браузер буде перенаправлений через 10 секунд.
Встановіть 0 для негайного перенаправлення.
Якщо ставите таймаут, то у файлі, можете залишити повідомлення користувачу, наприклад:
Через 10 секунд ви будете переміщені!
Якщо Ваш браузер не підтримує перенаправлення, натисніть тут: %СЮДИ
3) Негайне перенаправлення за допомогою PHP:
http://myownsite.com/folder/ -- замініть на свою адресу сайту або сторінки.
Код має бути поміщений у файл з розширенням.php, наприклад index.php4) Негайне перенаправлення за допомогою. htaccess:
Як і будь-яка програма, веб-сервер має певні опції. Але, у вас, як користувача Апача може і не має рації змінювати конфігурацію Апача через його головні файли, дія яких поширюється на всіх користувачів цього сервера. Але, ви можете міняти деякі конфігураційні файли, які розповсюджують свою дію лише на ваш сайт. Один із таких файлів – .htaccess
Це файл гнучкого настроювання веб-сервера Апач. "Гнучкий" позначає, що як тільки ви змінили щось у цьому файлі, зміни відразу набирають чинності. Фактично, мета.htaccess файлів полягає в наданні коштів для налаштування Apache для користувачів, які не можуть змінити основний конфігураційний файл httpd.conf (цей файл є головним файлом конфігурації сервера Апач і його дії поширюються повністю на всіх користувачів даної копії Апача).
Цей файл не доступний веб-користувачу з браузера. Якщо файл.htaccess розташований у кореневій директорії сервера, то його дії поширюється на весь сервер, крім тих папок, де знаходиться інший файл.htaccess (і крім усіх папок "нижче" цієї папки з другим.htaccess).
Конфігурація файлу.htaccess може допомогти вам у різних ситуаціях, але навіть найменша помилка синтаксису (наприклад, відсутність пробілу там, де це потрібно) може призвести до того, що зміст вашого сайту може некоректно відображатися або не відображатися взагалі. Так як.htaccess це прихований системний файл, будь ласка, переконайтеся, що ваш FTP-клієнт налаштований на відображення прихованих файлів.
Створіть порожній текстовий файл за допомогою текстового редактора, наприклад Блокнота, та збережіть його як htaccess.txt. Причина, за якою необхідно зберегти файл в htaccess.txt в тому, що багато операційних систем і FTP програм не можуть читати.htaccess файли за замовчуванням. Після завантаження на сервер ви можете перейменувати файл в.htaccess.
Перенаправлення всього сайту на будь-який інший домен (наприклад, example.net перенаправлено на example.com).
Надіслати кожен може. А ось правильно перенаправити це ціле мистецтво. Але ще важче передається направлення користувачів на потрібний шлях в інтернеті. Для цього найкраще підходить редирект на php.
Що за редирект?
У веб-програмуванні виникають ситуації, коли потрібно перенаправити користувача, що переходить за посиланням, на іншу адресу. Звісно, на перший погляд реалізація такого перенаправлення виглядає дещо «незаконною». На практиці ж такий редирект затребуваний не лише серед зловмисників, а й серед чесних вебмайстрів:
У яких випадках може знадобитися редирект:
- Коли відбувається заміна движка сайту – внаслідок цього змінюється архітектура всього ресурсу. Після чого виникає проблема, як зробити редирект;
- При перекроюванні структури ресурсу відбувається додавання, видалення або перенесення цілих розділів або одного матеріалу. Поки відбувається цей процес, можна організувати перенаправлення користувача на потрібний розділ;
- Якщо сайт нещодавно змінив своє доменне ім'я – після зміни імені домену старе ще деякий час фігуруватиме у пошуковій видачі. У цьому випадку редирект користувача новий домен буде реалізований пошуковою системою автоматично;
- У процесі авторизації – як правило, на великому сайті є дві групи користувачів: звичайні відвідувачі та адміністратори ресурсу. У такому разі має сенс реалізувати редирект кожного користувача відповідно до його прав та ролі. Після авторизації адміністратор або модератори сайту потрапляють в адміністративну частину ресурсу, а відвідувачі – на частину користувача ресурсу.
Особливості редиректу на php
На відміну від інших мов php має деякі переваги в реалізації редиректу:
- PHP є серверною мовою програмування. Тому перенаправлення відбуватиметься не в html коді сторінок, що відображаються у браузері, а в скрипті, розміщеному на сервері;
- Редирект на php може бути реалізований декількома способами. Що багато в чому розширює його застосування;
- Завдяки обробці даних на сервері перенапрямок, реалізований за допомогою php, менш сприйнятливий до дії фільтрів пошукових систем.
Для редиректу php використовується функція header() . Вона застосовується для надсилання заголовка http. Її синтаксис:
void header (string $string[, bool $replace = true [, int $http_response_code ]])
Аргументи, що приймаються функцією:
- string $string- Рядок заголовка;
Існує два типи цього аргументу. Перший призначений для надсилання коду стану з'єднання. Він починається з "HTTP/". Інший тип разом із заголовком передає клієнтському браузеру код стану (REDIRECT 302). Цей аргумент починається з "Location:"
- bool $replace – необов'язковий атрибут типу bool . Відповідає за перевизначення попереднього заголовка. Якщо буде встановлено true , то попередній заголовок або заголовки одного типу будуть замінені. Якщо в аргументі задано false, то перезапис заголовка не відбудеться. За замовчуванням встановлено значення true ;
- http_response_code – аргумент примусово встановлює код відповіді HTTP. Встановлення коду буде успішно за умови, що аргумент string не буде порожнім.
Код стану HTTP є частиною верхнього рядка відповіді сервера. Код складається з трьох цифр, після яких йде напис англійською мовою. Перша цифра відповідає за клас стану. Редиректу відповідають коди від 300 до 307. Їхній повний опис можна знайти у відповідній технічній документації.
При використанні функції header() для редагування зовнішніх посилань велике значення має місце розташування її виклику. У коді він повинен знаходитися вище за всі теги html :
Застосування редиректу header()
Для демонстрації дії функції на локальному сервері потрібно створити два файли. Один з них назвемо redirect.php, а інший redirect2.php. Усередині першого розмістимо виклик функції у такому форматі:
В іншому файлі розміщуємо рядок:
echo "Привіт! Ви знаходитесь у файлі redirect2.php";
Ще кілька практичних прикладів використання редиректу на php:
- Примусова передача коду стану http – під час використання першого аргументу функції header() типу « location» за промовчанням в заголовок передається код стану « 302 » ( тимчасово переміщено). Це може стати проблемою при перенесенні ресурсу на інше доменне ім'я. У пошукових системах такий тимчасовий перенапрямок може затягнутися. Адже пошуковик постійно аналізує код стану. А в ньому записано « тимчасово переміщено». Приклад примусового перезапису коду стану 302 » на « 301 » ( постійно переміщено):
Також перезапис можливий у два етапи. Перший рядок перезаписує код стану, а другий перенаправляє на нову адресу:
- Використання редагування зовнішніх посилань для перенаправлення в залежності від ролі користувача. Роль визначається під час процедури автентифікації. Значення обробки записується в змінну $who :
- Спрощений практичний приклад реалізації редиректу зовнішнього заслання – клік на засланні веде на сторінку php . Звідси користувача за 5 секунд перекидає на Рамблер. Код html:
Натисни мене
Код файлу redirect3.php:
Ну, ось ми й навчилися основ редиректу на php. Тепер можна сміливо братися за перенаправлення користувачів у потрібне русло. Головне не помилитися у напрямку, а то приведете всіх своїх користувачів на чужий сайт.