За последние 24 часа нас посетил 20171 программист и 1084 робота. Сейчас ищут 845 программистов ...

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

Тема в разделе "PHP для новичков", создана пользователем AlexandrS, 27 янв 2020.

  1. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    В приложении, нужно сделать перенаправление на определенную страницу (loginpage.php) этого же приложения, если посетитель сайта не соответствует определенным требованиям.
    По сути всё просто:
    PHP:
    1. <?php
    2. header('Location: http://www.example.com/loginpage.php');
    3. ?>
    Но если данное приложение будет запускаться на разных сайтах, каким образом правильнее всего выполнить такой редирект?
    Т.е. за ранее не известно домен сайта и протокол http или https

    Разумеется есть
    PHP:
    1. $_SERVER['HTTP_HOST'];
    2. $_SERVER['SERVER_NAME'];
    Но как я понимаю это не безопасно.

    PS: Всё это нужно для того, если посетитель захочет зайти в закрытую область сайта т.е. обращается к этой области, его нужно отправить на страницу авторизации, если он не авторизирован.
     
    #1 AlexandrS, 27 янв 2020
    Последнее редактирование: 27 янв 2020
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.068
    Симпатии:
    1.231
    Адрес:
    там-сям
    Редирект ты делаешь правильно, а спрашиваешь не о том.
    https://php.ru/forum/threads/avtorizacija-teorija.53234/
    --- Добавлено ---
    Если пользователь не авторизован на открытие данной страницы, то по канону правильный ответ будет "статус 403".
    А если пользователь должен залогиниться (пройти аутентификацию), то да, делай редирект 302 (это так ты здесь показал)

    https://ru.wikipedia.org/wiki/HTTP#Коды_состояния
     
    miketomlin и AlexandrS нравится это.
  3. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Ок, с этим понятно. Но как быть с доменным именем?

    Немного изменю вопрос:
    Если приложение будет запускаться на разных сайтах, каким образом правильно сформировать URL для редиректа?
    Если за ранее не известно доменное имя сайта и протокол http или https.
    Прописывать его в конфиг, тоже, как по мне, бредовая идея.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    @AlexandrS, еще раз глянь статью, под которой есть твои комменты ;)

    В Location допускается использовать адрес формата /path (все поп. браузеры понимают такой редирект), но по стандарту вроде нужен полный, здесь ты прав.
    --- Добавлено ---
    P.S. В дефолтном вирт. хосте при «кривых запросах» $_SERVER['HTTP_HOST'] может быть не определена. Есть еще $_SERVER['SERVER_NAME'].
     
    AlexandrS нравится это.
  5. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Честно сказать не совсем понимаю на какой мой вопрос там ответ :oops:
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    На тот, который ты посчитал основным. Ф-цию header сам найдешь в коде? :)
    --- Добавлено ---
    P.S. Для твоего случая редирект, конечно, нужен «временный», т.е. см. только на первый параметр ф-ции.
     
    AlexandrS нравится это.
  7. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Про это речь?
    PHP:
    1. header('Location: http'.(empty($_SERVER['HTTPS'])?'://':'s://').$_SERVER['HTTP_HOST'].$p,true,301);
    2.   exit;
    За исключением кода 301
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Второй параметр тоже не нужен. Он, видимо, тут указан явно из-за наличия третьего.
     
    AlexandrS нравится это.
  9. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Да, это естественно :)
    Меня просто изначально стопорнуло использование
    PHP:
    1. $_SERVER['HTTP_HOST'];
    2. $_SERVER['SERVER_NAME'];
    По этой причине я и решил уточнить, насколько это будет разумным.
    Ибо текст :
    Собственно само понятие "как правило" не является 100% правилом, вот отсюда и возникли вопросы.
     
    #9 AlexandrS, 27 янв 2020
    Последнее редактирование: 27 янв 2020
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Для обычного сайта, расположенного в недефолтном именованном вирт. хосте там точно будет имя хоста или алиаса. Сервер сам использует этот заголовок для определения вирт. хоста, обрабатывающего запрос. Либо он «сымитирует» тебе этот заголовок/переменную для запросов устаревшего формата (когда имя хоста передавалось не в отдельном заголовке, а прямо в строке запроса), либо твой вирт. хост вообще не получит этот запрос.
    --- Добавлено ---
    P.S. Помимо алиасов в этой переменной еще могут быть доменные имена в полной форме, т.е. с точкой на конце.
    --- Добавлено ---
    Апач для модуля php точки точно не обрезает.
     
    AlexandrS нравится это.
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Вообще в данном случае это не критично. Если тебе и подсунут каким-нибудь хитроумным способом в этом заголовке/переменной какую-то хрень, ты их на эту хрень и пошлешь. В прямом смысле: Location :D
    --- Добавлено ---
    Лично я видел «мытарства» с этой переменной в коде наших разрабов только в спец. скриптах типа «мультисайтов».
     
    AlexandrS нравится это.
  12. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Обьяви константы в конфиге и используй их. Если надо будет поменять адреса, то это надо будет сделать в одном месте.
    https://www.php.net/manual/ru/function.define.php
     
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Когда ты пишешь header('Location: ...'); - ты создаешь заголовок ответа, в котором указано, что нужно перейти на такую то страницу.
    Т е браузер получает от сервера ответ, в котором сказано, что нужно перейти на другую страницу, и делает это.
    Тебе не нужно знать какой это сайт и по какому протоколу стучится клиент. Ты можешь просто указать путь относительно корня хоста (слэш в начале).
    PHP:
    1. header('Location: /login');
    Браузер, получив такой заголовок в ответ на запрос по адресу:
    Код (Text):
    1. https://php.ru/forum/threads/kak-pravilno-sdelat-redirekt.83400/
    перейдет на:
    Код (Text):
    1. https://php.ru/login
     
    AlexandrS нравится это.
  14. AlexandrS

    AlexandrS Активный пользователь

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Выше писал по этому поводу:
    Т.е. я понимаю, что это можно сделать, но не нужно!
     
  15. onderbert

    onderbert Новичок

    С нами с:
    24 мар 2019
    Сообщения:
    18
    Симпатии:
    1
    Но все таки надёжнее. Есть ситуации когда это уместно. Допустим поддомен или свой сдн. Что бы не было проблемы при развороте на другом сервере. Что поповоду переменной сервер это не надёжно. Так как в конфигурации сервера можно изменить данные или вовсе отключить. А вот константу вы не переопределите.