WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   /index.php/hello/ hur fungerar detta? (https://www.wn.se/forum/showthread.php?t=1039517)

grinditwp 2009-12-09 15:50

/index.php/hello/ hur fungerar detta?
 
Har sett att bland annat FW CodeIgniter använder sig av url strukturen likt;
www.minadress.se/index.php/hello/

Där hello i sin tur anropar en class med namnet hello.

Detta förstår jag relativt väl.
I Ci så kollar de typ bara adressen med URL_PATH.

Men hur fungerar egentligen url struktur? Fungerar detta på alla webbservrar? Varför får man inte en page not found, eftersom mappen /index.php/hello/ inte finns.

Hoppas ni förstår min fråga :)

BjörnJ 2009-12-09 17:20

Det du troligen vill läsa mer om är mod_rewrite.
http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html

Jag ser dock ingen vits med att ha kvar index.php när det lika gärna kan stå minadress.se/hello/ och då genom mod_rewrite skicka med hello som parameter till index.php.

crazzy 2009-12-09 17:22

Det beror på en teknik som kallas URL rewrite. T.ex. mod_rewrite i apache.
Lite intro till rewrite: http://en.wikipedia.org/wiki/Rewrite_engine
Url rewrite guide i apache: http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

De flesta framework och färdiga system (typ wordpress) ber webbservern att redirecta alla urler som inte är en fil eller mapp som faktiskt finns till index.php och sedan läser dem av urlerna i t.ex. $_SERVER['REQUEST_URI] i php.

edit:
Exempel på funktion för att avläsa urler:
Kod:

function url_segment($x) {
        $uri=explode('?',$_SERVER['REQUEST_URI']);
        $segs=explode('/',$uri[0]);
        array_shift($segs);
        if(array_key_exists($x,$segs)) return escape($segs[$x]);
        else return false;
}

Så om du anropar den som url_segment(0) så får du det som kommer efter första slashet.
Funktionen filtrerar bort query-stringen. (Frågetecken och allt efter det)
Finns det inget på den positionen som efterfrågas så returneras false.
Det som returneras filtreras även med en funktion vid namn escape för att förhindra sql injections.
Den funktionen ser ut såhär:
Kod:

function escape($x) {
        if(get_magic_quotes_gpc())stripslashes($x);
        return htmlspecialchars($x);
}

Ett litet exempel på hur man kan göra för att läsa av urler på ett fint sätt. :)

Clarence 2009-12-09 18:47

Nja, i fallet med http://host/index.php/var1/var2 behövs ingen extra url-omskrivning för att en default setup av apache ska hantera den. Då letar Apache från höger steg för steg efter kataloger och filer som matchar URLen. Dvs letar efter /index.php/var1/var2/ sen /index.php/var1/var2, /index.php/var1/, /index.php/var1, /index.php/ och till sist /index.php.

För att undvika att ha med .php i URLen kan man också lägga till en ForceType på alla variabler man vill ska kunna ersätta den (för att alltid använda /index/vars/ så lägger man t ex bara till den på just index.

crazzy 2009-12-09 19:41

Du menar $_SERVER['PATH_INFO'] ?

grinditwp 2009-12-10 09:54

Citat:

Ursprungligen postat av Clarence (Inlägg 20334787)
Nja, i fallet med http://host/index.php/var1/var2 behövs ingen extra url-omskrivning för att en default setup av apache ska hantera den. Då letar Apache från höger steg för steg efter kataloger och filer som matchar URLen. Dvs letar efter /index.php/var1/var2/ sen /index.php/var1/var2, /index.php/var1/, /index.php/var1, /index.php/ och till sist /index.php.

För att undvika att ha med .php i URLen kan man också lägga till en ForceType på alla variabler man vill ska kunna ersätta den (för att alltid använda /index/vars/ så lägger man t ex bara till den på just index.

Detta bör alltså fungera på mer eller mindre alla servrar?
Är det sökmotors vänligt?


Alla tider är GMT +2. Klockan är nu 05:54.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson