Avatar billede kgp43 Nybegynder
22. juni 2004 - 18:42 Der er 61 kommentarer og
1 løsning

mod_rewrite - billeder

Hejsa,

Jeg tilbyder mine brugere upload af filer (zips, docs, img etc.) Når et billede er uploadet så får de en dynamisk url (ex. http://www.savefile.com/redir.php?id=2336654), de skal bruge dette link (da filerne bliver omdøbt et par gange dagligt).

Problemet opstår når de skal anvende billederne i deres signatur. Mange forums har disablet link til dynamiske sider. Kan man lave følgende med mod_rewrite (e.lign):

- Har brug for et link der ligner et direkte link til filen (ala http://www.savefile.com/redir/id/2336654.ext (ext = filtype)

redir.php skal så modtage variablen "id" der har værdien "2336654", ext skal smides væk.

Er dette løsningen på mit problem, eller vil det ikke virke?
Avatar billede coderdk Praktikant
22. juni 2004 - 18:48 #1
redir.php:

<?php

  list( $id, $type ) = explode( ".", $_SERVER['PATH_INFO'] );
  $id = substr( $id, 1 );

  echo "id: $id og type: $type";

?>

Så kan du kalde dem sådan:

http://www.savefile.com/redir.php/2336654.jpg
Avatar billede kgp43 Nybegynder
22. juni 2004 - 18:50 #2
Skal det ikke anvendes sammen med mod_rewrite?
Kan du give en lille forklaring hvordan koden virker?
Avatar billede coderdk Praktikant
22. juni 2004 - 18:54 #3
Du behøver ikke at bruge rewrite til det, hvis din apache understøtter PATH_INFO (gør de fleste)...
$_SERVER['PATH_INFO'] indeholder alt det der står som en sti i URL'en efter dit script:

http://example.dk/script.php/virtuel/sti/her/ja!

Dér vil $_SERVER['PATH_INFO'] indeholde "/virtuel/sti/her/ja!"

Det eneste du så bare skal gøre er et spytte de rigtige headere ud og smide indholdet af filen ud :)
Avatar billede coderdk Praktikant
22. juni 2004 - 18:56 #4
Med rewrite ser det nogenlunde sådan ud:

RewriteRule /forumimages/([0-9]+)\.([a-z]+) /redir.php?id=$1&type=$2

Så vil du kunne kalde dem sådan:

http://example.dk/forumimages/2336654.jpg

Hvis du slår MutliViews til i apache vil mit oprindelige forslag kunne se sådan ud:

http://www.savefile.com/redir/2336654.jpg
Avatar billede coderdk Praktikant
22. juni 2004 - 18:57 #5
Der skulle have stået "MultiViews"
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:03 #6
Skal redir.php ligge samme sted som filerne (der er uploadet) ?
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:09 #7
Den skriver at siden ikke er fundet.

Filen bliver uploadet til denne folder: /users/uploads/
redir.php ligger i roden.

Prøv selv at uploade en fil (www.savefile.com)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:09 #8
Nb. Jeg bruger dit første forslag
Avatar billede coderdk Praktikant
22. juni 2004 - 19:17 #9
Jeg uploadede...
http://www.savefile.com/redir.php/1836.jpg siger "no input file specified" - hvordan ser din kode ud?
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:23 #10
Jeg får en 404 fejl (Når jeg klikker på det link mit upload script genere).

redir.php :

<?
include("/home/savefile/public_html/db.php");

list( $id, $type ) = explode( ".", $_SERVER['PATH_INFO'] );
$id = substr( $id, 1 );

//Adding slashes to the variable
function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

$id = my_addslashes($id);
$id = my_addslashes($id);

$ip = getenv("REMOTE_ADDR");
$referer = $_SERVER['HTTP_REFERER'];

        // Find the filename and dest
        $query = mysql_query("SELECT * FROM files WHERE id='$id' ");
        $query = mysql_fetch_array($query);
        $file_name = $query[file_name];
        $file_ext = $query[file_ext];
       
        //Renaming the filename
        $random = mt_rand(500,9999999999);
        $random .= ".".$file_ext;
        rename("/home/savefile/public_html/users/uploads/$file_name", "/home/savefile/public_html/users/uploads/$random");
        $file_name = $random;
       
        mysql_query("UPDATE files SET last_load=now(), clicks=clicks+1, file_name='$file_name' WHERE id='$id'");
        mysql_query("INSERT INTO redir (id, file_id, ip, date, referer) values
                                  ('', '$id', '$ip', now(), '$referer')");
       
        if (($file_ext == jpg) || ($file_ext == jpeg) || ($file_ext == gif) || ($file_ext == bmp) || ($file_ext == png) || ($file_ext == swf)) {
            header("Location: http://www.savefile.com/users/uploads/$file_name");
        } else {
            include("/home/savefile/public_html/redir_show.php");
        }
?>
Avatar billede coderdk Praktikant
22. juni 2004 - 19:31 #11
Ok jeg forstår ikke helt, du renamer filen HVER gang man kalder redir.php?! Hvorfor?

Nå men dit problem! Det lader ikke til at din server understøtter PATH_INFO, du skal i httpd.conf sætte AcceptPathInfo til On:

http://httpd.apache.org/docs-2.1/mod/core.html#acceptpathinfo
Avatar billede coderdk Praktikant
22. juni 2004 - 19:34 #12
apt-get remove php4

(eller hvad det var du apt-get installede før) og så:

apt-get install php4-gd
Avatar billede coderdk Praktikant
22. juni 2004 - 19:34 #13
Doh sorry det var ikke til dig - Skide tabs i firefox ;)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:35 #14
Burde jeg ikke kunne teste om PATH_INFO virker med følgende kode:

<?
echo $_SERVER['PATH_INFO'];
?>

Jeg har ikke min egen server (har et reseller plan hos Dathorn.com). Har jeg ikke kun lov til at ændre i disse filer, hvis jeg har min egen server?
Avatar billede coderdk Praktikant
22. juni 2004 - 19:38 #15
I din .htaccess prøv at smide:

AcceptPathInfo On

Og se om det ikke virker...
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:42 #16
Jeg har allerede en .htaccess i roden (som standard), den indeholder følgende:

<Files 403.shtml>
order allow,deny
allow from all
</Files>

deny from 216.228.163.41

Når jeg smider den linie ind på postede, så kan jeg ikke komme ind på sitet.
Avatar billede coderdk Praktikant
22. juni 2004 - 19:46 #17
AcceptPathInfo On
<Files 403.shtml>
order allow,deny
allow from all
</Files>
deny from 216.228.163.41

Burde virke... Evt. prøv med:

<Files 403.shtml>
order allow,deny
allow from all
</Files>
deny from 216.228.163.41
<Files redir.php>
AcceptPathInfo On
</Files>
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:47 #18
Jeg har noget der hedder "Apache Handlers" (I cPanel), er det noget der kan bruges?
Avatar billede coderdk Praktikant
22. juni 2004 - 19:47 #19
Ellers ved jeg ikke, så må du prøve med rewrite...
Avatar billede coderdk Praktikant
22. juni 2004 - 19:49 #20
Uhm, no idea :)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:50 #21
Første forslag virkede ikke. Fik denne fejl ved andet forslag:

Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, webmaster@savefile.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.

More information about this error may be available in the server error log.


Additionally, a 500 Internal Server Error error was encountered while trying to use an ErrorDocument to handle the request.
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:51 #22
øv øv, kan det skyldes at min redir.php ikke ligger samme sted som mine uploads?
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:52 #23
Det mod_rewrite skal det bare smides i en .htaccess fil?
Avatar billede coderdk Praktikant
22. juni 2004 - 19:53 #24
Nej, det skyldes at apache ikke vil godtage PATH_INFO...
Hvis du ikke kan sætte AcceptPathInfo, er du nok nødt til at ty til mod_rewrite-løsningen
Avatar billede coderdk Praktikant
22. juni 2004 - 19:53 #25
Yeps, .htaccess
Avatar billede kgp43 Nybegynder
22. juni 2004 - 19:56 #26
Lige for at være sikker:

Jeg bruger denne kode:
RewriteRule /users/([0-9]+)\.([a-z]+) /redir.php?id=$1&type=$2

- smider htaccess filen ind i "users" mappen (jeg indeholder en mappe med alle uploads)
- redir.php ligger stadig i roden
Avatar billede Syska Mester
22. juni 2004 - 19:57 #27
virker meget smart, må man se resten af din kode kqp43, altså hvordan du henter og smider billedet tilbage til brugeren via det id.....
Avatar billede coderdk Praktikant
22. juni 2004 - 19:59 #28
Nej, ret den .htaccess der ligger i roden!

<Files 403.shtml>
order allow,deny
allow from all
</Files>

deny from 216.228.163.41

RewriteRule /users/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1&type=$2

(du bruger vist ikke type? så /redir.php?id=$1)

Du skal så IKKE oprette et /users/ bibliotek!
Avatar billede coderdk Praktikant
22. juni 2004 - 20:02 #29
Rewrite laver en "virtuel" mappe, så dette vil virke:

RewriteRule /usrimg/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1&type=$2

http://www.savefile.com/usrimg/2336654.jpg

Den redirecter usynligt til

http://www.savefile.com/redir.php?id=2336654&type=jpg
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:02 #30
Weird.

Jeg har rettet htaccess og redir, men får stadig en 404.


.htaccess:
<Files 403.shtml>
order allow,deny
allow from all
</Files>
deny from 216.228.163.41

RewriteRule /users/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1


redir.php:
<?
include("/home/savefile/public_html/db.php");

//Adding slashes to the variable
function my_addslashes($streng){
  return get_magic_quotes_gpc()?$streng:addslashes($streng);
}

$id = my_addslashes($id);
$id = my_addslashes($id);

$ip = getenv("REMOTE_ADDR");
$referer = $_SERVER['HTTP_REFERER'];

        // Find the filename and dest
        $query = mysql_query("SELECT * FROM files WHERE id='$id' ");
        $query = mysql_fetch_array($query);
        $file_name = $query[file_name];
        $file_ext = $query[file_ext];
       
        //Renaming the filename
        $random = mt_rand(500,9999999999);
        $random .= ".".$file_ext;
        rename("/home/savefile/public_html/users/uploads/$file_name", "/home/savefile/public_html/users/uploads/$random");
        $file_name = $random;
       
        mysql_query("UPDATE files SET last_load=now(), clicks=clicks+1, file_name='$file_name' WHERE id='$id'");
        mysql_query("INSERT INTO redir (id, file_id, ip, date, referer) values
                                  ('', '$id', '$ip', now(), '$referer')");
       
        if (($file_ext == jpg) || ($file_ext == jpeg) || ($file_ext == gif) || ($file_ext == bmp) || ($file_ext == png) || ($file_ext == swf)) {
            header("Location: http://www.savefile.com/users/uploads/$file_name");
        } else {
            include("/home/savefile/public_html/redir_show.php");
        }
?>
Avatar billede coderdk Praktikant
22. juni 2004 - 20:05 #31
Prøv lige at lave rule'n om til:

RewriteRule /usrimg/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:07 #32
virker heller ikke.... Det anede mig a mod_rewrite kunne volde en del besvær :P
Avatar billede coderdk Praktikant
22. juni 2004 - 20:07 #33
Evt før reglen skriv:

RewriteEngine On
Avatar billede coderdk Praktikant
22. juni 2004 - 20:08 #34
Altså hele din .htaccess:

<Files 403.shtml>
order allow,deny
allow from all
</Files>
deny from 216.228.163.41

RewriteEngine On
RewriteRule /usrimg/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:08 #35
heller ikke
Avatar billede coderdk Praktikant
22. juni 2004 - 20:09 #36
Så virker mod_rewrite ikke på din server :\
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:09 #37
404 fejl
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:10 #38
Det er sku mærkeligt. Har en reseller plan (valgt dem da de fik ros for deres service og muligheder), måske skal jeg enable noget. Jeg vender tilbage (skal lige kontake deres support)

Takker for nu :)=
Avatar billede coderdk Praktikant
22. juni 2004 - 20:10 #39
Np :)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:18 #40
Svar fra supporten:

AndrewT - 06/22/04 @ 01:18 PM CDT
mod_rewrite is available on the server and can be used in the .htaccess files.
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:19 #41
agrrr, glemte sku at spørge om det var noget jeg skulle enable :P
brb
Avatar billede kgp43 Nybegynder
22. juni 2004 - 20:28 #42
Okay, fik dette svar fra supporten:

(Kenneth Poulsen) - 06/22/04 @ 01:20 PM CDT
okay, then we are doing something wrong. Do I have to enable it to each account? Or is it enable by standard? How about PATH_INFO?

--> AndrewT - 06/22/04 @ 01:21 PM CDT
You do not have to enable anything and path_info should work but I'm not for certain as we really do not use mod_rewrite but cPanel does use it a lot.

--> (Kenneth Poulsen) - 06/22/04 @ 01:23 PM CDT
Sorry, but I dont understand you last reply (a part of it):

"...but I'm not for certain as we really do not use mod_rewrite but cPanel does use it a lot."

--> AndrewT - 06/22/04 @ 01:26 PM CDT
As in I'm not certain if path_info will work. mod_rewrite itself works perfectly fine, this I know for certain as cPanel requires it for quite a bit of what it does.


mod_rewrite skulle være aktive - måske også part_info. Har du nogle forslag?
Avatar billede coderdk Praktikant
22. juni 2004 - 22:37 #43
Prøv:

RewriteEngine On
Options +FollowSymLinks
RewriteBase /
RewriteRule ^usrimg/([0-9]+)\.([a-zA-Z]+) /redir.php?id=$1
Avatar billede coderdk Praktikant
22. juni 2004 - 22:40 #44
Efter du har tilføjet:

Options +FollowSymLinks

Prøv evt at se om løsning 1 virker... (Den med $_SERVER['PATH_INFO'])
Avatar billede coderdk Praktikant
22. juni 2004 - 22:52 #45
Weee, jeg kan se du har fået det til at virke :)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 22:57 #46
hvad? nej, det virker ikke
Avatar billede kgp43 Nybegynder
22. juni 2004 - 22:58 #47
Har prøvet den nye kode og path_info)
Avatar billede coderdk Praktikant
22. juni 2004 - 23:07 #48
Du lavede et eller andet før, for den her URL virkede:

http://www.savefile.com/usrimg/2336654.jpg

Hvad lavede du?
Avatar billede kgp43 Nybegynder
22. juni 2004 - 23:07 #49
Woooho, det virker.
Den nye  mod_rewrite virkede - det var mig der lavede rod i upload classen :P

Takker for en MEGA stor hjælp.
Avatar billede coderdk Praktikant
22. juni 2004 - 23:08 #50
(Den gav dog noget fejl i redir.php, men den virkede 100%)
Avatar billede coderdk Praktikant
22. juni 2004 - 23:09 #51
:) godt så! (:
Avatar billede kgp43 Nybegynder
22. juni 2004 - 23:11 #52
Alt skulle virke 100% nu.
Skal bare lige test hotlink delen
Avatar billede kgp43 Nybegynder
22. juni 2004 - 23:13 #53
hehe, hotlink virker perfekt (på forumes der ikke ville godtage "dynamiske billeder", snydt) :D

Superb, jeg kan ikke takke nok
Avatar billede kgp43 Nybegynder
22. juni 2004 - 23:14 #54
point til dig

/Får en del brug for den mod_rewrite kode i andre sammenhænge, så jeg er sku i godt humør lige nu :
Avatar billede coderdk Praktikant
22. juni 2004 - 23:14 #55
Kanon :)
Avatar billede kgp43 Nybegynder
22. juni 2004 - 23:22 #56
Lige en bi-ting.

Jeg renamer den pågældende fil for hvert load (for at forhindre direkte links) - vil have mulighed for at se nogle stats mv.

Spørgsmålet er om det er mere "server venligt" at kører et script hver 6. time (der ændre alle filerne på een gang (er lavet)). Eller er det smartest at forsætte på den nuværende måde? Jeg var vel 20-30k loads i døgnet.
Avatar billede coderdk Praktikant
22. juni 2004 - 23:26 #57
Godt spm... Jeg tror nu ikke at det er så slemt for serveren at rename osv... Men jeg ville smide billedfilerne helt uden for webroot, så man KUN kan tilgå dem via scriptet...
I stedet for så at redirecte til billedet, ved jpeg så lave noget i stil med:

header("Content-Type: image/jpeg");
@readfile("/sti/til/billederne/billede.jpg");

Så er du helt uden om sådan noget ;)
Avatar billede kgp43 Nybegynder
23. juni 2004 - 00:24 #58
Problemet er at de kan uploade tons af forskellige filtyper. Tror heller ikke jeg har adgang til at lille noget uden for root - hvordan tester jeg dette?
Avatar billede coderdk Praktikant
23. juni 2004 - 00:28 #59
Ok, det behøver du heller ikke...
Tilføj dette til din .htaccess:

<Location /users>
  Order Deny,Allow
  Deny from all
</Location>

Så kan skulle der ikke være nogen der kan hotlinke, så skal de gå igennem dit script. Det betyder så også at du IKKE kan redirecte. Men at du skal smide tingene igennem dit script!
Avatar billede kgp43 Nybegynder
23. juni 2004 - 07:14 #60
Hvilket vil sige at jeg ikke kan få nogle stats. Har brug for at se hvormeget trafik de enkelte filer bruger, så jeg tror bare jeg smider cron på mit rename script og kører det hvert 6. time
Avatar billede kgp43 Nybegynder
23. juni 2004 - 07:14 #61
Takker for hjælpen :)
Avatar billede coderdk Praktikant
23. juni 2004 - 09:43 #62
Du kan jo tælle hvor mange gange hver fil bliver downloadet, og så se hvor stor filen er , så har du dine stats ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester