Bruke htaccess-filer for nydelige nettadresser

Fortsatt vår gjennomgang av htaccess-filer, i dag vil vi undersøke hvordan du bruker mod_rewrite for å lage vakre nettadresser.

Fordeler med formaterte nettadresser

Mens noen hevder at det er riktige nettadresser i søkemotorrangeringer, er debatten her sterk, vi kan alle være enige om at fine nettadresser gjør ting enklere for brukerne våre, og legger til et nivå av profesjonalitet og polsk til hvilken som helst webapplikasjon. Jeg kunne gå over alle de teoretiske grunnene til dette, men jeg liker eksempler på virkelige verden bedre. Liker det eller hater det, vi må alle innrømme at Twitter er et populært webprogram, og en del av grunnen til det er absolutt hvordan den formaterer nettadresser. Jeg kan fortelle alle som vet at mitt Twitter brukernavn er noahhendrix, og de vet at profilen min lett kan bli funnet på twitter.com/noahhendrix. Dette tilsynelatende enkle konseptet har store effekter i populariteten til søknaden din.

Bare for å sette ting i perspektiv kan vi se på et annet populært nettsamfunn for sosiale nettverk, Facebook. Siden siden ble lansert i 2004, har profilsystemet vokst og utviklet seg til å skreddersy til brukere, men et klart hull var nettadressen til en profil. Fra den tiden jeg registrerte meg på Facebook, var profilen min på adressen http://www.facebook.com/profile.php?id=1304880680. Det er ganske munnfylt, og for nylig ser det ut som Facebook har innsett det, og de lanserte Facebook forfengelighet-nettadresser. Nå kan jeg dele min Facebook-profil ved å fortelle folk at mitt Facebook brukernavn er "noahhendrix", som de vet kan bli funnet ved å gå til facebook.com/noahhendrix. Mens sjansene er at vi ikke vil få et søknad så populært som Facebook, kan vi fremdeles låne noen få sider fra boken deres.

Raskt Overblikk

En rask oversikt før vi dykker inn i kode, i dagens veiledning vil vi gå over to litt forskjellige metoder for å lage fine nettadresser ved hjelp av HTACCESS. Forskjellen mellom metodene er om Apache eller PHP gjør tung løft for å bryte nettadressen for hverandre for å analysere. Jeg vil påpeke at mod_rewrite opplæringsprogrammer er nesten like gamle som internett selv og dette er ikke det første. På slutten vil jeg bruke en av metodene for å lage en enkel applikasjon for å vise hvordan disse løsningene vil se på en ekte live nettsted (ikke 100% produksjonskvalitet). Tjenesten vi skal opprette, er en URL-kortlegger som kan speile funksjonaliteten til slike nettsteder som bit.ly, TinyURL eller su.pr. Så uten mer fluff la oss se på koden.

Bruker apache

Først kan vi plassere all vår kode i Apache. Htaccess-filer. Dette kan se slik ut:

 Alternativer + FølgSymLinks OmskrivningEngin På OmskrivningCond%! SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ brukere / (\ d +) * $ ./profile.php?id=$1 RewriteRule ^ tråder / (\ d +) * $ ./thread.php?id=$1 RewriteRule ^ søk /(.*)$ ./search.php?query=$1

La oss starte på toppen og jobbe oss ned for å bedre forstå hva som skjer her. Den første linjen setter miljøet opp for å følge symbolske lenker ved hjelp av valgdirektivet. Dette kan eller ikke er nødvendig, men noen webverter bruker symlinks (lik alias i MacOSX eller snarveier er Windows) for vanlige HTTP-forespørselsfeil, og disse er vanligvis symlink-filer, eller i det minste er dette slik jeg forstår argumentasjonen. Neste forteller vi Apache, vi skal bruke Rewrite Engine. De to neste linjene er veldig, veldig viktige, det begrenser omskrivning av nettadresser bare til baner som ikke eksisterer. Dette forhindrer reglene nedenfor fra å matche example.com/images/logo.png for eksempel. Den første hindrer eksisterende kataloger med !-d flagg og det andre med !-f betyr å ignorere eksisterende filer.

De neste tre linjene er de faktiske URL-rewriting-kommandoene. Hver linje oppretter en regel som prøver å matche et vanlig uttrykksmønster mot den innkommende nettadressen. Regelmessige uttrykk, i hvert fall for meg, er et hardt sett med regler å huske, men jeg finner det alltid nyttig å bruke denne opplæringen av Nettuts egen Jeffery Way og verktøyet han anbefaler. Jeg fant det enkelt å skrive inn utvalgsadresser vi vil matche, og deretter prøve å hacke sammen mønsteret.

Det første argumentet er mønsteret mellom caret og dollar tegn. Vi forteller Apache at vi vil ha nettadresser som ber om brukerkatalogen (en kunstig katalog, må ikke eksistere) etterfulgt av en / og en lengde på tall. Parentesen oppretter en fangstgruppe, du kan bruke så mange av disse som du vil, de tjener som variabler som vi deretter kan transplantere inn i vår omskrivning. Asterisken betyr at brukeren kan skrive inn hva de vil, og det vil ikke påvirke omskrivningen, dette er først og fremst å håndtere en bakre skråstrek så example.com/users/123 er det samme som example.com/users/123/ som brukerne ville forvente.

Det andre argumentet er banen vi vil faktisk ringe, dette til forskjell fra det første må være en ekte fil. Vi forteller Apache å se i gjeldende katalog for en fil som heter profile.php og send parameteren id = $ 1 sammen med det. Husk fangstgruppen tidligere? Det er her vi får variabelen $ 1, fangstgrupper starter ved en. Dette skaper en URL på serveren som example.com/profile.php?id=123.

Denne metoden er perfekt for eldre webprogrammer som har eksisterende nettadressestrukturer som hindrer oss fra å omskrive backendene på en enkel måte, for å forstå et nytt nettadresseskjema fordi serveren ser nettadressen ut på samme måte, men til brukeren ser den mye bedre ut.

Bruke PHP

Denne neste metoden er flott for de som ikke vil distribuere for mye logikk til Apache og føle seg mer komfortabel i PHP (eller lignende skriptspråk). Konseptet her er å fange opp hvilken som helst URL serveren mottar og skyve den til en PHP-kontroller-side. Dette kommer med den ekstra fordelen av kontroll, men større kompleksitet på samme tid. HTACCESS-filen din kan se slik ut:

 Valg + FølgSymLinks OmskrivningEngin På OmskrivningCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php

Alt er det samme som ovenfor, unntatt den siste linjen, så vi vil hoppe over til den. I stedet for å lage en fangstgruppe, forteller vi bare Apache å få tak i hver nettadresse og omdirigere den til index.php. Hva dette betyr er at vi kan gjøre all vår URL-håndtering i PHP uten å stole for mye på strenge URL-baner i HTACCESS. Her er hva vi kan gjøre øverst i vår index.php-fil for å analysere URL-adressen:

 

Den første linjen er ikke nødvendig med mindre du søker ikke på rotkatalogen, som mine demoer. Jeg fjerner den ikke-fornuftige delen av nettadressen som jeg ikke vil at PHP skal bekymre seg for. $ _SERVER [ 'REQUEST_URI'] er en global servervariabel som PHP gir og lagrer forespørselsadressen, ser det vanligvis ut som dette:

 / Envato / pen / php / brukere / spørring

Som du kan se er det egentlig alt etter domenenavnet. Deretter delte vi opp den gjenværende delen av den virtuelle banen og splittet den av / tegn dette tillater oss å ta tak i individuelle variabler. I mitt eksempel skrev jeg nettopp $ params array ut i kroppen, selvfølgelig vil du ønsker å gjøre noe litt mer nyttig.

En ting du kan gjøre er å ta det første elementet i $ params array og inkludere en fil med samme navn og innenfor i filen kan du bruke det andre elementet i arrayet til å utføre noen kode. Dette kan se slik ut:

 

ADVARSEL: Den første delen av denne koden er utrolig viktig! Du må absolutt begrense hvilke sider en bruker kan få, slik at de ikke har mulighet til å skrive ut en hvilken som helst side de ønsker ved å gjette på filnavn, som en databasekonfigurasjonsfil.

Nå som vi har såpekassen ut av veien, la oss gå videre. Deretter sjekker vi om den forespurte filen er i $ safe_pages array, og hvis det er vi inkluderer ellers vil inkludere en 404 ikke funnet side. På den medfølgende siden vil du se at du har tilgang til $ params array og du kan ta tak i hva som helst data fra det som er nødvendig i søknaden din.

Dette er flott for de som vil ha litt mer kontroll og fleksibilitet. Det krever åpenbart litt ekstra kode, så sannsynligvis bedre for nye prosjekter som ikke krever mye kode som skal oppdateres for å passe til de nye nettformatene.

En enkel URL Shortner

Denne siste delen av opplæringen skal gi oss litt bruk av koden vi gikk over ovenfor, og er mer eller mindre et "ekte liv" -eksempel. Vi skal lage en tjeneste som kalles shrtr, Jeg har laget dette navnet slik at andre produkter med dette navnet ikke er knyttet til koden jeg legger inn nedenfor. Merk: Jeg vet at dette er langt ikke et originalt konsept, og er bare ment for demonstrasjon av mod_rewrite. Først la oss ta en titt på databasen:

Som du kan se dette er veldig grei, har vi bare 4 kolonner:

  • id: unik identifikator som brukes til å referere til bestemte rader
  • kort: Unikt tegnstreng som er lagt til slutten av URL-adressen vår for å finne ut hvor du skal omdirigere
  • url: URL-adressen som den korte nettadressen omdirigerer til
  • created_at: En enkel tidsstempel så vi vet når denne nettadressen ble opprettet

Det grunnleggende

Deretter la vi gå over de seks filene vi trenger for å lage for dette programmet:

  • .htaccess: omadresserer alle korte nettadresser til server.php
  • create.php: Validerer URL, lager shortcode, lagrer til DB
  • css / style.css: inneholder noen grunnleggende styling informasjon
  • db_config.php: lagre variabler for databaseforbindelser
  • index.php: Ansiktet til vår søknad med skjema for å skrive inn URL
  • server.php: ser opp kort URL og omadresserer til den faktiske nettadressen

Det er alt vi trenger for vårt grunnleggende eksempel. Jeg vil ikke dekke index.php eller css / style.css i veldig fin detalj fordi de ikke har PHP, og er statiske filer.

 # index.php ----     Gjør webadresser Shrtr    

shrtr.meg

Skriv inn nettadressen din her

Det eneste som er virkelig interessant å merke seg her er at vi sender skjemaet med et felt som heter URL til create.php.

 # css / style.css ---- / * reset * / * font-family: Helvetica, sans-serif; margin: 0; polstring: 0;  / * site * / html, body background-color: # 008AB8;  en farge: mørkblå; tekst-dekorasjon: ingen; #pagewrap margin: 0 auto; bredde: 405px;  h1 farge: hvit; margin: 0; tekst-align: center; skriftstørrelse: 100px;  h1 .r farge: mørkblå;  .body -moz-border-radius: 10px; -webkit-grense-radius: 10px; bakgrunnsfarge: hvit; tekst-align: center; polstring: 50px; høyde: 80px; stilling: relativ;  .body .instructions display: block; margin-bunn: 10px;  .body .back right: 15px; topp: 10px; posisjon: absolutt;  .body input [type = tekst] display: block; skriftstørrelse: 20px; margin-bunn: 5px; tekst-align: center; polstring: 5px; høyde: 20px; bredde: 300px; 

Det er veldig generisk, men gjør søknaden litt mer presentabel.

Den siste grunnleggende filen vi trenger å se på er vår db_config.php, Jeg opprettet dette for å abstrahere noen av databasetilkoblingsinformasjonen.

 # db_config.php ---- 

Du må erstatte verdiene med det som fungerer i databasen, og verten er sannsynligvis lokal vert, men du må dobbeltsjekke med din hosting leverandør for å sikre deg. Her er SQL-dumpen i tabellen, url_redirects som inneholder all informasjon vi viste ovenfor:

 -- -- Tabellstruktur for tabell 'url_redirects' - CREATE TABLE Hvis ikke EXISTS 'url_redirects' ('id' int (11) IKKE NULL auto_increment, 'short' varchar (10) IKKE NULL, 'url' varchar (255) IKKE NULL, ' created_at 'tidsstempel IKKE NULL standard CURRENT_TIMESTAMP, PRIMARY KEY (' id '), NØKKEL' kort '(' kort ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;

Opprett kort URL

Neste kan se koden som er nødvendig for å lage vår korte URL.

 # create.php ---- shrtr.me/".$short; else $ html = "Feil: kan ikke finne database"; mysql_close ($ db);?>     Gjør webadresser Shrtr    

shrtr.meg



X

Nå blir vi litt mer komplekse! Først må vi inkludere databasetilkoblingsvariablene vi opprettet tidligere, da lagrer vi nettadresseparameteren som er sendt til oss av opprettingsskjemaet i en variabel som heter $ url. Deretter gjør vi noen ordinære uttrykk magiske for å sjekke om de faktisk sendte en URL, hvis ikke lagrer vi en feil. Hvis brukeren skrev inn en gyldig nettadresse, oppretter vi en forbindelse til databasen ved hjelp av tilkoblingsvariablene vi finner øverst på siden. Deretter genererer vi en tilfeldig 5 tegnstreng for å lagre i databasen, ved hjelp av substr-funksjonen. Strengen vi deler opp er md5 hash av gjeldende tid () og $ url sammenkoblet sammen. Så setter vi inn denne verdien i url_redirects bord sammen med den faktiske nettadressen, og lagre en streng som skal presenteres for brukeren. Hvis det ikke setter inn dataene lagrer vi en feil. Hvis du beveger deg ned i HTML-delen av siden, er alt vi gjør, skrevet ut verdien av $ html, det være seg feil eller suksess. Dette er åpenbart ikke den mest elegante løsningen, men det fungerer!

Viser kort URL

Så vi har nettadressen i databasen la oss jobbe med serve.php så vi kan faktisk oversette kortkoden til en omdirigering.

      Gjør webadresser Shrtr    

shrtr.meg



X

Denne er veldig lik create.php Vi inkluderer databasen informasjon, og lagre kort koden sendt til oss i en variabel som heter $ kort. Deretter spør vi databasen for nettadressen til den korte koden. Hvis vi får et resultat, omdirigerer vi til nettadressen, hvis ikke, skriver vi ut en feil som før.

Så langt som PHP går, er det alt vi trenger å gjøre, men for øyeblikket å dele en kort URL-bruker må du skrive inn dette, http://shrtr.me/server.php?short=SHORT_CODE ikke veldig pen er det? La oss se om vi ikke kan innlemme noen mod_rewrite-kode for å gjøre dette bedre.

Pretty-ify med HTACCESS

Av de to metodene jeg skrev om i begynnelsen av opplæringen vil vi bruke Apache-en fordi dette programmet allerede er opprettet uten å vurdere noen parsing av nettadresser. Koden vil se slik ut:

 Valg + FølgSymLinks OmskrivningEngin På OmskrivningCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1

Hopp over til RewriteRule vi styrer hvilken som helst trafikk som ikke allerede har en ekte fil eller katalog til serve.php og legger utvidelsen i GET-variabelen kort. Ikke for dårlig nei, prøv det selv!

Konklusjon

I dag lærte vi noen forskjellige måter å utnytte mod_rewrite i søknaden vår for å gjøre nettadressene våre ganske fine. Som alltid vil jeg se over kommentarene hvis noen har problemer, eller du kan kontakte meg på twitter. Takk for at du leste!

  • Følg oss på Twitter, eller abonner på NETTUTS RSS Feed for flere daglige webutviklingsverktøy og artikler.