problém s přesměrováním v htaccess
- Dalibor
- Člen | 26
Zdravím,
snažím se přesměrovat požadavek (lazy loading náhledů obrázků) /preview/6.jpg na Nette generátor obrázků s presenterem Images:preview
zkouším to, co jsem tu někde nalezl (pro zjednodušení všechny požadavky jdou na /images/preview/ bez parametrů souboru):
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/preview/([^.]+)\.(jpg|png|gif)$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) /images/preview/ [NE,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
Toto přepsání směřuje správně do Nette, ale bohužel nastaví proměnnou $_SERVER takto:
..
..
SCRIPT_FILENAME "/data/www/aplikace/www/index.php" (30)
REMOTE_PORT "52878" (5)
REDIRECT_URL "/images/preview/" (16)
GATEWAY_INTERFACE "CGI/1.1" (7)
SERVER_PROTOCOL "HTTP/1.1" (8)
REQUEST_METHOD "GET" (3)
QUERY_STRING ""
REQUEST_URI "/preview/6.jpg" (22)
SCRIPT_NAME "/index.php" (10)
PHP_SELF "/index.php" (10)
REQUEST_URI zůstává pořád na původní URL. Při normálním požadavku (např. /nejakaurl/) na Nette ale toto pole vypadá takto:
..
..
SCRIPT_FILENAME "/data/www/aplikace/www/index.php" (30)
REMOTE_PORT "52671" (5)
REDIRECT_URL "/nejakaurl/" (11)
GATEWAY_INTERFACE "CGI/1.1" (7)
SERVER_PROTOCOL "HTTP/1.1" (8)
REQUEST_METHOD "GET" (3)
QUERY_STRING ""
REQUEST_URI "/nejakaurl/" (11)
SCRIPT_NAME "/index.php" (10)
PHP_SELF "/index.php" (10)
REQUEST_URI = REDIRECT_URL, a Nette právě pro detekci URL používá pole REQUEST_URI, takže jakoby se přepsání neprovedlo, požadavek pořád bere jako /preview/6.jpg, takže „No route“.. Je toto standardní chování mod_rewrite, že přepíše (vytvoří) jen REDIRECT_URL? Nemělo by Nette brát spíše tedy REDIRECT_URL?
- Filip Procházka
- Moderator | 4668
Ty mod_rewrite
pravidla vůbec nepotřebuješ. Stačí ti
vytvořit si routu, která bude mít tvar, jako fyzická adresa obrázku.
Mějme strukturu
data/
images/
www/
thumbs/
css/
...
.htaccess
index.php
vytvoříš si pravidlo do routy
$router[] = new Route('thumbs/<thumbnail>.[!<extension>]' array(
'presenter' => 'Images',
'action' => 'preview',
'extension' => 'jpg'
));
Teď, když ti přijde požadavek na /thums/12345.jpg
, tak ti ho
zpracuje Nette, protože soubor neexistuje. Vytvoří obrázek podle ID (nebo
podle nějaké jmenné konvence, to je na tobě) a nahraje ho do složky tak,
aby byl na té adrese, takže do www/thums/12345.jpg
.
Nyní existuje soubor, takže výchozí rewrite ze sandboxu
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|css|rar|zip|tar\.gz)$ index.php [L]
ti neprojde, protože pravidlo !-f
vylučuje požadavky na
existující soubory. Takže aplikační server zcela obejde Nette a rovnou
vrátí obrázek.
Editoval HosipLan (5. 11. 2011 22:20)
- Dalibor
- Člen | 26
Nyní existuje soubor, takže výchozí rewrite ze sandboxu
ti neprojde, protože pravidlo!-f
vylučuje požadavky na existující soubory. Takže aplikační server zcela obejde Nette a rovnou vrátí obrázek.
Díky moc,
takovou kombinaci jsem nedomyslel, chtěl jsem se právě vyhnout zpracování existujícího obrázku Nette.
Asi se tady budeme muset složit na nějaký dárek, protože tady pomáháš snad v každém vlákně, ještě jednou díky!
- Dalibor
- Člen | 26
Nyní existuje soubor, takže výchozí rewrite ze sandboxu
RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
ti neprojde, protože pravidlo
!-f
vylučuje požadavky na existující soubory. Takže aplikační server zcela obejde Nette a rovnou vrátí obrázek.
Ještě dodatek (teda pokud mi zase něco neuniká ;-) ) v .htaccess se musí z RewriteRule odstranit ty přípony, které chceme na Nette směrovat, jinak se pravidlo přeskočí a Apache vyhodí 404… Takže pro obrázky:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule !\.(pdf|js|ico|css|rar|zip|tar\.gz)$ index.php [L]
- Filip Procházka
- Moderator | 4668
Ano, na to jsem zapomněl. Pravda :) Jenom je blbé, že požadavky na neexistující obrázky se posílají do aplikace. Takže pořádně všechno otestovat a dávat bacha při uploadu, aby se žádný nezatoulal ;)