[WEDOS] Nette v podadresáři

před 2 lety

lukyer
Člen | 33
+
0
-

Potřeboval jsem nette rozchodit v zanořené složkové struktuře (domena.cz/aplikace/nette1) a je to pain!
Vyzkoušel jsem všechny možné návody, knowledge base, tipy tady z fóra a nevyřešil jsem.

Po několika hodinách trápení s bláznivým wedosím .htaccess em kurvícím vše kvůli subdoménám/aliasům jsem se uchýlil k workaround řešení, které funguje, ale je pěkně otravné.

  1. zapomeňte na simple router, ten v této konfiguraci na wedosu nerozjedete
  2. veškeré routy prefixovat dle reálné URL:
public static function createRouter($prefix = '')
{
    $router = new RouteList();
    $router[] = new Route($prefix . 'trips/<action>', 'Trips:overview');
    return $router;
}

v config.neon pak nastavit parametr:

parameters:
    urlPrefix: '/aplikace/nette1/'

v config.local.neon (na localhostu vše funguje):

parameters:
    urlPrefix: ''

A budete fungovat. Má to však neblahý důsledek – v šablonách {$basePath} vrací prázdný string (dává to smysl).

Takže pokračujeme – do BasePresenteru přidáme zhruba takovou ošklivost:

class BasePresenter extends Presenter
{

    /** @var Nette\DI\Container @inject */
    public $container;
    /**
     */
    public function beforeRender()
    {
        if ($this->template->basePath === '') {
            $urlPrefix = $this->container->getParameters()['urlPrefix'];
            $this->template->basePath = $urlPrefix;
        }
    }
}

No a podobně bychom měli samozřejmě vytvořit BaseControl pro komponenty, které by mohly na $basePath šahat taky.

Lepší varianta by asi byla napsat svůj router, ale to už se mi nad ránem nechce. No a úplně nejlepší varianta by byla rozplést ty .htaccess soubory od Wedosu + Nette a vyřešit to správně tam. Dobrovolníci? :)

před 2 lety

Tirus91
Člen | 199
+
-3
-

Toto mám vyzkoušené že mi běží na Wedosu. Víc ti nedám, sám jsem si musel hrát ;)

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^$ /www/ [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} !^/www/
    RewriteRule ^(.*)$ /www/$1
</IfModule>

před 2 lety

lukyer
Člen | 33
+
0
-

@Tirus91 todle je řešení ať nemusíš psát www do URL. To ještě vůbec neřeším. Nefunguje ani verze, kdy do URL www přidáš ručně. Nicméně i toto jsem zkoušel a nefungovalo.

Jsi si jist, že máš strukturu např. takovouto?
http://domena.cz/…vniNetteApka
http://domena.cz/…uhaNetteApka
..
?

před 2 lety

Tirus91
Člen | 199
+
0
-

A proč to neřešíš subdoménou?

před 2 lety

lukyer
Člen | 33
+
0
-

@Tirus91 vystavený https certifikát :-/

před 2 lety

tk
Člen | 6
+
0
-

A vystavit https certifikát na subdoménu by stálo víc než X hodin práce?

před 2 lety

lukyer
Člen | 33
+
+2
-

@tk To sice asi ne, přestože by to musel být wildcard certifikát. Ale řeší to více lidí a chtělo by to konečné řešení této otázky pro všechny :)

před 2 lety

Tirus91
Člen | 199
+
0
-

Ovšem nejsem si jist, zda se toto týká Nette. Tohle je spíše obecná otázka na HTACCESS

před 2 lety

lukyer
Člen | 33
+
0
-

Pravda, Nette se to asi moc netýká, je to problém Wedosu. Nicméně hodně lidí kombinaci Nette + Wedos používají, takže přikládám řešení podpory, která se po mém naléhání opravdu problémem zabývala:

Dobrý den,

předpokládám, že soubory Nette máte uloženy na FTP v adresáři /www/domains/domena.cz/aplikace/prvni/

V tomto případě opravdu způsobují nesprávné chování naše výchozí rewrite pravidla v souboru .htaccess, která se starají o směrování požadavků na aliasy a subdomény.

Řešením je obejít tyto pravidla definováním pravidla pro tuto konkrétní doménu a nasměrovat tak požadavky přímo do adresáře www aplikace Nette.

Ve Vašem případě by tedy bylo potřeba zapsat následující dvě pravidla do hlavního .htaccess souboru s našimi pravidly, ihned pod direktivu RewriteEngine On:

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

Potom by mělo routování Nette v pořádku fungovat.

Editoval lukyer (9. 7. 2015 12:46)