Fortsatt vår recension av htaccess-filer, idag undersöker vi hur man använder mod_rewrite för att skapa vackra webbadresser.
Medan vissa hävdar ganska snygga webbadresser i sökmotorrangeringar är debatten här hård, vi kan alla vara överens om att vackra webbadresser gör det enklare för våra användare och lägger till en nivå av professionalism och polerar till alla webbapplikationer. Jag kunde gå över alla teoretiska skäl till det här, men jag gillar exempel på verkliga världar bättre. Gilla det eller hata det, måste vi alla erkänna att Twitter är en väldigt populär webbapplikation och en del av anledningen till det är verkligen hur det formaterar webbadresser. Jag kan berätta för alla om att mitt Twitter-användarnamn är noahhendrix, och de vet att min profil lätt kan hittas på twitter.com/noahhendrix. Detta till synes enkla koncept har stora effekter i populariteten för din ansökan.
Bara för att sätta saker i perspektiv kan vi titta på en annan populär webbplats för socialt nätverk, Facebook. Sedan webbplatsen lanserades 2004 har profilsystemet vuxit och utvecklats till bättre skräddarsydda användare, men ett skarpt hål var webbadressen till en profil. Från den tid jag registrerade mig på Facebook var min profil på adressen http://www.facebook.com/profile.php?id=1304880680. Det är ganska munnfullt, och nyligen visade det sig att Facebook har insett det och de lanserade Facebook-fåfängsadresser. Nu kan jag dela min Facebook-profil genom att säga att mitt Facebook-användarnamn är "noahhendrix", vilket de vet kan hittas genom att gå till facebook.com/noahhendrix. Medan oddsen är att vi inte kommer att få en ansökan så populär som Facebook, kan vi fortfarande låna några sidor från sin bok.
En snabb överblick innan vi dyker in i kod, i dagens handledning kommer vi att gå över två lite olika metoder för att skapa vackra webbadresser med HTACCESS. Skillnaden mellan metoderna är huruvida Apache eller PHP gör det tunga för att bryta URL-adressen för att analysera. Jag vill påpeka att mod_rewrite tutorials är nästan lika gamla som internet själva och det här är inte det första. I slutet kommer jag att använda en av metoderna för att skapa en enkel applikation för att visa hur dessa lösningar skulle se ut på en verklig webbplats (inte 100% produktionskvalitet). Tjänsten vi ska skapa är en URL-kortare som kan spegla funktionaliteten hos sådana webbplatser som bit.ly, TinyURL eller su.pr. Så utan mer fluff låt oss titta på koden.
Först kan vi placera all vår kod i Apache. Htaccess-filer. Det kan se ut så här:
Alternativ + FollowSymLinks OmskrivningEngine På OmskrivningCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ användare / (\ d +) * $ ./profile.php?id=$1 RewriteRule ^ trådar / (\ d +) * $ ./thread.php?id=$1 RewriteRule ^ search /(.*)$ ./search.php?query=$1
Låt oss börja på toppen och arbeta oss ner för att bättre förstå vad som händer här. Den första raden ställer in miljön för att följa symboliska länkar med alternativdirektivet. Det kan eller kanske inte är nödvändigt, men vissa webbhotell använder symlinks (liknande alias i MacOSX eller genvägar är Windows) för vanliga HTTP-förfrågningsfel och det är vanligtvis symlinkerade filer, eller åtminstone så förstår jag resonemanget. Nästa berättar vi Apache vi kommer att använda Rewrite Engine. De två följande raderna är väldigt mycket viktiga, det begränsar endast omskrivning av webbadresser till vägar som inte existerar. Detta förhindrar att reglerna nedan matchar example.com/images/logo.png till exempel. Den första hindrar befintliga kataloger med !-d flagga och den andra med !-f innebär att ignorera befintliga filer.
De följande tre raderna är de faktiska kommandona för URL-omskrivning. Varje rad skapar en regel som försöker matcha ett vanligt uttrycksmönster mot den inkommande webbadressen. Regelbundna uttryck, åtminstone för mig, är en hård uppsättning regler att komma ihåg men jag tycker alltid att det är användbart att använda denna handledning av Nettuts egna Jeffery Way och det verktyg han rekommenderar. Jag fann det enkelt att skriva in urvalsadresser som vi vill matcha och försöka hacka ihop mönstret.
Det första argumentet är mönstret mellan caret och dollar tecken. Vi berättar för Apache att vi vill ha webbadresser som kräver användarkatalogen (en artificiell katalog, behöver inte existera) följt av en / och vilken längd som helst. Parametrarna skapar en infångningsgrupp, du kan använda så många av dem som du vill, de fungerar som variabler som vi sedan kan transplantera till vår omskrivning. Asterisken betyder att användaren kan ange vad de vill ha, och det kommer inte att påverka omskrivningen, det här är främst för att hantera en efterföljande snedstreck så example.com/users/123 är det samma som example.com/users/123/ som användare skulle förvänta sig.
Det andra argumentet är den väg som vi faktiskt vill ringa, detta till skillnad från det första måste vara en riktig fil. Vi ber Apache att se i den aktuella katalogen för en fil som heter profile.php och skicka parametern id = $ 1 tillsammans med den. Kom ihåg fångstgruppen tidigare? Det är här vi får variabeln $ 1, fångstgrupper börjar vid en. Detta skapar en URL på servern som example.com/profile.php?id=123.
Denna metod är utmärkt för äldre webbapplikationer som har befintliga webbadressstrukturer som hindrar oss från att enkelt skriva om backend för att förstå ett nytt webbadressschema, eftersom serverns URL ser ut som detsamma, men till användaren ser det mycket trevligare ut.
Denna nästa metod är utmärkt för dem som inte vill distribuera för mycket logik till Apache och känner sig mer bekväma i PHP (eller liknande skriptspråk). Konceptet här är att fånga vilken webbadress som servern tar emot och trycka den på en PHP-kontrollersida. Detta kommer med den extra fördelen av kontroll, men större komplexitet samtidigt. Din HTACCESS-fil kan se ut så här:
Alternativ + FollowSymLinks OmskrivningEngine På RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Allt är detsamma som ovan, utom den sista raden så vi kommer att hoppa över den. I stället för att skapa en fångstgrupp berättar vi bara Apache att få tag i alla webbadresser och omdirigera den till index.php. Vad det här betyder är att vi kan göra all vår URL-hantering i PHP utan att förlita oss för mycket på stränga URL-banor i HTACCESS. Här är vad vi kan göra överst i vår index.php-fil för att analysera webbadressen:
Den första raden är inte nödvändig om inte din ansökan inte bor i rotkatalogen, som mina demo. Jag tar bort den icke-sanna delen av webbadressen som jag inte vill att PHP ska oroa sig för. $ _SERVER [ 'REQUEST_URI'] är en global servervariabel som PHP tillhandahåller och lagrar begäran-webbadressen, ser det allmänt ut så här:
/ Envato / söt / php / användare / query
Som du kan se är det i princip allt efter domännamnet. Därefter delade vi upp den återstående delen av den virtuella vägen och splittrade den av / tecken som gör det möjligt för oss att ta tag i enskilda variabler. I mitt exempel tryckte jag bara på $ params array ut i kroppen, naturligtvis vill du göra något lite mer användbart.
En sak du kanske gör är att ta den första delen av $ params array och inkludera en fil med samma namn och inom filen kan du använda det andra elementet i matrisen för att utföra en viss kod. Det här kan se ut så här:
VARNING: Den första delen av den här koden är otroligt viktigt! Du måste absolut begränsa vilka sidor en användare kan få så att de inte har möjlighet att skriva ut någon sida som de önskar genom att gissa på filnamn, som en databaskonfigurationsfil.
Nu när vi har tvålkassen ur vägen, så låt oss gå vidare. Nästa kontrollerar vi om den begärda filen finns i $ safe_pages array, och om det är vi inkluderar annars kommer det att inkludera en 404 sida som inte hittades. På den medföljande sidan ser du att du har tillgång till $ params array och du kan ta tag i vad som helst som behövs i din ansökan.
Detta är bra för dem som vill ha lite mer kontroll och flexibilitet. Det kräver självklart ganska lite extra kod, så förmodligen bättre för nya projekt som inte kräver mycket kod som ska uppdateras för att passa de nya URL-formaten.
Den här sista delen av handledningen kommer att låta oss använda oss av koden vi gick över ovan och är mer eller mindre ett "verkligt" exempel. Vi ska skapa en tjänst som heter shrtr, Jag har gjort det här namnet så att alla andra produkter med detta namn inte är kopplade till koden jag lägger ut nedan. Notera: Jag vet att detta inte är ett originellt koncept, och det är endast avsett för demonstration av mod_rewrite. Låt oss först titta på databasen:
Som du kan se är det väldigt enkelt, vi har bara 4 kolumner:
Låt oss sedan gå över de sex filer som vi behöver skapa för den här applikationen:
Det är allt vi behöver för vårt grundläggande exempel. Jag kommer inte att täcka index.php eller css / style.css i mycket stor detalj eftersom de inte har PHP, och är statiska filer.
# index.php ----Gör URL-adresser Shrtr shrtr.mig
Det enda som är riktigt intressant att notera här är att vi skickar in formuläret med ett fält som heter URL till create.php.
# css / style.css ---- / * reset * / * font-family: Helvetica, sans-serif; marginal: 0; vaddering: 0; / * site * / html, body background-color: # 008AB8; en färg: mörkblå; text-dekoration: none; #pagewrap margin: 0 auto; bredd: 405px; h1 färg: vit; marginal: 0; text-align: center; typsnittstorlek: 100px; h1 .r färg: mörkblå; .body -moz-border-radius: 10px; -webkit-gräns-radie: 10px; bakgrundsfärg: vit; text-align: center; vaddering: 50px; höjd: 80px; position: relativ; .body .instructions display: block; marginal-botten: 10px; .body .back right: 15px; topp: 10px; position: absolut; .body input [typ = text] display: block; fontstorlek: 20px; marginal-botten: 5px; text-align: center; vaddering: 5px; höjd: 20px; bredd: 300px;
Det är alldeles generiskt, men gör vår ansökan lite mer presentabel.
Den sista grundläggande filen vi behöver titta på är vår db_config.php, Jag skapade detta för att sammanfatta en del av databasanslutningsinformationen.
# db_config.php ----
Du måste ersätta värdena med vad som fungerar i din databas, och värd är förmodligen lokal värd, men du måste dubbla kontrollera med din webbleverantör för att se till. Här är SQL-dumpningen i tabellen, url_redirects som innehåller all information vi visade ovan:
-- -- Tabellstruktur för tabell 'url_redirects' - Skapa tabell om inte existerar 'url_redirects' ('id' int (11) INTE NULL auto_increment, 'short' varchar (10) INTE NULL, 'url' varchar (255) INTE NULL, ' created_at 'tidsstämpel INTE NULL standard CURRENT_TIMESTAMP, PRIMÄR KEY (' id '), nyckel' kort '(' kort ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
Nästa kan titta på koden som behövs för att skapa vår korta URL.
# create.php ---- shrtr.me/".$short; else $ html = "Fel: kan inte hitta databasen"; mysql_close ($ db);?>Gör URL-adresser Shrtr shrtr.mig
= $html ?>
X
Nu blir vi lite mer komplexa! Först måste vi inkludera databasanslutningsvariablerna som vi skapade tidigare, då lagrar vi URL-parametern som skickats till oss genom att skapa formuläret i en variabel som heter $ url. Därefter gör vi några reguljära uttryck som magiska för att kontrollera om de faktiskt skickade en URL, om inte vi lagrar ett fel. Om användaren angav en giltig URL skapar vi en anslutning till databasen med hjälp av anslutningsvariablerna som vi inkluderar längst upp på sidan. Därefter genererar vi en slumpmässig 5 teckensträng för att spara till databasen, med hjälp av substr-funktionen. Strängen vi delar upp är md5 hash för den aktuella tiden () och $ url sammanfogade tillsammans. Då lägger vi in det här värdet i url_redirects bord tillsammans med den faktiska webbadressen och lagra en sträng som ska presenteras för användaren. Om det inte går att infoga data lagrar vi ett fel. Om du flyttar ner till HTML-delen av sidan är allt vi gör skriv ut värdet av $ html, vare sig det är fel eller framgång. Detta är uppenbarligen inte den mest eleganta lösningen men det fungerar!
Så vi har webbadressen i databasen låt oss arbeta på serve.php så vi kan faktiskt översätta kortkoden till en omdirigering.
Gör URL-adresser Shrtr shrtr.mig
= $html ?>
X
Den här liknar mycket create.php Vi inkluderar databasinformationen och lagrar kortkoden som skickats till oss i en variabel som heter $ kort. Nästa frågar vi databasen för webbadressen till den korta koden. Om vi får ett resultat omdirigeras vi till webbadressen, om inte vi skriver ut ett fel som tidigare.
Så långt som PHP går är det allt vi behöver göra, men för tillfället att dela en kort URL-användare måste ange detta, http://shrtr.me/server.php?short=SHORT_CODE inte väldigt söt är det? Låt oss se om vi inte kan ta med någon mod_rewrite-kod för att göra det trevligare.
Av de två metoderna jag skrev om i början av handledningen kommer vi att använda Apache-en eftersom den här applikationen redan är skapad utan att överväga någon parsing av webbadresser. Koden kommer att se ut så här:
Alternativ + FollowSymLinks OmskrivningEngine På RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Hoppa över till RewriteRule Vi riktar alla trafik som inte redan har en riktig fil eller katalog till serve.php och lägger förlängningen i GET-variabeln kort. Inte för dåligt nej, gå och prova själv!
Idag lärde vi oss några olika sätt att använda mod_rewrite i vår applikation för att göra våra webbadresser snygga. Som alltid tittar jag på kommentarer om någon har problem, eller du kan kontakta mig på twitter. Tack för att du läser!