Continuând revizuirea fișierelor htaccess, astăzi vom examina modul de utilizare a mod_rewrite pentru a crea adrese URL destul de bune.
În timp ce unii susțin că URL-urile au destul de mult ajutor în clasamentul motoarelor de căutare, dezbaterea este feroce, toți suntem de acord că URL-urile drăguțe ușurează utilizatorii noștri și adaugă un nivel de profesionalism și poloneză unei aplicații web. Am putut trece peste toate motivele teoretice pentru acest lucru, dar îmi place exemplele din lumea reală mai bine. Cum ar fi sau o urăsc noi toți trebuie să recunoaștem că Twitter este o aplicație web extrem de populară și o parte din motivul pentru care este cu siguranță modul în care aceasta formatează URL-uri. Pot să spun tuturor cuiva știu că numele meu de utilizator Twitter este noahhendrix și știu că profilul meu poate fi găsit cu ușurință la twitter.com/noahhendrix. Acest concept aparent simplu are efecte uriașe în popularitatea aplicației dvs..
Doar pentru a pune lucrurile in perspectiva ne putem uita la un alt site popular de social networking, Facebook. De când site-ul a fost lansat în 2004, sistemul de profil a crescut și a evoluat pentru a se adapta mai bine utilizatorilor, dar o singură gaură a fost URL-ul unui profil. Din momentul în care am înregistrat pe Facebook profilul meu a fost la adresa http://www.facebook.com/profile.php?id=1304880680. Aceasta este destul de o gură plină, și tocmai recent se pare că Facebook și-a dat seama că și-au lansat URL-uri de vanitate Facebook. Acum pot să-mi împărtășesc profilul meu Facebook spunând oamenilor numele meu de utilizator Facebook este "noahhendrix", pe care ei știu că pot fi găsite mergând la facebook.com/noahhendrix. În timp ce șansele sunt că nu vom avea o aplicație la fel de populară ca Facebook, putem împrumuta încă câteva pagini din cartea lor.
O privire de ansamblu rapidă înainte de a ne scufunda în cod, în tutorialul de astăzi vom trece peste două metode ușor diferite de a crea destul de URL-uri folosind HTACCESS. Diferența dintre metode este dacă Apache sau PHP efectuează ridicarea grele pentru a sparge URL-ul în afară de parsare. Vreau să subliniez că tutorialele mod_rewrite sunt aproape la fel de vechi ca și internetul în sine și acest lucru nu este primul. La final, voi folosi una dintre metodele pentru a crea o aplicație simplă pentru a arăta cum vor arăta aceste soluții într-un site web real (nu și 100% din producție). Serviciul pe care îl vom crea este un shortener de adrese URL care poate să oglindească funcționalitatea unor site-uri precum bit.ly, TinyURL sau su.pr. Așa că, fără să mai fugim, să ne uităm la cod.
Mai întâi, putem plasa întregul cod în fișierele Apache .htaccess. Acest lucru ar putea arata cam asa:
Opțiuni + FollowSymLinks RewriteEngine Pe RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ utilizatori / (\ d +) * $ ./profile.php?id=$1 RewriteRule ^ fire / (\ d +) * $ ./thread.php?id=$1 RewriteRule ^ search /(.*)$ ./search.php?query=$1
Să începem de sus și să lucrăm în jos pentru a înțelege mai bine ce se întâmplă aici. Prima linie stabilește mediul până la urmărirea legăturilor simbolice utilizând directiva Opțiuni. Acest lucru poate sau nu poate fi necesar, dar unii gazde web folosesc simbolinks (similar cu aliasul în MacOSX sau comenzile rapide este Windows) pentru erorile frecvente ale cererilor HTTP și acestea sunt, de obicei, fișiere symlinked sau cel puțin așa înțeleg rațiunea. Apoi îi spunem lui Apache că vom folosi motorul de revizuire. Următoarele două linii sunt foarte, foarte importante, restricționând rescrierea adreselor URL numai pe căi care nu există în realitate. Acest lucru împiedică potrivirea regulilor de mai jos example.com/images/logo.png de exemplu. Primul împiedică directoarele existente cu !-d steagul și al doilea cu !-f înseamnă ignorarea fișierelor existente.
Următoarele trei linii sunt comenzile reale de rescriere a URL-urilor. Fiecare linie creează o regulă care încearcă să se potrivească cu un model de expresii regulate față de adresa URL primită. Expresiile regulate, cel puțin pentru mine, sunt un set greu de reguli de reținut, dar întotdeauna mi se pare util să folosesc acest tutorial prin modul lui Jeffery Way al lui Nettut și instrumentul pe care îl recomandă. Mi-a fost ușor să tastați în URL-urile eșantion pe care doriți să le potrivim și apoi să încercăm să hackem împreună modelul.
Primul argument este modelul, între semnul caret și semnul dolarului. Spunem că Apache vrem ca adresele URL să ceară directorul de utilizatori (un director artificial, nu trebuie să existe), urmată de o lungime și / sau orice număr. Paranteza creează un grup de captare, puteți utiliza cât mai multe dintre acestea, după cum doriți, ele servesc ca variabile pe care le putem apoi transplanta în rescrierea noastră. Asteriscul înseamnă că utilizatorul poate introduce orice vrea și nu va afecta rescrierea, aceasta este în primul rând să se ocupe de o bară laterală astfel example.com/users/123 este la fel ca example.com/users/123/ așa cum s-ar aștepta utilizatorii.
Al doilea argument este calea pe care dorim să o numim, de fapt, acest lucru, spre deosebire de primul, trebuie să fie un dosar real. Spunem Apache căutând în directorul curent pentru un fișier numit profile.php și trimiteți parametrul id = $ de 1 împreună cu el. Amintiți-vă mai devreme grupul de capturare? De aici primim variabila $ 1, grupurile de captură încep de la unu. Aceasta creează o adresă URL pe server ca example.com/profile.php?id=123.
Această metodă este excelentă pentru aplicațiile web vechi care au structuri URL existente care ne împiedică să rescriem cu ușurință backend-ul pentru a înțelege o nouă schemă de adrese URL deoarece adresa URL pare aceeași, însă pentru utilizator se pare mult mai plăcută.
Următoarea metodă este excelentă pentru cei care nu doresc să distribuie prea multă logică Apache și să se simtă mai confortabil în PHP (sau în limbi asemănătoare de scriere). Conceptul aici este captarea oricărei adrese URL pe care serverul o primește și o împinge la o pagină de controler PHP. Acest lucru vine cu avantajul suplimentar al controlului, dar o mai mare complexitate în același timp. Fișierul dvs. HTACCESS ar putea arăta astfel:
Opțiuni + FollowSymLinks RewriteEngine pe RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Totul este la fel ca mai sus, cu excepția ultimei linii, așa că vom trece peste el. În loc să creăm un grup de captare, îi spunem lui Apache să apuce fiecare adresă URL și să o redirecteze index.php. Ceea ce inseamna asta este ca putem face toate manipularea URL-ului nostru in PHP fara a se baza prea mult pe traseele URL stringente din HTACCESS. Iată ce am putea face în partea de sus a fișierului index.php pentru a analiza adresa URL:
Prima linie nu este necesară decât dacă aplicația nu trăiește la directorul rădăcină, cum ar fi demo-urile mele. Înlăturarea părții non-sens a adresei URL pe care nu vreau să o îngrijorez PHP. $ _SERVER [ 'REQUEST_URI'] este o variabilă de server globală pe care PHP o furnizează și stochează adresa URL a solicitării, în general, arată astfel:
/ Envato / destul / php / utilizatori / interogare
După cum puteți vedea, este în principiu totul după numele domeniului. Apoi am împărțit partea rămasă a căii virtuale și l-am împărțit cu / Acest lucru ne permite să luăm variabile individuale. În exemplul meu am imprimat doar $ params arătat în organism, bineînțeles că veți dori să faceți ceva mai util.
Un lucru pe care îl puteți face este să luați primul element al lui $ params array și include un fișier cu același nume și în interiorul fișierului puteți utiliza al doilea element din matrice pentru a executa un anumit cod. Aceasta ar putea arata cam asa:
AVERTISMENT: Prima parte a acestui cod este incredibil de importantă! Trebuie să restricționați cu exactitate ce pagini poate primi un utilizator, astfel încât să nu aibă posibilitatea de a tipări orice pagină pe care o doresc, ghicind la numele fișierelor, cum ar fi un fișier de configurare a bazei de date.
Acum, că ne-am lăsat soapboxul departe de drum, hai să mergem mai departe. Apoi verificăm dacă fișierul solicitat este în $ safe_pages array, iar dacă includem altfel, va include o pagină 404 care nu a fost găsită. În pagina inclusă veți vedea că aveți acces la $ params matrice și puteți lua orice date de la ea, care este necesar în cererea dumneavoastră.
Acest lucru este minunat pentru cei care doresc un pic mai mult control și flexibilitate. În mod evident, este nevoie de un cod suplimentar, deci, probabil, mai bun pentru proiectele noi care nu vor necesita o mulțime de coduri care să fie actualizate pentru a se potrivi noilor formate de adrese URL.
Această ultimă parte a tutorialului ne va permite să folosim codul la care ne-am referit mai sus și este mai mult sau mai puțin un exemplu "real". Vom crea un serviciu numit shrtr, Am facut acest nume, astfel incat orice alte produse cu acest nume nu sunt asociate cu codul pe care il postez mai jos. Notă: Știu că acest lucru nu este de departe un concept original și este destinat doar demonstrației mod_rewrite. Mai întâi să aruncăm o privire la baza de date:
După cum puteți vedea acest lucru este foarte simplu, avem doar 4 coloane:
Apoi, hai să trecem peste cele șase fișiere pe care trebuie să le creăm pentru această aplicație:
Asta este tot ce avem nevoie pentru exemplul nostru de bază. Nu voi acoperi index.php sau css / style.css în foarte mare detaliu pentru că nu au PHP și sunt fișiere statice.
# index.php ----Face URL-uri Shrtr shrtr.pe mine
Singurul lucru interesant de reținut aici este faptul că trimitem formularul cu un câmp numit URL la create.php.
# css / style.css ---- / * resetare * / * font-family: Helvetica, sans-serif; marja: 0; umplutura: 0; / * site * / html, corp fundal-culoare: # 008AB8; a culoare: albastru; text-decoration: nici una; #pagewrap margin: 0 auto; lățime: 405px; h1 culoare: alb; marja: 0; text-align: centru; font-size: 100px; h1 .r culoare: albastru; . corp -moz-border-radius: 10px; -webkit-border-radius: 10px; fundal-culoare: alb; text-align: centru; padding: 50px; înălțime: 80px; poziție: relativă; instrucțiuni. display: bloc; margin-bottom: 10px; .corp .back dreapta: 15px; top: 10px; poziția: absolută; introducerea corpului [tip = text] display: block; font-size: 20px; margin-bottom: 5px; text-align: centru; padding: 5px; înălțime: 20px; lățime: 300px;
Acest lucru este foarte generic, dar face ca aplicația noastră să fie puțin mai prezentabilă.
Ultimul fișier de bază la care trebuie să ne uităm este al nostru db_config.php, Am creat acest lucru pentru a elimina unele informații despre conexiunea bazei de date.
# db_config.php ----
Trebuie să înlocuiți valorile cu ceea ce funcționează în baza dvs. de date, iar gazda este probabil gazdă locală, dar trebuie să faceți dublu verificarea cu furnizorul dvs. de gazduire pentru a vă asigura. Aici este dumpul SQL al tabelului, url_redirects care deține toate informațiile pe care le-am arătat mai sus:
-- -- Structura tabelului pentru tabelul "url_redirects" - CREATE TABLE DACA NU EXISTA "url_redirects" ('id' int (11) NOT NULL auto_increment, 'short' varchar (10) NOT NULL, create_at 'timestamp NOT NULL implicit CURRENT_TIMESTAMP, KEY PRIMARY (' id '), KEY' scurt '(' scurt ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
În continuare, vă vom uita la codul necesar pentru a crea URL-ul nostru scurt.
# create.php ---- shttr.me/".$short; altceva $ html = "Eroare: nu găsiți baza de date"; mysql_close ($ db);?>Face URL-uri Shrtr shrtr.pe mine
= $html ?>
X
Acum suntem un pic mai complex! Mai întâi trebuie să includem variabilele de conexiune baze de date pe care le-am creat mai devreme, apoi stocăm parametrul URL trimis de noi prin formularul de creare într-o variabilă numită $ url. Apoi vom face niște expresii regulate de magie pentru a verifica dacă au trimis de fapt o adresă URL, dacă nu stocăm o eroare. Dacă utilizatorul a introdus o adresă URL validă, creăm o conexiune la baza de date utilizând variabilele de conectare pe care le includem în partea de sus a paginii. Apoi vom genera un șir aleatoriu de 5 caractere pentru a salva în baza de date, folosind funcția substr. Șirul pe care l-am împărțit este md5 hash-ul timpului curent () și $ url concatenate împreună. Apoi introduceți acea valoare în url_redirects tabel împreună cu adresa URL reală și stocați un șir pentru a fi prezentat utilizatorului. Dacă nu reușim să inserăm datele, stocăm o eroare. Dacă vă deplasați în jos în partea HTML a paginii, tot ce facem este să tipăriți valoarea $ html, fie eroare sau succes. Aceasta, evident, nu este soluția cea mai elegantă, dar funcționează!
Așa că avem adresa URL din baza de date pe care să lucrăm serve.php astfel încât putem traduce codul scurt într-o redirecționare.
Face URL-uri Shrtr shrtr.pe mine
= $html ?>
X
Aceasta este foarte asemănătoare create.php vom include informațiile bazei de date și vom stoca codul scurt trimis la noi într-o variabilă numită $ scurt. Apoi vom interoga baza de date pentru URL-ul codului scurt. Dacă vom obține un rezultat, vom redirecționa la adresa URL, dacă nu vom imprima o eroare ca înainte.
În ceea ce privește PHP, acesta este tot ceea ce trebuie să facem, dar în momentul de față să împărtășim o scurtă adresă URL utilizatorii trebuie să introducă acest lucru, http://shrtr.me/server.php?short=SHORT_CODE nu foarte frumos este? Să vedem dacă nu putem încorpora un cod mod_rewrite pentru a face acest lucru mai bun.
Dintre cele două metode pe care le-am scris despre începutul tutorialului, vom folosi Apache, deoarece această aplicație este deja creată fără a lua în considerare parsarea unui URL. Codul va arata cam asa:
Opțiuni + FollowSymLinks RewriteEngine Pe RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Trecând la RewriteRule direcționăm orice trafic care nu are deja un fișier sau un director real serve.php și punând extensia în variabila GET scurtă. Nu-i rău să nu-l încercați singur!
Astazi am invatat cateva moduri diferite de a folosi mod_rewrite in aplicatia noastra pentru a face URL-urile noastre frumoase. Ca întotdeauna voi urmări comentariile dacă cineva are probleme sau dacă mă puteți contacta pe Twitter. Vă mulțumim pentru lectură!