У меня есть некоторые 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 или такую, чтобы вы могли ее заполнить.
По моему скромному мнению, вы должны избегать использования тезисов в вашем приложении. Правильное место, чтобы сделать это за вашим приложением, по нескольким причинам:
См. Более подробное объяснение этой ссылки http://www.makina-corpus.org/blog/relativeabsolute-url-and-proxies
Таким образом, абсолютный URL-адрес плохой, следует избегать … Я бы создал вместо этого хорошее управление URL-адресами, где правила были бы простыми (all / admin или / conn url должны быть на SSL), и пусть серверы proxys / web / балансировки нагрузки отлично справляйтесь с этим. Но если вы действительно хотите сделать это перенаправление в своем приложении, используйте следующие способы:
Но большинство администраторов скажут, что абсолютный URL-адрес плох 🙂