HTTPS вызывает перенаправление петли? - PullRequest
6 голосов
/ 24 июня 2011

Я использую воспламенитель кода, наш сервер стоит за какой-то необычной конфигурацией.

Я хочу, чтобы страницы на языке certian были позади https, страницы на сайте certian были позади http и другие, которые меня не волнуют.

Итак, ниже моя установка,

  • Если я перейду к http://test.example.com (который вызывает disable_ssl()), страница загрузится нормально
  • Если я перейду к https://test.example.com/login (который вызывает require_ssl()), страница загрузится нормально.
  • Если я пойду http://test.example.com/login, я буду перенаправлен на версию https. что хорошо.
  • Если я перейду на https://test.example.com, то получу цикл перенаправления ... По какой-то причине заголовок продолжает устанавливаться на https вместо http, хотя я явно пишу http.

Мой $_SERVER массив в запросе http выглядит как

Array
(
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => test.example.com:80
    [HTTP_X_REAL_IP] => 119.224.22.142
    [HTTP_X_FORWARDED_FOR] => 119.224.22.142
    [HTTP_X_URL_SCHEME] => http
    [HTTP_CONNECTION] => close
    [HTTP_CACHE_CONTROL] => max-age=0
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8,en-NZ;q=0.6
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3
    [HTTP_COOKIE] => [...]
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.14 (Ubuntu) Server at test.example.com Port 8080


    [SERVER_SOFTWARE] => Apache/2.2.14 (Ubuntu)
    [SERVER_NAME] => test.example.com
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 8080
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /var/www
    [SERVER_ADMIN] => webmaster@localhost
    [SCRIPT_FILENAME] => /var/www/index.php
    [REMOTE_PORT] => 54833
    [REDIRECT_URL] => /
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.0
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /
    [SCRIPT_NAME] => /index.php
    [PATH_INFO] => /
    [PATH_TRANSLATED] => redirect:/index.php/
    [PHP_SELF] => /index.php/
    [PHP_AUTH_USER] => ******
    [PHP_AUTH_PW] => ******
    [REQUEST_TIME] => 1308972068
)

и по запросу https выглядит как

Array
(
    [REDIRECT_STATUS] => 200
    [HTTP_HOST] => test.example.com:443
    [HTTP_X_REAL_IP] => 119.224.22.142
    [HTTP_X_FORWARDED_FOR] => 119.224.22.142
    [HTTP_X_URL_SCHEME] => https
    [HTTP_X_FORWARDED_PROTO] => https
    [HTTP_CONNECTION] => close
    [HTTP_USER_AGENT] => Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_ENCODING] => gzip,deflate,sdch
    [HTTP_ACCEPT_LANGUAGE] => en-US,en;q=0.8,en-NZ;q=0.6
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.3
    [HTTP_COOKIE] => [...]
    [PATH] => /usr/local/bin:/usr/bin:/bin
    [SERVER_SIGNATURE] => 
Apache/2.2.14 (Ubuntu) Server at test.example.com Port 8080


    [SERVER_SOFTWARE] => Apache/2.2.14 (Ubuntu)
    [SERVER_NAME] => test.example.com
    [SERVER_ADDR] => 127.0.0.1
    [SERVER_PORT] => 8080
    [REMOTE_ADDR] => 127.0.0.1
    [DOCUMENT_ROOT] => /var/www
    [SERVER_ADMIN] => webmaster@localhost
    [SCRIPT_FILENAME] => /var/www/index.php
    [REMOTE_PORT] => 54841
    [REDIRECT_URL] => /
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.0
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /
    [SCRIPT_NAME] => /index.php
    [PATH_INFO] => /
    [PATH_TRANSLATED] => redirect:/index.php/
    [PHP_SELF] => /index.php/
    [PHP_AUTH_USER] => ********
    [PHP_AUTH_PW] => ********
    [REQUEST_TIME] => 1308972250
)

и мой .htaccess выглядит как

Options +FollowSymlinks
RewriteEngine on

RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ %1/$1 [R=301,L]


RewriteCond $1 !^(index\.php|robots\.txt|favicon\.ico|css|images|js)
RewriteRule ^(.*)$ index.php/$1 [L] 

Так что в самом верху моего index.php у меня есть

$_SERVER['SERVER_PORT'] = explode(':', $_SERVER['HTTP_HOST']);
$_SERVER['HTTP_HOST'] = $_SERVER['SERVER_PORT'][0];
$_SERVER['SERVER_PORT'] = $_SERVER['SERVER_PORT'][1];
if($_SERVER['SERVER_PORT'] == 443)
  $_SERVER['HTTPS'] = 'On';
else
  $_SERVER['HTTPS'] = 'Off';

А на страницах, где я хочу HTTPS, я звоню

function require_ssl(){
    if($_SERVER['HTTPS'] == 'Off') {
        $host = explode(':', $_SERVER['HTTP_HOST']);
        header('location: https://' . $host[0] . $_SERVER['REQUEST_URI']);
        exit;
    }
}

А на страницах, где я хочу только HTTP, я звоню

function disable_ssl(){
    if($_SERVER['HTTPS'] == 'On') {
        $host = explode(':', $_SERVER['HTTP_HOST']);
        header('location: http://' . $host[0] . $_SERVER['REQUEST_URI']);
        exit;
    }
}

Ответы [ 4 ]

5 голосов
/ 29 июня 2011

Итак, после долгих часов мучительной отладки мы наконец решили проблему.

Nginx
Да, балансировщик нагрузки делал свои собственные перенаправления.

В настройках nginx эта строка существовала proxy_redirect http:// https://;

Итак, что происходило?

Ну, Мой код говорил: «Эта страница не должна быть https, перенаправить»
Тогда nginx говорил "этот запрос не https, перенаправить"
Тогда мой код был ...
бум петля перенаправления.

Итак, изменив proxy_redirect http:// https://; на proxy_redirect Off;, мы исправили проблему:)

1 голос
/ 24 марта 2012

Мы обратились к точному исправлению для Nginx (и других обратных прокси) здесь:

http://www.sonassi.com/knowledge-base/magento-kb/magento-https-redirect-loop/

Это позволяет избежать необходимости иметь этот код вваш index.php файл.Все, что вам нужно было сделать, это добавить это в вашу конфигурацию Nginx,

fastcgi_param  HTTPS on;
1 голос
/ 29 июня 2011

Функция, которую вы опубликовали для disable_ssl(), показывает:

if($_SERVER['HTTPS'] == '0n') {

Является ли 0 ('ноль') ошибкой копирования / вставки?Я предполагаю, что вы имели в виду:

if($_SERVER['HTTPS'] == 'On') {

Если я правильно следую вашей логике, эта функция вызывается при переходе к https://test.example.com, и поэтому, если эта опечатка существует, она, вероятно, не выполняет то, что вы думаетеэто должно.

0 голосов
/ 29 июня 2011

Вместо этого вы можете использовать правила .htaccess, например:

RewriteCond %{SERVER_PORT} 80 
RewriteCond %{REQUEST_URI} (optional pattern additional url matching)
RewriteRule ^(.*)$ https://test.example.com/$1 [L]

, если вы хотите заставить http просто заменить 80 на 443, а https на http.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...