Nefunkční aplikace na active24

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

Ahoj, mám takový problém. Překopíroval jsem svojí aplikaci na ftp, promazal cache a teď dostávám od tracy akorát že nemůže najít šablonu. Nedá se změnit kořenový adresář, tak jsem přidal htaccess (viz. níže). Ale vůbec nechápu, proč tedy nemůžu normálně fungovat. Předem díky za rady.

Page not found. Missing template '…/www/doc/www.domena.cz/www/app/presenters/Sign/templates/Sign/in.latte'

Page not found. Missing template '…/www/app/presenters/Homepage/templates/Homepage/default.latte'

místo doména mám svojí doménu, ale nechtěl jsem upozorňovat na konkrétní aplikaci, která je v současné době nezabezpečená

RewriteEngine On
RewriteBase /


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

RewriteCond %{ENV:HTTPS} !^.*on
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R,L]

RewriteCond %{HTTP_HOST} ^(www\.)?domena\.cz$
RewriteRule ^$ www/ [L]
RewriteCond %{HTTP_HOST} ^(www\.)?domena\.cz$
RewriteRule (.*) www/$1 [L]
David Grudl
Nette Core | 8142
+
0
-

Čistě OT: u toho druhého přesměrování kvůli HTTPS nemá být https://www.%{HTTP_HOST}/$1, ale jen https://%{HTTP_HOST}/$1

jarda256
Člen | 130
+
0
-

@DavidGrudl htaccess jsem tedy pozměnil, ale chyba přetrvává (cache sem promazal)

RewriteEngine On
RewriteBase /


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

RewriteCond %{ENV:HTTPS} !^.*on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R,L]

RewriteCond %{HTTP_HOST} ^(www\.)?domena\.cz$
RewriteRule ^$ www/ [L]
RewriteCond %{HTTP_HOST} ^(www\.)?domena\.cz$
RewriteRule (.*) www/$1 [L]

struktura ftp

www
---app
---vendor
---www

Editoval jarda256 (21. 12. 2016 16:11)

Jan Mikeš
Člen | 771
+
0
-

Napadá mě, jestli máš správně velká/malá písmena v názvech souborů se šablonami a adresáři? Windowsu to je jedno, ale u active24 budeš mít pravděpodobně linux a ten je na velikost písmen citlivý.

jarda256
Člen | 130
+
0
-

@JanMikeš Koukám, že písmena jsou správně, ale hledá to cestu Homepage/templates/Homepage/default.latte ale mělo by to být jen Homepage/templates/default.latte. Jak se to mohlo stát? Na locale to funguje správně

jarda256
Člen | 130
+
0
-

Mám upravenou strukturu a podle ní jsem upravoval i formateTemlateFiles a formateLayoutFiles. Na localhostu vše šlo správně :(

app
├── modules
│   ├── Web
│   │   ├── presenters
│   │   │   ├── Default
│   │   │   │   ├── templates
│   │   │   │   │   └── default.latte
│   │   │   │   └── DefaultPresenter.php
│   │   │   └── Product
│   │   │       ├── templates
│   │   │       │   ├── default.latte
│   │   │       │   └── edit.latte
│   │   │       └── ProductPresenter.php
│   │   └── templates
│   │       └── @layout.latte
│   └── Admin
│       ├── modules
│       │   └── (more modules)
│       ├── presenters
│       │   └── Default
│       │       ├── templates
│       │       │   └── default.latte
│       │       └── DefaultPresenter.php
│       └── templates
│           └── @layout.latte
├── presenters
│   └── Base
│       └── BasePresenter.php
└── templates
    └── @layout.latte
public function formatLayoutTemplateFiles()
	{
		if (preg_match('#/|\\\\#', $this->layout)) {
			return [$this->layout];
		}
		list($module, $presenter) = Helpers::splitName($this->getName());
		$layout = $this->layout ? $this->layout : 'layout';
		$dir = dirname($this->getReflection()->getFileName());
		$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
		$list = [
			"$dir/templates/$presenter/@$layout.latte",
			"$dir/templates/$presenter.@$layout.latte",
		];
		do {
			$list[] = "$dir/templates/@$layout.latte";
			$dir = dirname($dir);
		} while ($dir && $module && (list($module) = Helpers::splitName($module)));

        return $list;
	}


	/**
	 * Formats view template file names.
	 * @return array
	 */
	public function formatTemplateFiles()
	{
		list(, $presenter) = Helpers::splitName($this->getName());
		$dir = dirname($this->getReflection()->getFileName());
		$dir = is_dir("$dir/templates") ? $dir : dirname($dir);
        return [
			"$dir/templates/$presenter/$this->view.latte",
			"$dir/templates/$presenter.$this->view.latte",
		];
	}
jarda256
Člen | 130
+
0
-

Funkce jsem upravil, ale teď při přihlašování zase vyhazuje chybu doctrine :(

Doctrine\Common\Annotations\AnnotationException

[Semantical Error] The annotation "@Doctrine\ORM\Mapping\manyToMany" in property App\Model\Entities\User::$groupsToEdit does not exist, or could not be auto-loaded.
public function formatLayoutTemplateFiles()
	{
		if (preg_match('#/|\\\\#', $this->layout)) {
			return [$this->layout];
		}
		list($module, $presenter) = Helpers::splitName($this->getName());
		$layout = $this->layout ? $this->layout : 'layout';
		$dir = dirname($this->getReflection()->getFileName());
//        dump($dir);
		$dir = is_dir("$dir/$presenter") ? $dir : dirname($dir);
//		dump($dir);
        $list = [
			"$dir/$presenter/templates/@$layout.latte",
			"$dir/$presenter/templates.@$layout.latte",
		];
		do {
			$list[] = dirname($dir)."/templates/@$layout.latte";
			$dir = dirname($dir);
		} while ($dir && $module && (list($module) = Helpers::splitName($module)));
//        dump($list);
        return $list;
	}


	/**
	 * Formats view template file names.
	 * @return array
	 */
	public function formatTemplateFiles()
	{
		list(, $presenter) = Helpers::splitName($this->getName());
		$dir = dirname($this->getReflection()->getFileName());
		$dir = is_dir("$dir/templates") ? $dir : dirname($dir);

        $list = [
			"$dir/templates/$this->view.latte",
			"$dir/templates.$this->view.latte",
		];
//        dump($list);
        return $list;
	}
jarda256
Člen | 130
+
0
-

Ok chyba byla v písmenkách. Malé m u ManyToMany

jarda256
Člen | 130
+
0
-

@DavidGrudl Ještě poslední problém s přesměrováním. Když se příhlásím, tak bych se měl dostat https://www.domena.cz/admin/ ale přesměruje mě to na https://www.domena.cz:80/admin/ ?? Jak je to možné? V dokumentaci je u HTTPS TODO

Editoval jarda256 (21. 12. 2016 17:09)

Gappa
Nette Blogger | 199
+
0
-

jarda256 napsal(a):

@DavidGrudl Ještě poslední problém s přesměrováním. Když se příhlásím, tak bych se měl dostat https://www.domena.cz/admin/ ale přesměruje mě to na https://www.domena.cz:80/admin/ ?? Jak je to možné? V dokumentaci je u HTTPS TODO

Na Active24 mají tuším proxy, za kterou již veškerý provoz běhá nešifrovaně, proto ten port 80.

jarda256
Člen | 130
+
0
-

@Gappa Dobře, ale pokud chci použít getUsermedia, tak musím mít https. Dá se to nějak pořešit?

Gappa
Nette Blogger | 199
+
0
-

jarda256 napsal(a):

@Gappa Dobře, ale pokud chci použít getUsermedia, tak musím mít https. Dá se to nějak pořešit?

Našel jsem tohle:

Ale to popravdě nevím, jak by se mělo nastavit – neznám IP té proxy, jestliže je transparentní, tak asi ani zacílit nejde? Nevím, zas tak se v této problematice nevyznám…

Nicméně, pro Active24 by mělo jít použít tento „hack“ (je linkovaný i v tom odkazu výše):

Nebo i něco jednoduššího v tomhle stylu (do index.php):

<?php
if (!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) {
	$_SERVER['SERVER_PORT'] = 443;
}
?>

Pokud zná někdo lepší způsob (nebo jak pro Active24 nastavit tu proxy), tak sem s tím :)

Phalanx
Člen | 310
+
0
-

@jarda256 @Gappa Jaký máš nastavený defaultní port? php_info() – SERVER_PORT

U mého hostingu měli 80 (https = 443), tak jsem jim to přepsal kódem viz. @Gappa výše.

jarda256
Člen | 130
+
0
-

@Phalanx A použil si stejný kod? A vložil jej do index.php?? Já vložil takto ale bez výsledku

$container = require __DIR__ . '/../app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)->run();
if (!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) {
    $_SERVER['SERVER_PORT'] = 443;
}
Phalanx
Člen | 310
+
0
-

@jarda256 dej ten kód na první řádek, ne až po volání containeru :)

<?php
if (!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) {
    $_SERVER['SERVER_PORT'] = 443;
}
$container = require __DIR__ . '/../app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)->run();
?>
David Grudl
Nette Core | 8142
+
+5
-

Docela by mě zajímalo, až to vyřešíte, jestli

  • je to chyba hostingu, takže řešení je workaround
  • je to chyba v Nette, takže řešení je poslat PR
  • je to chyba ve starší verzi Nette a už je to opravené
  • chybělo nastavení http.proxy v configu – což není zdokumentované

Protože podobné věci tu vídám řešit už dlouhé roky a divím se proč, už měl přece dávno přijít PR s opravou kódu nebo doplněním docky.

cc @FilipProcházka @pata.kusik111

redwormik
Člen | 6
+
0
-

Jiný hosting (WebCloud), stejná chyba (Nette správně pozná HTTPS, ale generuje URL s portem 80). Vyřešil jsem workaroundem s přepisem $_SERVER['SERVER_PORT'].

Z phpinfo():

	$_SERVER['HTTPS'] === 'On';
	$_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https'; // jediná X_FORWARDED hlavička
	$_SERVER['SERVER_PORT'] === 80;

$_SERVER['SERVER_ADDR'] je veřejná, ale jiná než IP podle DNS. $_SERVER['REMOTE_ADDR'] odpovídá IP klienta, proto nejde použít nastavení http.proxy.

Editoval redwormik (22. 12. 2016 21:46)

jarda256
Člen | 130
+
0
-

David Grudl napsal(a):

Docela by mě zajímalo, až to vyřešíte, jestli

  • je to chyba hostingu, takže řešení je workaround
  • je to chyba v Nette, takže řešení je poslat PR
  • je to chyba ve starší verzi Nette a už je to opravené
  • chybělo nastavení http.proxy v configu – což není zdokumentované

Protože podobné věci tu vídám řešit už dlouhé roky a divím se proč, už měl přece dávno přijít PR s opravou kódu nebo doplněním docky.

cc @FilipProcházka @pata.kusik111

Pro mě je funkčním řešením. Řekl bych, že chyba je na straně hostingu.

if (!empty($_SERVER['HTTPS']) && 'off' !== $_SERVER['HTTPS']) {
    $_SERVER['SERVER_PORT'] = 443;
}
$container = require __DIR__ . '/../app/bootstrap.php';
$container->getByType(Nette\Application\Application::class)->run();
Gappa
Nette Blogger | 199
+
+1
-

Konkrétněji k Active24:

Edit: Active24 změnil odkaz, pokud by přestal fungovat redirect, tak je to zde:

Poslední část úplně dole:

  • Implementace HTTPS (.htaccess přesměrování)

Editoval Gappa (2. 11. 2017 20:18)