problém s přesměrováním v htaccess

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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 ;)