Continuando la nostra revisione dei file htaccess, oggi esamineremo come utilizzare mod_rewrite per creare URL carini.
Mentre alcuni sostengono che gli URL aiutano nel posizionamento nei motori di ricerca, il dibattito qui è agguerrito, siamo tutti d'accordo sul fatto che i graziosi URL rendono le cose più facili per i nostri utenti e aggiungono un livello di professionalità e lucidità a qualsiasi applicazione web. Potrei esaminare tutti i motivi teorici per questo, ma mi piacciono gli esempi del mondo reale. Piace o lo odio, tutti dobbiamo ammettere che Twitter è un'applicazione web molto popolare e una parte della ragione è che è sicuramente il modo in cui formatta gli URL. Posso dire a chiunque sappia che il mio nome utente Twitter è noahendrix e sanno che il mio profilo può essere facilmente trovato su twitter.com/noahhendrix. Questo concetto apparentemente semplice ha vasti effetti nella popolarità della tua applicazione.
Solo per mettere le cose in prospettiva possiamo guardare un altro popolare sito di social networking, Facebook. Dal momento in cui il sito è stato lanciato nel 2004, il sistema dei profili è cresciuto e si è evoluto per adattarsi meglio agli utenti, ma un buco evidente era l'URL di un profilo. Dal momento in cui mi sono registrato su Facebook, il mio profilo era all'URL http://www.facebook.com/profile.php?id=1304880680. Questa è una bocca piena, e solo di recente sembra che Facebook lo abbia capito e hanno lanciato gli URL di vanità di Facebook. Ora posso condividere il mio profilo Facebook dicendo alla gente che il mio nome utente di Facebook è "noahhendrix", che sanno essere reperibile andando su facebook.com/noahhendrix. Mentre le probabilità sono che non avremo un'applicazione popolare come Facebook, possiamo ancora prendere in prestito alcune pagine dal loro libro.
Una rapida panoramica prima di immergerci nel codice, nel tutorial di oggi andremo oltre due metodi leggermente diversi di creazione di URL piuttosto che utilizzano HTACCESS. La differenza tra i metodi è se Apache o PHP stanno facendo il lavoro pesante per rompere l'URL a parte per l'analisi. Voglio sottolineare che i tutorial di mod_rewrite sono vecchi quasi quanto Internet e questo non è il primo. Alla fine userò uno dei metodi per creare una semplice applicazione per mostrare come queste soluzioni apparirebbero in un sito web reale (non una qualità di produzione del 100%). Il servizio che creeremo è un accorciatore di URL che può rispecchiare la funzionalità di siti come bit.ly, TinyURL o su.pr. Quindi senza più lanugine diamo un'occhiata al codice.
Innanzitutto, possiamo inserire tutto il nostro codice nei file .htaccess di Apache. Questo potrebbe assomigliare a questo:
Opzioni + FollowSymLinks RewriteEngine su RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ users / (\ d +) * $ ./profile.php?id=$1 RewriteRule ^ threads / (\ d +) * $ ./thread.php?id=$1 RewriteRule ^ search /(.*)$ ./search.php?query=$1
Iniziamo dall'alto e scendiamo per capire meglio cosa sta succedendo qui. La prima riga imposta l'ambiente fino a seguire i collegamenti simbolici usando la direttiva Options. Questo potrebbe essere o non essere necessario, ma alcuni host web utilizzano i collegamenti simbolici (simile a un alias in MacOSX o collegamenti Windows) per errori di richiesta HTTP comuni e di solito sono file con collegamenti simbolici, o almeno questo è il modo in cui comprendo il ragionamento. Quindi diciamo ad Apache che useremo il motore di riscrittura. Le prossime due righe sono molto, molto importanti, limitano la riscrittura degli URL solo ai percorsi che in realtà non esistono. Ciò impedisce che le regole seguenti corrispondano example.com/images/logo.png per esempio. Il primo impedisce le directory esistenti con il !-d bandiera e il secondo con !-f significa ignorare i file esistenti.
Le tre linee successive sono i comandi di riscrittura degli URL effettivi. Ogni riga crea una regola che tenta di associare un modello di espressioni regolari all'URL in entrata. Le espressioni regolari, almeno per me, sono un insieme di regole da ricordare, ma trovo sempre utile utilizzare questo tutorial di Jeffery Way di Nettut e lo strumento che raccomanda. Ho trovato facile digitare gli URL di esempio che vogliamo abbinare e quindi provare a hackerare il pattern.
Il primo argomento è il modello, tra il segno di omissione e il simbolo del dollaro. Diciamo ad Apache che vogliamo che gli URL chiedano la directory degli utenti (una directory artificiale, non deve esistere realmente) seguita da una / e qualsiasi lunghezza di numeri. Le parentesi creano un gruppo di cattura, puoi usarne quante ne vuoi, servono come variabili che possiamo poi trapiantare nella nostra riscrittura. L'asterisco indica che l'utente può inserire ciò che desidera e non influirà sulla riscrittura, principalmente per gestire una barra finale così example.com/users/123 equivale a example.com/users/123/ come gli utenti si aspetterebbero.
Il secondo argomento è il percorso che vogliamo effettivamente chiamare, questo a differenza del primo deve essere un file reale. Diciamo ad Apache di cercare nella directory corrente un file chiamato profile.php e invia il parametro id = $ 1 insieme ad esso. Ricorda il gruppo di cattura in precedenza? È qui che otteniamo la variabile $ 1, i gruppi di acquisizione partono da uno. Questo crea un URL sul server come example.com/profile.php?id=123.
Questo metodo è ottimo per le applicazioni Web legacy che hanno strutture URL esistenti che ci impediscono di riscrivere facilmente il back-end per comprendere un nuovo schema URL perché al server l'URL sembra lo stesso, ma per l'utente sembra molto più bello.
Questo metodo successivo è ottimo per coloro che non vogliono distribuire troppa logica ad Apache e sentirsi più a proprio agio in PHP (o in linguaggi di scripting simili). Il concetto qui è di catturare qualsiasi URL che il server riceve e inviarlo a una pagina di controller PHP. Ciò comporta l'ulteriore vantaggio del controllo, ma una maggiore complessità allo stesso tempo. Il tuo file HTACCESS potrebbe essere simile a questo:
Opzioni + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Tutto è come sopra, eccetto l'ultima riga, quindi salteremo su di essa. Invece di creare un gruppo di acquisizione, diciamo semplicemente ad Apache di prendere tutti gli URL e reindirizzare a index.php. Ciò significa che possiamo eseguire tutta la gestione degli URL in PHP senza fare affidamento troppo su percorsi URL rigorosi in HTACCESS. Ecco cosa potremmo fare nella parte superiore del nostro file index.php per analizzare l'URL:
La prima riga non è necessaria a meno che l'applicazione non risieda nella directory root, come le mie demo. Sto rimuovendo la parte non sense dell'URL di cui non voglio che PHP si preoccupi. $ _SERVER [ 'REQUEST_URI'] è una variabile server globale che PHP fornisce e memorizza l'URL della richiesta, in genere è simile a questa:
/ Envato / abbastanza / php / utenti / interrogazione
Come puoi vedere è praticamente tutto dopo il nome del dominio. Successivamente abbiamo diviso la parte restante del percorso virtuale e divisa per il / carattere questo ci permette di afferrare le singole variabili. Nel mio esempio ho appena stampato il $ params schierati nel corpo, ovviamente vorrai fare qualcosa di un po 'più utile.
Una cosa che potresti fare è prendere il primo elemento del $ params array e includere un file con lo stesso nome e all'interno del file è possibile utilizzare il secondo elemento dell'array per eseguire codice. Questo potrebbe sembrare qualcosa del genere:
ATTENZIONE: la prima parte di questo codice è incredibilmente importante! È assolutamente necessario limitare le pagine che un utente può ottenere in modo che non abbiano l'opportunità di stampare qualsiasi pagina che desiderano indovinando i nomi dei file, come un file di configurazione del database.
Ora che abbiamo lasciato il soapbox, andiamo avanti. Quindi controlliamo se il file richiesto è nel $ safe_pages array, e se è incluso includeremo una pagina 404 non trovata. Nella pagina inclusa vedrai che hai accesso a $ params array e puoi prendere qualsiasi dato da esso necessario nella tua applicazione.
Questo è ottimo per chi vuole un po 'più di controllo e flessibilità. Ovviamente richiede un bel po 'di codice in più, quindi probabilmente è meglio per i nuovi progetti che non richiedono un sacco di codice per essere aggiornati per adattarsi ai nuovi formati di URL.
Quest'ultima parte del tutorial ci consentirà di utilizzare al meglio il codice sopra descritto ed è più o meno un esempio di "vita reale". Stiamo per creare un servizio chiamato shrtr, Ho inventato questo nome così nessun altro prodotto con questo nome non è associato al codice che sto postando qui sotto. Nota: So che questo non è di gran lunga un concetto originale, ed è pensato solo per la dimostrazione di mod_rewrite. Prima diamo un'occhiata al database:
Come puoi vedere, questo è molto semplice, abbiamo solo 4 colonne:
Quindi, esaminiamo i sei file che dobbiamo creare per questa applicazione:
Questo è tutto ciò di cui abbiamo bisogno per il nostro esempio di base. Non coprirò index.php o css / style.css in modo molto dettagliato perché non hanno PHP e sono file statici.
# index.php ----Rende gli URL Shrtr shrtr.me
L'unica cosa veramente interessante da notare qui è che inviamo il modulo con un campo chiamato URL a create.php.
# css / style.css ---- / * reset * / * font-family: Helvetica, sans-serif; margine: 0; padding: 0; / * sito * / html, corpo background-color: # 008AB8; a color: darkblue; text-decoration: none; #pagewrap margin: 0 auto; larghezza: 405 px; h1 color: white; margine: 0; allineamento del testo: centro; font-size: 100px; h1 .r color: darkblue; .body -moz-border-radius: 10px; -webkit-border-radius: 10px; colore di sfondo: bianco; allineamento del testo: centro; imbottitura: 50px; altezza: 80 px; posizione: relativa; .body.instructions display: block; margin-bottom: 10px; .body .back right: 15px; inizio: 10px; posizione: assoluta; .body input [type = text] display: block; font-size: 20px; margin-bottom: 5px; allineamento del testo: centro; imbottitura: 5px; altezza: 20px; larghezza: 300 px;
Questo è tutto molto generico, ma rende la nostra applicazione un po 'più presentabile.
L'ultimo file di base che dobbiamo esaminare è il nostro db_config.php, Ho creato questo per astrarre alcune delle informazioni di connessione al database.
# db_config.php ----
È necessario sostituire i valori con ciò che funziona nel database e probabilmente l'host localhost, ma è necessario ricontrollare con il proprio provider di hosting per essere sicuri. Ecco il dump SQL della tabella, url_redirects che contiene tutte le informazioni che abbiamo mostrato sopra:
-- -- Struttura della tabella per la tabella 'url_redirects' - CREATE TABLE SE NON ESISTE 'url_redirects' ('id' int (11) NOT NULL auto_increment, 'short' varchar (10) NOT NULL, 'url' varchar (255) NOT NULL, ' created_at 'timestamp NOT NULL predefinito CURRENT_TIMESTAMP, PRIMARY KEY (' id '), KEY' short '(' short ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
Successivamente consente di guardare il codice necessario per creare il nostro breve URL.
# create.php ---- shrtr.me/".$short; else $ html = "Errore: impossibile trovare il database"; mysql_close ($ db);?>Rende gli URL Shrtr shrtr.me
= $html ?>
X
Ora stiamo diventando un po 'più complesso! Per prima cosa dobbiamo includere le variabili di connessione al database che abbiamo creato in precedenza, quindi memorizziamo il parametro URL che ci è stato inviato dal modulo di creazione in una variabile chiamata $ url. Quindi eseguiamo alcune espressioni regolari magiche per verificare se effettivamente hanno inviato un URL, altrimenti memorizziamo un errore. Se l'utente ha inserito un URL valido, creiamo una connessione al database usando le variabili di connessione che includiamo nella parte superiore della pagina. Successivamente generiamo una stringa casuale di 5 caratteri da salvare nel database, usando la funzione substr. La stringa che abbiamo diviso è l'hash md5 dell'ora corrente () e $ url concatenato insieme. Quindi inseriamo quel valore nel url_redirects tabella con l'URL effettivo e memorizzare una stringa da presentare all'utente. Se non riesce a inserire i dati, memorizziamo un errore. Se ci si sposta verso il basso nella parte HTML della pagina, tutto ciò che facciamo è stampare il valore di $ html, sii errore o successo. Questa ovviamente non è la soluzione più elegante ma funziona!
Quindi abbiamo l'URL nel database su cui lavorare serve.php quindi possiamo effettivamente tradurre il codice corto in un reindirizzamento.
Rende gli URL Shrtr shrtr.me
= $html ?>
X
Questo è molto simile a create.php includiamo le informazioni del database e memorizziamo il codice breve inviato a noi in una variabile chiamata $ breve. Quindi interrogiamo il database per l'URL di quel codice funzione. Se otteniamo un risultato, reindirizziamo all'URL, altrimenti stampiamo un errore come prima.
Per quanto riguarda PHP, questo è tutto ciò che dobbiamo fare, ma al momento di condividere un breve URL gli utenti devono inserire questo, http://shrtr.me/server.php?short=SHORT_CODE non è molto carino? Vediamo se non possiamo incorporare del codice mod_rewrite per renderlo più bello.
Dei due metodi che ho scritto all'inizio del tutorial useremo quello di Apache perché questa applicazione è già stata creata senza considerare l'analisi degli URL. Il codice sarà simile a questo:
Opzioni + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Saltando su RewriteRule stiamo indirizzando qualsiasi traffico che non abbia già un vero file o directory serve.php e mettendo l'estensione nella variabile GET breve. Non male no, provalo tu stesso!
Oggi abbiamo appreso diversi modi per utilizzare mod_rewrite nella nostra applicazione per rendere i nostri URL carini. Come sempre guarderò i commenti se qualcuno ha problemi, oppure puoi contattarmi su Twitter. Grazie per aver letto!