Routování – adresa jako soubor, nefunguje na ic.cz

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

Usmyslel jsem si, že chci mít na stránkách chráněné soubory – soubory, které jsou přístupné, ale jen po přihlášení uživatele. O tom jsem sice nikde žádný článek nenašel, ale nakonec jsem přišel na následující postup:

  • pomocí header() pošlu info o MIME typu souboru
  • pak pošlu samotný soubor (otevřu jej skrz fopen (binární mód) a po částech načítám a posílám přes echo – ano, asi to je příšerné řešení, ale na nic lepšího jsem nepřišel).

Pak jsem si usmyslel, že chci, aby adresa vypadala pěkně, když už jsem si routoval zbytek stránek. Nakonec jsem dosáhl toho, že adresa vypadá např. web.cz/akce/putovani_po_horach/hlavni_foto.png problém je ovšem na www.ic.cz, kam jsem si stránky zkopíroval.

  • pokud použiji adresu ve stylu web.cz/?presenter=presenter_ktery_posila_soubory&id=1 funguje to i na ic.cz
  • při použití pěkné adresy, tedy …file.png, je generována stránka 404 not found (s „Nette Framework“ na konci stránky). Metodou pokus-omyl jsem zjistil, že serveru vadí přípona – když použiji adresu web.cz/neco/jeste_neco/neexistujici_soubor (bez přípony), stránka už se mě korektně zobrazí (zpracování chyby not found teprve budu dělat).

Bohužel vůbec ani netuším, kde mám začít hledat řešení problému ani jeho příčinu…

David Grudl
Nette Core | 8218
+
0
-

Není to kvůli výčtu přípon souborů v .htaccess? Tam uvedené přípony se přeskakují a PHP a aplikace se nenastartuje.

Laethnes
Člen | 53
+
0
-

Hm, tak to si vůbec nejsem jistý – o htaccess vím, co na mě vychrlil google a o tomto nevím – v rámci nastavení rewrite pravidla nemám žádné přípony zmíněné (de tam prostě všechno) a mám jen jedno, které říká, že je-li na začátku adresy data, nebude se rewrite aplikovat a všechny veřejné soubory mám ve složce data. Pokud se tam nastavují nějak jinak, tak o tom nejsem schopen nic najít…

Honza Kuchař
Člen | 1662
+
0
-
  • pomocí header() pošlu info o MIME typu souboru
  • pak pošlu samotný soubor (otevřu jej skrz fopen (binární mód) a po částech načítám a posílám přes echo – ano, asi to je příšerné řešení, ale na nic lepšího jsem nepřišel).

Použij filedownloaderextras. S routováním neporadím. :(

Laethnes
Člen | 53
+
0
-

honzakuchar napsal(a):

Použij filedownloaderextras. S routováním neporadím. :(

Ehm. Díky, vypadá to dobře, ale vůbec mě to nefunguje – nejprve mě systém tvrdil, že neexistuje daná třída a když jsem mrkl do php scriptu, zjistil jsem, že se to nejmenuje FileDownload, ale FileDownloader. Pak jsem zjistil, že nemůžu dělat instance, konstruktor vypadá takto:

<?php
	/**
	 * Static class - cannot be instantiated.
	 */
	final public function __construct()
	{
		throw new LogicException("Cannot instantiate static class " . get_class($this));
	}
?>

Mno a když už jsem po projití kódu zjistil, že to mám volat FileDownloader::download($file); poslalo mě to .png soubor jako bin a tak se nezobrazil v prohlížeči, ale nechal jej stáhnout.

Hm, co dělám blbě?

EDIT:
Mno, problém s MIME jsem už aj vyřešil po svém – vzhledem k tomu, že soubory, které jsou chráněné a přístupné skrz script, jsou zároveň uploadované na web, takže díky metodán Nette vím mime při ukládání a ukládám do databáze (tak už mám udělaný ten program, protože jsem nepřišel na spolehlivou metodu, jak to zjistit – buď je to jen u obrázků, nebo omezeno na modul). Přesto mě to v prohlížeči nezobrazuje obrázek, ale vyskakuje okno s možností stáhnutí (a už správným typem :3).

Editoval Laethnes (19. 8. 2009 20:36)

marek.dusek
Člen | 99
+
0
-

Laethnes napsal(a):

Přesto mě to v prohlížeči nezobrazuje obrázek, ale vyskakuje okno s možností stáhnutí (a už správným typem :3).

Nesmis posilat jako disposition=attachment, ale disposition=inline

ic
Člen | 430
+
0
-

Jestli v .htaccess-u nemáš žádné přípony tak tam můžeš zkusit nějaké přidat…

<IfModule mod_mime.c>
AddType application/x-httpd-php .neco .neco-jineho .png
</IfModule>

pak by se i png soubory ‚kompilovaly‘ serverem, akorát bys musel png ve kterých je skutečný obrázek uložit jako jiný formát

Laethnes
Člen | 53
+
0
-

marek.dusek napsal(a):
Nesmis posilat jako disposition=attachment, ale disposition=inline

Aha, toho jsem si nikde nevšiml, hned, jak to bude možné, otestuju.

ic napsal(a):

Jestli v .htaccess-u nemáš žádné přípony tak tam můžeš zkusit nějaké přidat…

<IfModule mod_mime.c>
AddType application/x-httpd-php .neco .neco-jineho .png
</IfModule>

pak by se i png soubory ‚kompilovaly‘ serverem, akorát bys musel png ve kterých je skutečný obrázek uložit jako jiný formát

Hm, tak to pak bude problém… Ono jde o to, že normální data mám v jedné složce a vzhledem k tomu, že na stránkách bude pracovat více uživatelů, je takřka nemožné zajistit, aby soubory, které se budou nahrávat do skrytých částí, byly třeba png a soubory ve veřejné části jpg.
Tož, pokud to nejde jinak, tak se budu muset spokojit s adresou typu web.cz/protected_file/?id=XYZ

EDIT: ale zajímavé je, že na serveru, co mám doma (apache, Debian 5.0.2) to jede v obou případech. To asi nenastavím v .httaccess, že?

Editoval Laethnes (20. 8. 2009 11:06)

ic
Člen | 430
+
0
-

Jestli jde o něco většího a zvláště když na tom má dělat více lidí možná, čistě teoreticky by stálo zato se poohlédnout po nějakém placeném hostingu https://forum.nette.org/…ich-hostingu i s nějakou (levnější) doménou 2. řádu máš prostor odpovídající tomu na ic.cz okolo 400 ročně.

Laethnes
Člen | 53
+
0
-

ic napsal(a):

Jestli jde o něco většího a zvláště když na tom má dělat více lidí možná, čistě teoreticky by stálo zato se poohlédnout po nějakém placeném hostingu https://forum.nette.org/…ich-hostingu i s nějakou (levnější) doménou 2. řádu máš prostor odpovídající tomu na ic.cz okolo 400 ročně.

To zas ne… On je to web malé skupiny, kam bude chodit cca 20–40 uživatelů z toho polovina s už trochu většími právy. Problém je v tom, že se jedná veskrze o počítačově spíše negramotné lidi, kteří budou rádi, když vůbec nahrají soubor, natož aby pochopili, že do jedné části webu lze používat jeden typ obrázků a v jiné jiný. A navíc se mě toto řešení nelíbí :3.

Saska
Člen | 23
+
0
-

To mne zase nechodi na ic.cz uplne cely routovani.

muj htaccess:

<?php
#PHP
php_value max_execution_time 15
php_flag register_globals off
php_flag display_errors on
php_value memory_limit 32M
php_value post_max_size 16M
php_value upload_max_filesize 16M
php_flag file_uploads on

#Indexes
Options -Indexes
php_flag engine on


# mod_rewrite
<IfModule mod_rewrite.c>
	RewriteEngine On
	#RewriteBase /

	# front controller
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	RewriteRule !\.(pdf|js|ico|gif|jpg|png|css|rar|zip|tar\.gz)$ index.php [L]
</IfModule>
?>

Zkousel jsem odkomentovat #RewriteBase /, ale pak mi to hazi smycku pri presmerovani.

Editoval Saska (6. 9. 2009 20:27)

Honza Kuchař
Člen | 1662
+
0
-

marek.dusek napsal(a):

Laethnes napsal(a):

Přesto mě to v prohlížeči nezobrazuje obrázek, ale vyskakuje okno s možností stáhnutí (a už správným typem :3).

Nesmis posilat jako disposition=attachment, ale disposition=inline

FileDownloader od teď podporuje přepínání content-disposition.

Laethnes
Člen | 53
+
0
-

Saska napsal(a):

To mne zase nechodi na ic.cz uplne cely routovani.

muj htaccess:
Zkousel jsem odkomentovat #RewriteBase /, ale pak mi to hazi smycku pri presmerovani.

Mno, z vlastních zkušeností vím, že ic,cz vyžaduje RewriteBase. Já to mám momentálně ve složce, takže mě to funguje jako „RewriteBase slozka/“… Zkus složku „./“, mohlo by to fungovat.

honzakuchar napsal(a):

FileDownloader od teď podporuje přepínání content-disposition.

Hm, jak budu moct, vyzkouším, díky.

EDIT: Mazec! Funguje přesně jak potřebuju. Dík ;)

Editoval Laethnes (21. 10. 2009 13:28)