2011-06-24 7 views
6

Estoy usando código de encendido, nuestro servidor está detrás de algunas configuraciones funky.Https que causa un bucle de redireccionamiento?

Quiero que las páginas de certian estén detrás de https, que las páginas de certian estén detrás de http, y otras que no me interesan.

Así que a continuación es mi configuración,

  • si voy a http://test.example.com (que tiene una llamada a disable_ssl()) se carga la página finas
  • si voy a https://test.example.com/login (que tiene una llamada a require_ssl()) del la página carga bien
  • Si voy al http://test.example.com/login me redireccionan a la versión https. lo que es bueno.
  • Si voy a https://test.example.com entonces me pega con un bucle de redireccionamiento ... Por alguna razón la cabecera sigue recibiendo establece en https en lugar de http, a pesar de que explícitamente escribo http.

Mi $_SERVER matriz en una petición HTTP se ve como se parece a

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] => [email protected] 
    [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 
) 

y en una solicitud HTTPS parece que

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] => [email protected] 
    [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 
) 

y mi .htaccess parece

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] 

Así que en la parte superior de mi index.php tengo cinco

$_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'; 

Y en las páginas donde quiero HTTPS llamo

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

Y en las páginas donde quiero solamente HTTP que llamo

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

Si activa el registro de reescritura en un nivel 3+ (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html #rewritelog) le mostrará exactamente lo que el motor está haciendo a la URL solicitada. –

Respuesta

5

Por lo tanto, después de horas de depuración dolorosa, finalmente resolvimos el problema.

Nginx
Sí, el equilibrador de carga estaba haciendo sus propios redirecciones.

En la configuración de nginx esta línea existía proxy_redirect http:// https://;

Por lo tanto, lo que estaba ocurriendo?

Bueno, Mi código estaba diciendo "esta página no debe ser https, redirigir"
Entonces nginx estaba diciendo "esta solicitud no es https, redirigir"
Entonces mi código era ...
auge bucle de redirección.

Así, cambiando proxy_redirect http:// https://; a proxy_redirect Off; hemos solucionado el problema :)

+0

Hemos abordado la solución exacta para Nginx aquí http://www.sonassi.com/knowledge-base/magento-kb/magento-https-redirect-loop/ Esto evita la necesidad de tener ese código en su 'índice. php' file –

+0

@Hailwood: Estoy enfrentando el mismo problema. Mi página de inicio de sesión debe ser https, pero se redirecciona a http. Pero mi proxy_redirect ya está desactivado. ¿Alguna idea sobre cómo podría investigar más? – nish

+0

@Hailwood: Hola, estoy pasando por el mismo problema, después de instalar el certificado SSL no puedo acceder al Panel de administración y la página entra en un bucle de redireccionamiento, ¿puede decirme dónde realizo los cambios anteriores? – Mohan

1

La función que usted envió para disable_ssl() espectáculos:

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

¿Es el 0 ('cero') un error de copiar/pegar? Asumo que significaba:

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

Si estoy siguiendo tu lógica correctamente, esta función se invoca cuando Goto https://test.example.com, y por lo que si existe este error tipográfico, es probable que sea no hacer lo que cree que debería.

+0

Heh, sí, eso es solo un error aquí, lo arreglaré (edité la pregunta un poco más adelante). – Hailwood

0

Se podría considerar el uso de .htaccess reglas en su lugar, algo así como:

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

si desea forzar http simplemente reemplazar con 80 443 y https con http.

+0

Había pensado en eso, pero esto me da más control, ya que puedo habilitar/deshabilitar ssl cuando lo necesito. – Hailwood

Cuestiones relacionadas