We zullen onze beoordeling van htaccess-bestanden voortzetten en vandaag zullen we bekijken hoe we mod_rewrite kunnen gebruiken om mooie URL's te maken.
Hoewel sommigen beweren dat mooie URL's helpen bij het rangschikken van zoekmachines, is het debat hier heftig, we zijn het er allemaal over eens dat mooie URL's dingen gemakkelijker maken voor onze gebruikers en een professionaliteitsniveau toevoegen aan elke webapplicatie. Ik zou hier alle theoretische redenen voor kunnen bespreken, maar ik hou echt van voorbeelden uit de praktijk. Vind het leuk of haat het, we moeten allemaal toegeven dat Twitter een enorm populaire webapplicatie is en een deel van de reden daarvoor is zeer zeker hoe het URL's opmaakt. Ik kan iedereen vertellen dat mijn Twitter-gebruikersnaam noahhendrix is en ze weten dat mijn profiel eenvoudig te vinden is op twitter.com/noahhendrix. Dit schijnbaar eenvoudige concept heeft enorme gevolgen voor de populariteit van uw applicatie.
Om de zaken in het juiste perspectief te plaatsen, kunnen we naar een andere populaire website voor sociaal netwerken kijken, Facebook. Sinds de lancering van de site in 2004 is het profielsysteem gegroeid en geëvolueerd om beter af te stemmen op de gebruikers, maar één in het oog springend gat was de URL naar een profiel. Vanaf het moment dat ik met Facebook registreerde was mijn profiel op de URL http://www.facebook.com/profile.php?id=1304880680. Dat is een behoorlijke mond vol, en kortgeleden lijkt het erop dat Facebook zich dat heeft gerealiseerd en dat ze Facebook-vanity-URL's hebben gelanceerd. Nu kan ik mijn Facebook-profiel delen door mensen te vertellen dat mijn Facebook-gebruikersnaam 'noahhendrix' is, waarvan ze weten dat ze te vinden zijn op facebook.com/noahhendrix. Hoewel de kans groot is dat we geen applicatie zo populair zullen hebben als Facebook, kunnen we nog steeds een paar pagina's van hun boek lenen.
Een kort overzicht voordat we in de code duiken, in de tutorial van vandaag zullen we twee enigszins verschillende methoden bespreken voor het maken van mooie URL's met behulp van HTACCESS. Het verschil tussen de methoden is of Apache of PHP het zware werk doet om de URL voor het ontleden te verbreken. Ik wil erop wijzen dat mod_rewrite tutorials bijna net zo oud zijn als het internet zelf en dit is niet de eerste. Aan het eind zal ik een van de methoden gebruiken om een eenvoudige applicatie te maken om te laten zien hoe deze oplossingen eruit zouden zien in een real-live website (en niet 100% productiekwaliteit). De service die we zullen maken is een URL-verkorter die de functionaliteit van dergelijke sites zoals bit.ly, TinyURL of su.pr. Dus laten we zonder pluis de code bekijken.
Ten eerste kunnen we al onze code in Apache .htaccess-bestanden plaatsen. Dit zou er ongeveer zo uit kunnen zien:
Opties + FollowSymLinks RewriteEngine On 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
Laten we beginnen bij de top en ons naar beneden werken om beter te begrijpen wat hier gebeurt. De eerste regel stelt de omgeving in om symbolische koppelingen te volgen met behulp van de Opties-instructie. Dit kan al dan niet noodzakelijk zijn, maar sommige webhosts gebruiken symlinks (vergelijkbaar met alias in MacOSX of snelkoppelingen is Windows) voor veel voorkomende HTTP-verzoekfouten en dit zijn meestal symlink-bestanden, of dit is hoe ik de redenering begrijp. Vervolgens vertellen we Apache dat we de Rewrite Engine gaan gebruiken. De volgende twee regels zijn heel erg belangrijk, het beperkt herschrijvings-URL's alleen tot paden die niet echt bestaan. Dit voorkomt dat de onderstaande regels overeenkomen example.com/images/logo.png bijvoorbeeld. De eerste voorkomt bestaande mappen met de !-d vlag en de tweede met !-f betekent negeren bestaande bestanden.
De volgende drie regels zijn de eigenlijke URL-herschrijfopdrachten. Elke regel maakt een regel die een patroon van reguliere expressies probeert te matchen met de inkomende URL. Reguliere expressies, althans voor mij, zijn een hele reeks regels om te onthouden, maar ik vind het altijd handig om deze tutorial te gebruiken door Nettut's eigen Jeffery Way en de tool die hij aanbeveelt. Ik vond het gemakkelijk om te typen in voorbeeld-URL's die we willen koppelen en probeer vervolgens het patroon samen te hacken.
Het eerste argument is het patroon, tussen het caret- en dollarteken. We vertellen Apache dat we URL's willen die vragen om de gebruikersdirectory (een kunstmatige directory, hoeft niet echt te bestaan) gevolgd door a / en elke lengte van nummers. De haakjes creëren een capture-groep, je kunt er zoveel gebruiken als je wilt, ze dienen als variabelen die we vervolgens in onze herschrijving kunnen transplanteren. Het sterretje betekent dat de gebruiker alles kan invoeren wat hij wil, en dit heeft geen invloed op het herschrijven, dit is voornamelijk om een schuine streep te behandelen, dus example.com/users/123 is hetzelfde als example.com/users/123/ zoals gebruikers zouden verwachten.
Het tweede argument is het pad dat we eigenlijk willen callen, dit in tegenstelling tot het eerste moet een echt bestand zijn. We vertellen Apache in de huidige map te zoeken naar een bestand met de naam profile.php en verzend de parameter id = $ 1 samen met het. Denk aan de capture-groep eerder? Dat is waar we de variabele $ 1 krijgen, vanggroepen beginnen bij één. Dit maakt een URL op de server zoals example.com/profile.php?id=123.
Deze methode is geweldig voor verouderde webtoepassingen met bestaande URL-structuren die voorkomen dat we de backend gemakkelijk kunnen herschrijven om een nieuw URL-schema te begrijpen, omdat de URL voor de server er op de server hetzelfde uitziet, maar de gebruiker ziet er veel leuker uit.
Deze volgende methode is geweldig voor degenen die niet te veel logica willen overdragen aan Apache en zich beter op hun gemak willen voelen in PHP (of vergelijkbare scripttalen). Het concept hier is het vastleggen van elke URL die de server ontvangt en deze naar een PHP-controllerpagina te sturen. Dit komt met het extra voordeel van controle, maar tegelijkertijd grotere complexiteit. Uw HTACCESS-bestand kan er ongeveer zo uitzien:
Opties + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^. * $ ./Index.php
Alles is hetzelfde als hierboven, behalve de laatste regel, dus we gaan ernaartoe. In plaats van een capture-groep te maken, vertellen we Apache dat hij elke URL moet pakken en omleiden naar index.php. Wat dit betekent is dat we al onze URL-afhandeling in PHP kunnen doen zonder te veel afhankelijk te zijn van strikte URL-paden in HTACCESS. Dit is wat we bovenaan ons index.php-bestand kunnen doen om de URL te ontleden:
De eerste regel is niet nodig, tenzij je applicatie niet in de root-directory staat, zoals mijn demo's. Ik verwijder het niet-zinsdeel van de URL waarvan ik niet wil dat PHP zich zorgen maakt. $ _SERVER [ 'REQUEST_URI'] is een globale servervariabele die PHP de verzoek-URL levert en opslaat, het ziet er in het algemeen als volgt uit:
/ Envato / vrij / php / users / vraag
Zoals je ziet is het eigenlijk alles na de domeinnaam. Vervolgens splitsen we het resterende deel van het virtuele pad op en delen het door het / karakter dit stelt ons in staat om individuele variabelen te grijpen. In mijn voorbeeld heb ik zojuist de $ params uitrusten in het lichaam, natuurlijk wil je iets nuttigers doen.
Een ding dat je zou kunnen doen is het eerste element van de nemen $ params array en een bestand met dezelfde naam bevatten en binnenin het bestand kunt u het tweede element in de array gebruiken om een bepaalde code uit te voeren. Dit ziet er ongeveer zo uit:
WAARSCHUWING: Het eerste deel van deze code is ongelooflijk belangrijk! Je moet absoluut beperken welke pagina's een gebruiker kan krijgen, zodat ze niet de mogelijkheid hebben om een gewenste pagina af te drukken door te raden naar bestandsnamen, zoals een databaseconfiguratiebestand.
Nu we de zeepkist uit de weg hebben laten we verder gaan. Vervolgens controleren we of het gevraagde bestand in de $ safe_pages array, en als dit het geval is, wordt anders een 404 niet gevonden pagina toegevoegd. Op de bijgevoegde pagina ziet u dat u toegang hebt tot de $ params array en u kunt alle gegevens die nodig zijn in uw toepassing ophalen.
Dit is geweldig voor degenen die wat meer controle en flexibiliteit willen. Het vereist uiteraard nogal wat extra code, dus waarschijnlijk beter voor nieuwe projecten waarvoor niet veel code hoeft te worden bijgewerkt om in de nieuwe URL-indelingen te passen..
Dit laatste deel van de tutorial laat ons wat gebruik maken van de code die we hierboven hebben besproken, en is min of meer een 'real-life'-voorbeeld. We gaan een service maken met de naam shrtr, Ik heb deze naam verzonnen zodat andere producten met deze naam niet zijn gekoppeld aan de code die ik hieronder post. Notitie: Ik weet dat dit veruit geen origineel concept is, en is alleen bedoeld voor demonstratie van mod_rewrite. Laten we eerst eens naar de database kijken:
Zoals u kunt zien is dit heel eenvoudig, we hebben slechts 4 kolommen:
Laten we vervolgens de zes bestanden bekijken die we voor deze toepassing moeten maken:
Dat is alles wat we nodig hebben voor ons eenvoudige voorbeeld. Ik zal niet dekken index.php of css / style.css tot in de kleinste details omdat ze geen PHP hebben en statische bestanden zijn.
# index.php ----Maakt URL's Shrtr shrtr.me
Het enige echte interessante om hier op te merken is dat we het formulier indienen met een veld genaamd URL naar create.php.
# css / style.css ---- / * reset * / * font-family: Helvetica, sans-serif; marge: 0; opvulling: 0; / * site * / html, body background-colour: # 008AB8; a color: darkblue; text-decoration: none; #pagewrap margin: 0 auto; breedte: 405px; h1 kleur: wit; marge: 0; text-align: center; lettergrootte: 100 px; h1 .r color: darkblue; .body -moz-border-radius: 10px; -webkit-border-radius: 10px; achtergrondkleur: wit; text-align: center; opvulling: 50px; hoogte: 80 px; positie: relatief; .body .instructions display: block; margin-bottom: 10px; .body .back right: 15px; top: 10px; positie: absoluut; .body invoer [type = tekst] weergave: blok; lettertypegrootte: 20px; margin-bottom: 5px; text-align: center; opvulling: 5px; hoogte: 20 px; breedte: 300 px;
Dat is allemaal erg generiek, maar maakt onze applicatie een beetje meer presentabel.
Het laatste basisbestand dat we moeten bekijken, is ons db_config.php, Ik heb dit gemaakt om een deel van de databaseverbindingsinformatie te abstraheren.
# db_config.php ----
U moet de waarden vervangen door wat in uw database werkt en host waarschijnlijk localhost, maar u moet het bij uw hostingprovider controleren om zeker te zijn. Hier is de SQL-dump van de tabel, url_redirects die alle informatie bevat die we hierboven hebben getoond:
-- -- Tabelstructuur voor tabel 'url_redirects' - MAAK TABLE IF NIET BESTAAT 'url_redirects' ('id' int (11) NOT NULL auto_increment, 'short' varchar (10) NOT NULL, 'url' varchar (255) NOT NULL, ' created_at 'timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (' id '), KEY' short '(' short ')) ENGINE = MyISAM DEFAULT CHARSET = utf8;
Laten we vervolgens de code bekijken die nodig is om onze korte URL te maken.
# create.php ---- shrtr.me/".$short; else $ html = "Fout: kan database niet vinden"; mysql_close ($ db);?>Maakt URL's Shrtr shrtr.me
= $html ?>
X
Nu worden we een beetje complexer! Eerst moeten we de databaseverbindingsvariabelen opnemen die we eerder hebben gemaakt. Vervolgens slaan we de URL-parameter op die door het create-formulier naar ons is verzonden in een variabele genaamd $ url. Vervolgens doen we enkele reguliere uitdrukkingenmagie om te controleren of ze daadwerkelijk een URL hebben verzonden, zo niet slaan we een fout op. Als de gebruiker een geldige URL heeft ingevoerd, maken we een verbinding met de database met behulp van de verbindingsvariabelen die we bovenaan de pagina hebben opgenomen. Vervolgens genereren we een willekeurige reeks van 5 tekens om op te slaan in de database, met behulp van de substr-functie. De reeks die we splitsen is de md5-hash van de huidige tijd () en $ url samengevoegd. Vervolgens voegen we die waarde in de url_redirects tabel samen met de werkelijke URL en sla een tekenreeks op om aan de gebruiker te presenteren. Als het niet lukt om de gegevens in te voegen, slaan we een fout op. Als u naar het HTML-gedeelte van de pagina gaat, wordt alleen de waarde van afgedrukt $ html, of het nu een fout of een succes is. Dit is duidelijk niet de meest elegante oplossing, maar het werkt!
Dus we hebben de URL in de database waar we aan werken serve.php dus we kunnen de korte code daadwerkelijk vertalen in een omleiding.
Maakt URL's Shrtr shrtr.me
= $html ?>
X
Deze lijkt erg op create.php we nemen de database-informatie op en slaan de korte code op die ons is toegestuurd in een variabele met de naam $ kort. Vervolgens vragen we de database naar de URL van die korte code. Als we een resultaat krijgen, verwijzen we door naar de URL, zo niet dan printen we een fout als hiervoor.
Wat PHP gaat, dat is alles wat we moeten doen, maar op dit moment om een korte URL te delen moeten gebruikers dit invoeren, http://shrtr.me/server.php?short=SHORT_CODE niet erg mooi is het? Laten we kijken of we sommige mod_rewrite-codes niet kunnen opnemen om dit mooier te maken.
Van de twee methoden waar ik aan het begin van de tutorial over schreef, zullen we de Apache-versie gebruiken omdat deze applicatie al is gemaakt zonder rekening te houden met URL-parsing. De code ziet er ongeveer zo uit:
Opties + FollowSymLinks RewriteEngine On RewriteCond% SCRIPT_FILENAME! -D RewriteCond% SCRIPT_FILENAME! -F RewriteRule ^ (\ w +) $ ./serve.php?short=$1
Overslaan naar de RewriteRule we sturen elk verkeer waar nog geen echte map of bestand voor is serve.php en de uitbreiding in de GET-variabele kort te maken. Niet slecht, ga het zelf eens proberen!
Vandaag hebben we een paar verschillende manieren geleerd om mod_rewrite in onze applicatie te gebruiken om onze URL's mooi te maken. Zoals altijd zal ik over de reacties waken als iemand problemen heeft, of je kunt contact met me opnemen op twitter. Bedankt voor het lezen!