В приложении, нужно сделать перенаправление на определенную страницу (loginpage.php) этого же приложения, если посетитель сайта не соответствует определенным требованиям. По сути всё просто: PHP: <?php header('Location: http://www.example.com/loginpage.php'); exit; ?> Но если данное приложение будет запускаться на разных сайтах, каким образом правильнее всего выполнить такой редирект? Т.е. за ранее не известно домен сайта и протокол http или https Разумеется есть PHP: $_SERVER['HTTP_HOST']; $_SERVER['SERVER_NAME']; Но как я понимаю это не безопасно. PS: Всё это нужно для того, если посетитель захочет зайти в закрытую область сайта т.е. обращается к этой области, его нужно отправить на страницу авторизации, если он не авторизирован.
Редирект ты делаешь правильно, а спрашиваешь не о том. https://php.ru/forum/threads/avtorizacija-teorija.53234/ --- Добавлено --- Если пользователь не авторизован на открытие данной страницы, то по канону правильный ответ будет "статус 403". А если пользователь должен залогиниться (пройти аутентификацию), то да, делай редирект 302 (это так ты здесь показал) https://ru.wikipedia.org/wiki/HTTP#Коды_состояния
Ок, с этим понятно. Но как быть с доменным именем? Немного изменю вопрос: Если приложение будет запускаться на разных сайтах, каким образом правильно сформировать URL для редиректа? Если за ранее не известно доменное имя сайта и протокол http или https. Прописывать его в конфиг, тоже, как по мне, бредовая идея.
@AlexandrS, еще раз глянь статью, под которой есть твои комменты В Location допускается использовать адрес формата /path (все поп. браузеры понимают такой редирект), но по стандарту вроде нужен полный, здесь ты прав. --- Добавлено --- P.S. В дефолтном вирт. хосте при «кривых запросах» $_SERVER['HTTP_HOST'] может быть не определена. Есть еще $_SERVER['SERVER_NAME'].
На тот, который ты посчитал основным. Ф-цию header сам найдешь в коде? --- Добавлено --- P.S. Для твоего случая редирект, конечно, нужен «временный», т.е. см. только на первый параметр ф-ции.
Про это речь? PHP: header('Location: http'.(empty($_SERVER['HTTPS'])?'://':'s://').$_SERVER['HTTP_HOST'].$p,true,301); exit; За исключением кода 301
Да, это естественно Меня просто изначально стопорнуло использование PHP: $_SERVER['HTTP_HOST']; $_SERVER['SERVER_NAME']; По этой причине я и решил уточнить, насколько это будет разумным. Ибо текст : Собственно само понятие "как правило" не является 100% правилом, вот отсюда и возникли вопросы.
Для обычного сайта, расположенного в недефолтном именованном вирт. хосте там точно будет имя хоста или алиаса. Сервер сам использует этот заголовок для определения вирт. хоста, обрабатывающего запрос. Либо он «сымитирует» тебе этот заголовок/переменную для запросов устаревшего формата (когда имя хоста передавалось не в отдельном заголовке, а прямо в строке запроса), либо твой вирт. хост вообще не получит этот запрос. --- Добавлено --- P.S. Помимо алиасов в этой переменной еще могут быть доменные имена в полной форме, т.е. с точкой на конце. --- Добавлено --- Апач для модуля php точки точно не обрезает.
Вообще в данном случае это не критично. Если тебе и подсунут каким-нибудь хитроумным способом в этом заголовке/переменной какую-то хрень, ты их на эту хрень и пошлешь. В прямом смысле: Location --- Добавлено --- Лично я видел «мытарства» с этой переменной в коде наших разрабов только в спец. скриптах типа «мультисайтов».
Обьяви константы в конфиге и используй их. Если надо будет поменять адреса, то это надо будет сделать в одном месте. https://www.php.net/manual/ru/function.define.php
Когда ты пишешь header('Location: ...'); - ты создаешь заголовок ответа, в котором указано, что нужно перейти на такую то страницу. Т е браузер получает от сервера ответ, в котором сказано, что нужно перейти на другую страницу, и делает это. Тебе не нужно знать какой это сайт и по какому протоколу стучится клиент. Ты можешь просто указать путь относительно корня хоста (слэш в начале). PHP: header('Location: /login'); Браузер, получив такой заголовок в ответ на запрос по адресу: Код (Text): https://php.ru/forum/threads/kak-pravilno-sdelat-redirekt.83400/ перейдет на: Код (Text): https://php.ru/login
Но все таки надёжнее. Есть ситуации когда это уместно. Допустим поддомен или свой сдн. Что бы не было проблемы при развороте на другом сервере. Что поповоду переменной сервер это не надёжно. Так как в конфигурации сервера можно изменить данные или вовсе отключить. А вот константу вы не переопределите.