Tak jsem tu opět po delší době s žádostí o pomoc :)
Nástin situace:
Používám na webu (nejde o manual.wz.cz) přepis adres pomocí .htaccess kdy přepisuji adresu ve tvaru /index.php?page=stranka do formátu /stranka.
Tohle funguje tak, jak má. Problém nastává, pokud chci umožnit přímé stažení nějakého souboru (například /downloads/file.zip). Pokud totiž zadám adresu http://example.com/downloads/file.zip, tak se mi přepíše na http://example.com/index.php?page=/downloads/file.zip - což samozřejmě vygeneruje chybovou stránku 404 Not Found.
Takže: navrhněte, prosím, nějaké schůdné řešení, které by umožňovalo přímý download souborů bez využití PHP downloaderu.
Předem díky za případné tipy.
PS: nejde sice přímo o PHP, ale tahle sekce se mi zdála nejpříhodnější.
<HTML>Dej sem to pravidlo kterym to prepisujes a ja ti to prepisu tak aby slo.</HTML>
Dobře, ale upozorňuju, že je tvdá amatéřina a není na to zrovna nejhezčí pohled:
RewriteEngine On
RewriteRule ^(.+)/$ /$1/ [L,QSA,R=301]
RewriteRule ^([A-Za-z0-9-]+)$ index.php?page=$1 [QSA]
PS: pokud se zadá adresa ve tvaru http://example.com/anything , tak to jde, ale pokud se zadá s lomítkem na konci (tedy http://example.com/anything/), tak se to zacyklí :)
PPS: pokud to zvládneš, máš u mě Tatranku - případně nějaký její ekvivalent =)
<HTML>Tak to je jednoduchy...
1) prvni pravidlo se jasne zacykli, pryc s nim
2) druhy pravidlo zas neresi lomitka ani tecky, takze je na nic.
Zkus:
RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|png|css|htm|zip)$ index.php
http://www.domena.cz/nazdar
echo $_SERVER['REQUEST_URI'];
vypise: "/nazdar"
http://www.domena.cz/nazdar/
echo $_SERVER['REQUEST_URI'];
vypise: "/nazdar/"
http://www.domena.cz/nazdar/tohle/je/tuna/url/k/nicemu
echo $_SERVER['REQUEST_URI'];
vypise: "/nazdar/tohle/je/tuna/url/k/nicemu"
http://www.domena.cz/nazdar/tohle/je/?foo=barbarbar
echo $_SERVER['REQUEST_URI'];
vypise: "/nazdar/tohle/je/?foo=barbarbar"
http://www.domena.cz/cokolikv/kdekoliv/jakkoliv/soubor.zip
neprojde prepisem a jde primo na cilovou adresu
to ukonci trapeni s lomitkama, php dostane vzdy url pokud tam neni specifikovana pripona ktera se nema prepisovat</HTML>
ten první řádek nechápu. nemělo to bejt:
RewriteRule ^(.+)/$ /$1 [L,QSA,R=301]
(tedy bez toho lomítka na konci)
? aby se to necyklilo?
a jinak - přidat něco jako
RewriteCond %{REQUEST_URI} [^download]
před ten druhý řádek?
A neni jedodussi tohle:
#RewriteCond %{REQUEST_FILENAME} -f [NC]
#RewriteRule ^(.+[^/])$ /$1/ [R=301,L]
?
Pokud soubor existuje tak to tak necha, ale pokud ne,tak to necha zpracovat ... ;)
(teda jestli jsem spravne pochopil 'zadani' xD )
Takže díky za všechny návrhy. Nakonec vyhrál Freezeho návrh, takže gratuluju, máš u mě Tatranku :)
Ad Richard:
zajímavý nápad. Já jsem bohužel spíš potřeboval něco, co by reagovalo na jakýkoliv typ souboru bez toho, aniž bych musel přidávat další přípony.
Ad R.U.R:
nevím, asi jsem dělal něco špatně, ale když jsem zkoušel 20x za sebou otevřít soubor z adresáře /download/, tak se mi to tak ve čtyřech případech z pěti zacyklilo a v jednom to šlo ... nechápu ?!
<HTML>Osobně spíš preferuju definovaní veřejných typů a zbytek je privátní (řízený scriptem), než dát vše jako veřejné (xml, phtml, tmp, tpl, ...)
Nakonec i soubory ke stažení by měl ovládat script z hlediska bezpečnosti (privátní zóny) ale také z hlediska přidružené funkčnosti (záznam počtu stažení, komprese dat před odesláním, ...)</HTML>
Richard:
jako ano, ale je stim moc práce ;-)) a navíc když já jsem to zkoušel, tak se mi nedařilo vracet soubor se správným názvem, správnou příponou a správným content-typem. Asi je pak potřeba nastavit php parsování do všech typů souborů...?
=Richard=
Mas pravdu, neni to nejlepsi - sam to nepouzivam ... rekneme, ze vyrazne bezpecnejsi to muze byt treba jenom 'posunutim' do jednoho adresare tak, ze takto pujdou stahnout jenom soubory napr z adresare download ...
Ale IMHO z hlediska downloadu (napr. mp3,videa,obrazku,a vseho co muze prohlizec otevrit) je lepsi posilat headery ...
header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
takze pokud se odnekud stahuji treba videa tak je urcite lepsi neudavat celou jejich cestu, ale jenom napr. download.php?file=soubor.avi :)
Freeze: "hlediska downloadu (napr. mp3,videa,obrazku,a vseho co muze prohlizec otevrit) je lepsi posilat headery"
A až budeš mít web s vekou návštěvností, odkud se budou stahovat tisíce souborů denně, tak se budeš strašně divit, že ti server nějak nestíhá. Ono přeci jenom je rozdíl v tom, jestli ty soubory čte Apache přímo z disku, nebo jestli je musí Apache dát PHP, to je načíst a předat zpět k Apache aby jej odeslal ke klientovi...
mě taky vadilo, že download.php?video.avi když uložim, tak to mělo příponu php a název download.
Sry .. zapomel jsem na nektere headrey :
$soubor='mojevideo.avi';
header("Content-Disposition: attachment; filename=\"$soubor\"");
.... takhle to hodi prohlizeci nazev stahovaneho souboru ;)
thx, to přesně jsem neuměl :-)