Перенаправления в PHP

Если я хочу перенаправить пользователя в PHP, все, что я когда-либо знал, это использовать header('Location:' http://www.example.com), но я читал, что это не лучший способ внутреннего перенаправления пользователя со страницы на страницу. Какие еще варианты вы можете перенаправить пользователя?

Пример: внизу написано:

Something Important to Remember
...I don’t recommend, for example, using header() to bounce your users around to different pages; there are better methods that reduce the number of page loads and give the user a more fluid experience...

http://tinsology.net/2009/06/creating-a-secure-login-system-the-right-way/


person Howdy_McGee    schedule 01.08.2011    source источник
comment
вы также можете перенаправить со стороны клиента: window.url = 'newUrl';   -  person ThatGuy    schedule 01.08.2011


Ответы (5)


Фрагмент, который вы предоставили, относится к проблемам, когда page1.php может выполнить некоторый код, за которым следует header('Lodation: http://www.example.com/page2.php');, и когда page2.php затем выполняет некоторый код, за которым следует header('Location: http://www.example.com/page3.php'); и т. д. Это очень плохо для взаимодействия с пользователем и не очень хорошо для управления код же.

В тех случаях, когда вам действительно нужно перенаправить пользователя (наиболее распространенной является переадресация 301), использование header вполне допустимо.

person zzzzBov    schedule 01.08.2011
comment
Я не совсем понимаю разницу в том, что вы говорите. Вы имеете в виду, что не должно быть 2 редиректов подряд? - person Howdy_McGee; 01.08.2011
comment
@Howdy_McGee, несколько перенаправлений или перенаправлений, когда включение было бы более подходящим, являются проблемами. Новички довольно часто создают php-страницу для выполнения очень конкретной задачи, а затем вместо использования include пытаются использовать header для перехода пользователя на другую страницу. Обычно я избегаю заголовков, если только не решу, что мне нужно отправить браузеру определенный заголовок. Если страница перемещена навсегда, используйте заголовок перенаправления 301 и новое местоположение, если ресурс не был найден, отправьте заголовок 404 и, возможно, заполните страницу картой сайта. - person zzzzBov; 01.08.2011
comment
Я вижу, я стараюсь избегать использования «включает», если я не включаю header.php или footer.php, потому что, насколько я понимаю, он загружает все внутри «включает», даже php, что может испортить время загрузки. Я понимаю, что вы говорите, хотя с 301 и 404. Я думаю, что javascript является моим базовым вариантом при перенаправлении на пользовательскую страницу ошибки, как указано выше. - person Howdy_McGee; 01.08.2011
comment
@Howdy_McGee, includes — лучший способ сделать PHP модульным. Они очень быстрые. Если вы создаете целую библиотеку, вы должны поместить классы и функции в их собственные сценарии или, по крайней мере, объединить их в группы похожих функций. Если вы смешиваете логику отображения с бизнес-логикой, вам следует ознакомиться с парадигмой MVC (Model View Controller), потому что смешивание представления с контроллером — плохая идея. - person zzzzBov; 01.08.2011

Это неплохо. Однако вы можете добавить код ответа 301, чтобы сделать его лучше, Google также лучше определит, что ему больше не следует посещать этот «старый» сайт.

<?php
Header( "HTTP/1.1 301 Moved Permanently" ); 
Header( "Location: http://www.new-url.com" ); 
?> 
person genesis    schedule 01.08.2011
comment
А что, если это просто сделать какой-то код, а затем перенаправить вместо постоянного перенаправления? - person Howdy_McGee; 01.08.2011
comment
поэтому используйте его перед этим заголовком и после этого поместите туда этот код (2-я строка) - person genesis; 01.08.2011

Это общепринятый метод перенаправления на основе PHP. Если вы можете выполнить перенаправление до выполнения PHP-скрипта, то вам следует это сделать — через .htaccess или псевдонимы на уровне сервера.

Ознакомьтесь с руководством по header: http://php.net/manual/en/function.header.php

person Chris Baker    schedule 01.08.2011

Всегда разумно избегать внутреннего использования header(), потому что иногда заголовки уже вызываются. Перенаправления JavaScript абсолютно хороши и систематически используются во многих веб-приложениях. Браузеры и поисковые системы не дискриминируют и не одобряют перенаправления JavaScript. Простой пример:

<?php echo '<script type="text/javascript">window.location.href="index.php"</script>'; ?>

Или с помощью переменной:

<?php echo '<script type="text/javascript">window.location.href="' . $page . '"</script>'; ?>
person hohner    schedule 01.08.2011
comment
Ну, если это правда, это кажется лучшим ответом, если только кто-то не хочет с этим спорить. - person Howdy_McGee; 01.08.2011
comment
Перенаправления JavaScript — это худший способ выполнения перенаправлений. Вы должны знать, были ли вызваны заголовки или нет, исходя из того, использовали ли вы вызов header или отправляли ли вы какие-либо выходные данные с помощью echo или аналогичного. Если вы частично отправили вывод пользователю, зачем вам отвлекать его от этих данных? Кроме того, любой пользователь без включенного JavaScript не сможет выполнить перенаправление. Я также хотел бы увидеть подтверждение о SEO для перенаправлений JS. - person zzzzBov; 01.08.2011
comment
@Джейми, вы не всегда знаете, использовал ли сценарий ранее функцию header() или нет О чем вы говорите?! Конечно, вы можете определить, были ли отправлены заголовки. - person zzzzBov; 02.08.2011

Просто используйте

header("Location: http://www.example.com");
person Mark    schedule 01.08.2011
comment
Это не объясняет, почему или если это плохо - person genesis; 01.08.2011
comment
Я думаю, что автор примеров пытается сказать, что то, что он написал, это просто примеры, как он и сказал. В большинстве случаев в примере нет необходимости делать перенаправление. - person Mark; 01.08.2011