2011-06-24 23 views
6

Używam zapalnika kodu, nasz serwer znajduje się za jakąś funky config.Https powodujące przekierowanie pętli?

Chcę, aby strony certyków były za stronami https, strony certyfikujące za http i inne, o które nie dbam.

Więc poniżej jest mój setup,

  • Jeśli pójdę do http://test.example.com (który ma wezwanie do disable_ssl()) wczytaniu strony drobne
  • Jeśli pójdę do https://test.example.com/login (który ma wezwanie do require_ssl()) strona ładuje się dobrze.
  • Jeśli przejdę na numer http://test.example.com/login, nastąpi przekierowanie do wersji https. co jest dobre.
  • Jeśli pójdę do https://test.example.com wtedy oberwać z pętlą przekierowania ... Z jakiegoś powodu nagłówek tam coraz ustawiony https zamiast http, mimo że wyraźnie napisać http.

$_SERVER Moja tablica na żądanie HTTP wygląda wygląda jak

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 
) 

oraz na https zażądać wygląda

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 
) 

i mój .htaccess wygląda

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] 

Więc na samym szczycie mojego index.php I ha ve

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

oraz na stronach, gdzie chcę HTTPS Wzywam

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

oraz na stronach, gdzie chcę tylko HTTP Wzywam

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

Po włączeniu rejestrowania przepisywania na poziomie 3+ (http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html #rewritelog) pokaże ci dokładnie, co silnik robi z żądanym adresem URL. –

Odpowiedz

5

Po godzinach bolesnego debugowania w końcu udało nam się rozwiązać problem.

Nginx
Tak, równoważenia obciążenia robi to własny przekierowań.

w ustawieniach nginx ta linia istniała proxy_redirect http:// https://;

Więc co się dzieje?

No Mój kod mówił „ta strona nie powinna być https, przekierowywać”
Następnie nginx mówił „ta prośba nie jest https, przekierowywać”
Wtedy mój kod był ...
boom przekierowanie pętli.

Tak, zmieniając proxy_redirect http:// https://; do proxy_redirect Off; naprawiliśmy problem :)

+0

Odnieśliśmy się do poprawnej poprawki dla Nginx tutaj http://www.sonassi.com/knowledge-base/magento-kb/magento-https-redirect-loop/ Pozwala to uniknąć konieczności posiadania tego kodu w twoim indeksie. php' file –

+0

@Hailwood: Mam do czynienia z tym samym problemem. Moja strona logowania musi być https, ale jest przekierowywana na http. Ale mój proxy_redirect jest już ustawiony na off. Jakieś pomysły na dalsze badania? – nish

+0

@Hailwood: Cześć, mam taki sam problem, po zainstalowaniu certyfikatu SSL nie mogę uzyskać dostępu do panelu administracyjnego, a strona przechodzi w pętlę przekierowania, czy mogę powiedzieć mi, gdzie mogę wprowadzić powyższe zmiany? – Mohan

1

funkcję, którą napisali dla disable_ssl() pokazach:

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

Czy 0 ("zero") jest błędem kopiowania/wklejania? Zakładam, że masz na myśli:

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

Jeśli Obserwuję logiki poprawnie, ta funkcja jest wywoływana gdy goto https://test.example.com, a więc jeśli to literówka istnieje, to prawdopodobnie nie robi to, co uważasz, że powinniśmy.

+0

Heh, tak, to tylko literówka tutaj, naprawię to (ja zredagowałem to pytanie nieco później). – Hailwood

0

Można rozważyć zastosowanie zamiast .htaccess zasady, coś jak:

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

jeśli chcesz wymusić http wystarczy wymienić 80 z 443 i https z http.

+0

Myślałem o tym, ale to daje mi większą kontrolę, ponieważ mogę włączyć/wyłączyć ssl, kiedy muszę. – Hailwood

Powiązane problemy