Chyba 310 (net::ERR_TOO_MANY_REDIRECTS)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
neph04
Člen | 3
+
0
-

Nastaveni
Nginx/1.1.14
PHP Version 5.4.2
Nette Framework 2.0.3 stable (PHP 5.3)
Vyskyt chyby: vzdy

Spustil sem uplne cistou app ze sandboxu (zadne nastaveni sem neprovadel) a chod aplikace skoncil na chybu „Chyba 310(net::ERR_TOO_MANY_REDIRECTS): Proběhlo příliš mnoho přesměrování.“

Trosku sem badal a chyba je zpusobena tim, ze \Nette\Http\RequestFactory → createHttpRequest() imho chybne nastavuje stav HTTPS v $url->scheme.
Konkretne:
RequestFactory.php line 60

<?php
$url->scheme = isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'], 'off') ? 'https' : 'http';
?>

vraci

<?php
$url->scheme = 'https'
?>

i kdyz prichazim pres :80. Proto probiha nekonecny request na sebe sama…

Cely sestaveni url pak vypada takto:

<?php
class Nette\Http\UrlScript#114 (10) {
  private $scriptPath =>  string(1) "/"
  private $scheme =>  string(5) "https"
  ...
  private $host =>  string(12) "dev.xyzyx.cz"
  private $port =>  int(80)
  private $path =>  string(1) "/"
  private $query => string(0) ""
  private $fragment =>  string(0) ""
  private $frozen => bool(true)
}
?>

Cely je to tam divny a prehozeny :) $_SERVER[‚HTTPS‘] nemusi totiz vzdy vratit „off“. Podle dokumentace je „off“ pouze u ISAPI s IIS. Ja mam default ‚no value‘.. a pokud je off, nemelo by to vracet i tak ‚http‘ misto ‚https‘?

‚HTTPS‘ – Set to a non-empty value if the script was queried through the HTTPS protocol.
Note: Note that when using ISAPI with IIS, the value will be off if the request was not made through the HTTPS protocol.

Majkl578
Moderator | 1364
+
0
-

Tohle se změnilo v nginxu někde mezi verzemi 1.1.12 a 1.1.14, nevím přesně. Narazil jsem na to taky, dočasně jsem to tehdy vyřešil zakomentováním řádky „fastcgi_param HTTPS $https;“ v /etc/nginx/fastcgi_params. Nezkoumal jsem, zda je to chyba Nette nebo konfigurace nginxu a do dokumentace jsem se nedíval.


EDIT: Pull request: https://github.com/…tte/pull/654

juzna.cz
Člen | 248
+
0
-

V nginx ma byt konfigurace nove:
fastcgi_param HTTPS $https if_not_empty;

(drive tam to if_not_empty imho nebylo a to zpusobuje posilani prazdneho parametru)

Majkl578
Moderator | 1364
+
0
-

Minimálně ani v nejnovější verzi nginxe v Debianu (1.1.19 z testing) to tak není. Jinak také viz http://stackoverflow.com/a/2886224 (kontrole portu bych se ale určitě vyhnul).