Получить полный URL-адрес в PHP для перенаправления на SSL

У меня есть некоторые PHP-страницы, для которых требуется принудительное SSL. Я не хочу делать это с помощью mod_rewrite или что-то в этом роде, я хочу сохранить всю логику в PHP. Прямо сейчас у меня есть код, который выглядит так:

 if ($ _ SERVER ["HTTPS"]! = "on") {
     header («HTTP / 1.1 301 перемещен постоянно»);
     header ("Location: https: //". $ _SERVER ["SERVER_NAME"]. $ _SERVER ["REQUEST_URI"]);
     Выход();
 } 

Однако это не работает, поскольку имя сервера является общим, поскольку я размещаю несколько сайтов с разными именами доменов. Таким образом, SERVER_NAME является «www». Вышеупомянутый код будет перенаправлен на https: //www/index.php, который недопустим.

Я попробовал print_r ($ _ SERVER), чтобы увидеть доступные мне переменные, но ни один из них не дал мне полный запрос URI (http://example.com/index.php), а следующий ближайший вариант, который я могу видеть вместо SERVER_NAME SERVER_ADDR, который также не поможет мне, потому что переход на https://127.0.0.1/index.php перейдет на сайт apache по умолчанию, а не в определение для example.com (не говоря уже о том, что мой сертификат SSL более недействительны).

Какие-либо предложения?

Если вы не можете получить имя хоста из любой переменной $ _SERVER, и вы не хотите явно указывать его в конфиге или что-то еще, то я могу только подумать о другом (помимо этого, используя mod_rewrite, о котором вы заявили не хотят делать по какой-либо причине) заключается в том, чтобы служить пользователю пустой страницей, в которой говорится: «Подождите, пока мы перенаправляем вас на безопасный сайт …», а затем обработаем перенаправление с помощью JavaScript для анализа текущего URL-адреса и перенаправления к версии HTTPS.

В конце концов, у меня был парень, который управляет прокси-сервером Apache, чтобы добавить ProxyPreserveHost On в apache2.conf, и это обеспечило правильную пересылку HTTP_HOST (и SERVER_NAME) на сервер Apache.

Спасибо всем за ваши предложения, я сожалею, что проблема оказалась чем-то глупо, что даже не входило в сферу моего вопроса. Если на сервере Apache, над которым я работал, у него не было прокси, большинство ваших предложений оказались бы абсолютно точными.

Я подозреваю, что вы хотите использовать параметр $ _SERVER ['HTTP_HOST'] вместо SERVER_NAME.

header('Location: https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']);

Если ваш URL-адрес сайта не находится в $ _SERVER, я бы предположил, что вам придется регистрировать его где-то в качестве глобальной переменной. Затем каждый сайт должен будет зарегистрировать собственную переменную $ SITE_URL или такую, чтобы вы могли ее заполнить.

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

  • ваше приложение может быть использовано в одно и то же время через один и тот же apache
    сервер с разными именами
  • ваше приложение может использоваться за некоторым прокси-сервером, переписывая базовый URL-адрес. (Но вы можете попытаться его обнаружить)

См. Более подробное объяснение этой ссылки http://www.makina-corpus.org/blog/relativeabsolute-url-and-proxies

Таким образом, абсолютный URL-адрес плохой, следует избегать … Я бы создал вместо этого хорошее управление URL-адресами, где правила были бы простыми (all / admin или / conn url должны быть на SSL), и пусть серверы proxys / web / балансировки нагрузки отлично справляйтесь с этим. Но если вы действительно хотите сделать это перенаправление в своем приложении, используйте следующие способы:

  • используя конфигурационный файл, в котором абсолютный URL-адрес https и URL-адрес abolute url определены и уникальны (отлично, если ваше имя сайта уникально и ваше приложение не сделано для большого использования)
  • обнаружить абсолютный URL-адрес из строки прокси-сервера в HTTP_X_FORWARDED_HOST и / или
    HTTP_HOST (лучше)

Но большинство администраторов скажут, что абсолютный URL-адрес плох 🙂