Olukord

Soovime URL-e kogu domeenis peida faililaiendid ja eemaldage kaldkriipsud, sõltumata domeeninimest endast (nagu ka, töötab mis tahes domeenis).

Näide meie kataloogistruktuurist

Me ei kasuta register. * Faile, välja arvatud avaleht.

  • /
    • /index.php
    • /account.php
    • /konto
      • /subscriptions.php
    • /login.php
    • /Logi sisse
      • /reset-password.php

Eesmärk

Mõned näited selle kohta, kuidas neid faile võidakse taotleda ja kuidas need peaksid brauseris välja nägema:

  • / ja index.php --> mydomain.com (sõna otseses mõttes ainult paljas domeeninimi).

  • /account.php või /account/ või /account --> mydomain.com/account

  • /account/subscriptions.php või /account/subscriptions/ või /account/subscriptions --> mydomain.com/account/subscriptions

Nagu näete, on igale veebilehele juurdepääsemiseks mitu võimalust, kuid hoolimata sellest, millist kahest või kolmest viisist sinna pääsemiseks kasutate, näitab see brauseris ainult ühte eelistatud URL-i.

Küsimus

Kuidas seda tehakse .htaccess-iga mod_rewrite'i abil?

Olen selle välja mõistmiseks paugutanud vastu seina, kuid üldiselt tundub, et ümberkirjutamise voog on umbes selline:

  1. Väline 301 ümbersuunamine ( mydomain.com/account/ --> mydomain.com/account )
  2. Sisestage .php ( mydomain.com/account --> mydomain.com/account.php )

Olen terve päeva seda guugeldanud, lugenud tuhandeid ridu dokumentatsiooni ja konfiguratsioonitekste ning proovinud mitukümmend korda ... Ma arvan, et rohkem aju selle kohta aitaks palju.

UUENDAMINE

Leidsime oma küsimusele vastuse (vt allpool).

  • Kuidas te eristaksite konto.php ja konto / kausta? Selleks on ka kaldkriips.
  • Hea küsimus. Nad on sama asi. Kaust "konto" kirjutab ümber kausta "konto.php". (Selle struktuuri leiate sageli Visual Studio veebiprojektidest.)
  • Ah? Vabandust, see pole minu jaoks mõistlik. Kui teil on fail /account.php ja /account/index.php fail (millele pääseb tavaliselt juurde lihtsalt / account / abil), kuidas te neid kahte eristate? Failisüsteemis need on mitte sama asi. Kui käivitate kõik ühe index.php kausta kaudu, nagu PHP raamistikud, siis võib-olla on see mõttekas. Kas seda mõtlete?
  • Vabandust, mul oleks pidanud selgem olema. Me ei kasuta registrifaile (välja arvatud avaleht; kuid ärge selle küsimuse pärast muretsege). Kõik failinimed kirjeldavad nende sisu. See tähendab näiteks seda /account/ kirjutab ümber /account ja tegelikult toimetada /account.php, mitte /account/index.php.

Täname, et leidsite selle küsimuse uurimiseks aega, kuid tundusime, et oleme selle välja mõelnud:

Options -Multiviews -Indexes +FollowSymLinks RewriteEngine On RewriteBase / DirectorySlash Off # remove trailing slash RewriteRule ^(.*)\/(\?.*)?$ $1$2 [R=301,L] # rewrite /dir/file?query to /dir/file.php?query RewriteRule ^([\w\/-]+)(\?.*)?$ $1.php$2 [L,T=application/x-httpd-php] 

Peame Multiviews ja Indexes välja lülitama, et mootor ei läheks segadusse ja prooviks selle asemel ükskõik millisele viidata index.* faili või näidata kataloogide loendit (mida Apache'iga nimetatakse ka segaselt "indeksiks" ...), kui näib, et kataloogi soovitakse.

Esimene ümbersuunamine nähtavalt (R=301) eemaldab järgneva kaldkriipsu ja teine ​​kirjutab selle sisemiselt ümber käeulatuses olevasse PHP (või HTML vms) faili.

See .htaccess-fail toetab ka päring stringe.

Uuenda Nagu märkisime allpool toodud märkustes palju varem, läksime üle nginxile ja see on kõik, mida meie conf-fail sisaldab URL-i ümberkirjutamisega (minu lahtrist Dev):

location = / { index index.html; } try_files $uri $uri.html =404; 

Oleme PHP-lt üle läinud ka lihtsalt HTML-ile, kuid ülaltoodud laienduste muutmine ei tohiks vaevalt midagi muuta, kui üldse.

  • Tagantjärele oleme üle läinud nginxile ja kogu see ülesanne oli SUPER-lihtne ...
  • Väike punkt, kuid te ei pea põgenema kaldkriipsust (/) regexis, kuna sellel pole erilist tähendust. \/ on sama nagu '/'.
  • @ w3d Hea punkt. See on minu Javascripti regex'ingu harjumus.

Miks soovite suunata / konto suunata saidile /account.php? Tegelikult eksisteerib leht / konto ainult sisuläbirääkimistega. Kui te seda ei soovi, keelake see direktiiv lihtsalt ära.

Teie kahe reegli kohta arvan, et see on lihtne:

RewriteRule ^/account/$ /account RewriteRule ^/account$ /account.php [R,L] 

See on siiski testimata. Võite ka lisada [R,L] esimesele reale, sel juhul teeb brauser veel ühe ümbersuunamise.

  • 1 Teoreetiliselt on see üldine idee (välja arvatud see, et me ei soovi .php-d brauseris kuvada), kuid see töötaks ainult konto.php puhul. Loodame üldisele lahendusele, mis töötab kogu saidil. Regideksi testimiseks refiddle abil tea see regex on nagu ^(.*)/$ näitavad URL-e lõpukaldkriipsuga, kuid see näib olevat mõju ainult ülataseme kataloogides, mitte alamkataloogides. (Taotlused alamkataloogidele kirjutavad URL-is uuesti serveri täieliku teega ja näitavad seda mingil põhjusel brauseris.) Samuti oleme kindlad, et ^(.*)[^/]$ tähistab URL-i ilma kaldkriipsuta.

Kui soovite oma veebisaidi või rakenduse jaoks paindlikku ja lihtsat viisi URL-i taotluste suunamiseks, soovitaksin PHP mikroraamistikku. Teil pole mitte ainult täielik kontroll oma URL-i marsruudi üle, vaid see pakub ka muid eeliseid.

Olen varem kasutanud Slim Frame'i koos suurepäraste tulemustega koos Symfony Templating Componentiga. Kui ma seda uuesti teeksin, kasutaksin tõenäoliselt lihtsalt Silexi mikroraamistikku, kuna see on ka osa Symfony Componentsist.

  • Mõtlesime midagi sellist (aitäh linkide eest), kuid meie saidi arendusversioon on PHP-toega ja juurutatud tootmissait on 100% staatiline (ilma PHP-ta). See .htaccess-fail on juurutatava tootmiskoha ees.
  • Nende mikroraamistike põhjal oleks väga lihtne staatiline sait kiiresti luua. Projekt, mille jaoks ma neid kasutasin, oli enamasti staatiline sisu, kusjuures saidi alglaadimiseks mikroraamistiku abil kasutati vaid PHP tilka. Sõltuvalt saidi suurusest võib selle teisendamine mikroraamistiku kasutamiseks olla kiirem kui kogu päeva .htaccessiga vastu pead põrutada.

none: Charles Robertson | none