www.romver.ru
/ Ïîëíûé ñïèñîê ñòàòåé / mod_rewrite — íàñòðàèâàåìîñòü è ãèáêîñòü Sendmail

Êàê çàêàçàòü ñàéò


ÀÁÐÀÊÀÄÀÁÐÀ (Òîæå ñàìîå íî â ÷èòàåìîì âèäå)

Dobro pojalovat' v mir mod_rewrite, 6veycarskiy noj URL preobrazovaniy!
Danniy modul' predstavlaet soboy osnovanniy na pravilax mexanizm (sintaksi4eskiy analizator s primeneniem regularnix virajeniy), vipolnau6iy URL preobrazovania na letu. Modul' podderjivaet neograni4ennoe koli4estvo pravil i svazannix s kajdim pravilom usloviy, realizua deystvitel'no gibkiy i mo6niy mexanizm upravlenia URL. URL preobrazovania mogut ispol'zovat' raznie isto4niki dannix, naprimer peremennie servera, peremennie okrujenia, HTTP zagolovki, vrema i daje zaprosi k vne6nim bazam dannix v raznix formatax, — dla polu4enia URL nujnogo vam vida.

Etot modul' operiruet s polnimi URL (vklu4aa path-info) i v kontekste servera (httpd.conf) i v kontekste kataloga (.htaccess) i daje mojet generirovat' 4asti stroki zaprosa v ka4estve rezul'tata. Preobrazovanniy rezul'tat mojet privodit' k vnutrenney obrabotke, vne6nemu perenapravleniu zaprosa ili daje k proxojdeniu 4erez vnutrenniy proksi modul'.

No, vsa eta funkcional'nost' i gibkost' imeet svoy nedostatok — slojnost'. Poetomu, ne dumayte 4to vi poymete rabotu modula za odin den'.

Etot modul' bil priduman i napisan v aprele 1996 i ekskluzivno podaren The Apache Group v iule 1997

Ralf S. Engelschall
rse@engelschall.com
www.engelschall.com

Direktivi
  • RewriteBase
  • RewriteCond
  • RewriteEngine
  • RewriteLock
  • RewriteLog
  • RewriteLogLevel
  • RewriteMap
  • RewriteOptions
  • RewriteRule
Temi
  • Vnutrennie processi
  • Peremennie okrujenia
  • Prakti4eskie re6enia
Vnutrennie processi

Vnutrennie processi v etom module o4en' slojni, odnako, ix nujno ob&asnit' xota bi raz, i daje obi4nomu pol'zovatelu, vo izbejanie rasprostran¸nnix o6ibok i raskritia vsey ego funkcional'nosti.

Fazi API

Dla na4ala, nujno prosto ponat', 4to obrabotku kakogo-libo HTTP zaprosa, server Apache delaet v fazax. Perexvat4ik etix faz obespe4ivaetsa Apache API. Mod_rewrite ispol'zuet 2 iz etix perexvat4ikov: translator iz URL v ima fayla ispol'zuemiy posle s4itivania HTTP zaprosa, no do na4ala kakoy-libo avtorizacii i perexvat4ik adresnoy privazki na4inau6iy rabotat' posle faz avtorizacii i s4itivania konfiguracionnix faylov kataloga (.htaccess), no do aktivizacii obrabot4ika soderjania.

Poetomu, posle postuplenia zaprosa i opredelenia Apache'em sootvetstvuu6ego servera (ili virtual'nogo servera) mexanizm preobrazovaniy na4inaet obrabotku vsex direktiv mod_rewrite iz konfiguracionnogo fayla servera v faze translacii iz URL v ima fayla. Neskol'ko 6agov spusta, kogda naxodatsa katalogi s kone4nimi dannimi, konfiguracionnie direktivi mod_rewrite zapuskautsa v faze adresnoy privazki. V oboix etix situaciax mod_rewrite preobrazuet URL, libo v novie URL, libo v imena faylov, xota mejdu nimi net ob&ektivnix razli4iy. Pri sozdanii API, ne predpolagalos' ego ispol'zovanie takim obrazom, odnako 4to kasaetsa Apache 1.x eto edinstvenniy vozmojniy sposob raboti mod_rewrite. 4tobi vnesti bol'6e asnosti zapomnite 2 ve6i:

  1. Xota mod_rewrite i preobrazuet URL v URL, URL v imena faylov i daje imena faylov v imena faylov, v nastoa6iy moment API predostavlaet tol'ko perexvat4ik dla preobrazovania URL v ima fayla. Vo 2-m Apache budut dobavleni 2 otsutstvuu6ix perexvat4ika dla togo, 4tobi sdelat' etot process bolee logi4nim. Odnako eto nikak ne vliaet na pol'zovatela, — prosto etot fakt nado zapomnit': Apache v perexvat4ike URL ima fayla delaet bol'6e nejeli 4em eto podrazumevaetsa v API.
  2. Bespodobniy mod_rewrite prodelivaet URL preobrazovania i v kontekste kataloga, t.e. v faylax .htaccess, xota oni i obrabativautsa namnogo pozje translacii URL v imena faylov. Tak doljno bit', potomu 4to .htaccess fayli naxodatsa v faylovoy sisteme, i poetomu obrabotka uje do6la do etoy stadii. Drugimi slovami: Soglasno fazam API, — v eto vrema uje sli6kom pozdno upravlat' URL. 4tobi re6it' problemu kurici i ayca, mod_rewrite ispol'zuet xitrost': kogda vi manipuliruete URL/imenem fayla v kontekste kataloga, mod_rewrite sna4ala preobrazuet ima fayla obratno, k sootvetstvuu6emu emu URL (4to obi4no nevozmojno, odnako, smotrite direktivu RewriteBase 4ut' nije, gde napisano kak eto sdelat') i zatem iniciiruet noviy vnutrenniy podzapros s etim novim URL. Eto perezapuskaet process obrabotki faz API.

    I snova mod_rewrite uporno pitaetsa sdelat' etot slojniy 6ag polnost'u prozra4nim dla pol'zovatela, odnako zdes' vam sleduet zapomnit': v to vrema kak manipulacii s URL kontekste servera deystvitel'no bistri i effektivni, manipulacii v kontekste kataloga medlenni i neeffektivni iz-za problemi kurici i ayca. Odnako, s drugoy storoni eto edinstvenniy vozmojniy put' raboti mod_rewrite (lokal'no ograni4enniy) dla URL preobrazovaniy, dostupniy obi4nomu pol'zovatelu.

Ne zabivayte 2 eti ve6i!

Obrabotka naborov pravil

Zapuskaas' v etix dvux fazax API, mod_rewrite s4itivaet konfiguracionnie nabori pravil iz svoey konfiguracionnoy strukturi (sozdavaemoy libo odin raz pri zapuske servera, — dla konteksta servera, libo kajdiy raz pri obxode adrom Apache katalogov, — dla konteksta kataloga). Zatem zapuskaetsa mexanizm URL preobrazovaniy s uje imeu6imsa naborom pravil (pravilo(a) vmeste so svoimi usloviami). Funkcionirovanie samogo mexanizma preobrazovaniy v to4nosti odinakovo dla oboix kontekstov konfiguracii. Razli4autsa tol'ko kone4nie rezul'ti obrabotki.

Poradok pravil v nabore vajen potomu 4to mexanizm preobrazovaniy obrabativaet ix v special'nom (i ne o4en' o4evidnom) poradke. Vot eto pravilo: Mexanizm preobrazovaniy prosmatrivaet ves' nabor pravil stro4ka za stro4koy (RewriteRule direktivi) i kogda naxoditsa sootvetstvie konkretnomu pravilu proizvoditsa prosmotr sootvetstvuu6ix etomu pravilu usloviy (RewriteCond direktivi). Po istori4eskim pri4inam uslovia naxodatsa pered pravilami, i poetomu posledovatel'nost' vipolnenia komand nemnogo bolee dlinnaa. Sm. ris. 1 dla bolee podrobnoy informacii.

Posledovatel'nost' vipolnenia komad pri obrabotke nabora pravil
Risunok 1:Posledovatel'nost' vipolnenia komad pri obrabotke nabora pravil

Kak vi mojete videt', sna4ala URL sravnivaetsa s 6ablon dla kajdogo iz pravil. Pri neuda4e mod_rewrite srazu je ostanavlivaet obrabotku etogo pravila i prodoljaet rabotu, ispol'zua sleduu6ee pravilo. Esli 6ablon sovpadaet, mod_rewrite i6et sootvetstvuu6ie etomu pravilu uslovia. Esli ix net, on prosto zamenaet URL novoy veli4inoy polu4ennoy iz stroki Podstanovka i prodoljaet dal'6e obrabativat' pravila. Odnako esli su6estvuut uslovia, zapuskaetsa vnutrenniy cikl dla ix obrabotki v tom poradke v kotorom oni pere4isleni. Dla usloviy eta logika drugaa: mi ne sravnivaem URL na sootvetstvie kakomu-libo 6ablonu. Vmesto etogo mi sna4ala sozdaem stroku SravnivaemaaStroka dopolnaa e¸ peremennimi, obratnimi ssilkami, zaprosami v bazi dannix, i t.d. i zatem pitaemsa proverat' na sootvetstvie s Uslovie. Esli 6ablon ne sootvetstvuet, ves' nabor usloviy i sootvetstvuu6ix pravil s4itaetsa nesootvetstvuu6im usloviu. Esli est' sootvetstvie 6ablonu, v etom slu4ae proizvoditsa obrabotka sleduu6ego uslovia do tex por poka oni budut ne is4erpani. Esli vse uslovia sovpadaut, process obrabotki prodoljaetsa s ispol'zovaniem dla URL podstanovki dannix iz pola Podstanovka.

Ekranirovanie special'nix simvolov

4to kasaetsa Apache 1.3.20, special'nie simvoli v SravnivaemaaStroka i Podstanovka strokax mogut bit' ekranirovani (imeetsa vvidu, otno6enie k nim kak k normal'nim simvolam bez ix obi4nogo special'nogo zna4enia) putem pred6estvuu6ego im simvola sle6a (''). Drugimi slovami, vi mojete vklu4at' simvol dollara v stroku Podstanovka ispol'zua '$'; eto ne pozvolit mod_rewrite otnosit'sa k nemu kak k obratnoy ssilke.

Nali4ie obratnix svazey v regularnix virajeniax

Zdes' nujno zapomnit' odnu vajnuu ve6': Vsakiy raz, kogda vi ispol'zuete kruglie skobki v 6ablon ili v odnom iz Uslovie, sozdautsa vnutrennie obratnie svazi kotorie mogut bit' ispol'zovani so strokami $N i %N (sm. nije). Oni polezni pri sozdanii strok Podstanovka i SravnivaemaaStroka. Risunok 2 pokazivaet v kakie mesta pri dopolnenii (strok Podstanovka i SravnivaemaaStroka) pereme6autsa obratnie svazi.

Dvijenie obratnix svazey vpravile.
Risunok 2: Dvijenie obratnix svazey v pravile.

Itak, — eto bil nepod&¸mniy kurs po vnutrennim mexanizmam mod_rewrite, no on vam sil'no pomojet pri dal'ney6em 4tenii dokumentacii po dannomu modulu.

Peremennie okrujenia

Etot modul' otslejivaet dve dopolnitel'nie (nestandartnie) peremennie okrujenia CGI/SSI nazivaemie SCRIPT_URL i SCRIPT_URI. Oni soderjat logi4eskoe predstavlenie teku6ego resursa, t.e. to, kakim vi vidite eto v adresnoy stroke brauzera, v to vrema kak standartnie peremennie CGI/SSI SCRIPT_NAME i SCRIPT_FILENAME soderjat fizi4eskoe ili sistemnoe predstavlenie.

Zame4anie: eti peremennie soderjat URI/ URL v tom vide, v kotorom oni bili pervona4al'no zapro6eni, t.e., pered tem kak bili sdelanie kakie-libo preobrazovania. Eto vajno, ibo process preobrazovania v pervuu o4ered' ispol'zuetsa dla preobrazovania logi4eskix URL v fizi4eskie puti k konkretnim faylam.

Primer
SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html SCRIPT_FILENAME=/u/rse/.www/index.html
SCRIPT_URL=/u/rse/ SCRIPT_URI=http://en1.engelschall.com/u/rse/
Prakti4eskie re6enia

Imeetsa i Rukovodstvo po preobrazovaniam URL, soderja6ee kollekciu prakti4eskix re6eniy problem URL preobrazovaniy. Tam mojno nayti nabori pravil vzatie iz real'noy jizni i dopolnitel'nuu informaciu o mod_rewrite.

RewriteBase Direktiva
Opisanie: Ustanavlivaet bazoviy URL dla preobrazovaniy v kontekste kataloga
Sintaksis: RewriteBase URL-path
Zna4enie po umol4aniu: Smotri ispol'zovanie dla bolee podrobnoy informacii.
Kontekst: directory.htaccess
Razre6enie: FileInfo
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteBase ustanavlivaet konkretniy, bazoviy URL dla preobrazovaniy v kontekste kataloga. Kak vi uvidite nije, RewriteRule mojet bit' ispol'zovano v konfiguracionnix faylax katalogov (.htaccess). Eto budet rabotat' lokal'no, t.e., prefiks lokal'nogo kataloga otbrasivaetsa na etom etape obrabotki i va6i pravila preobrazovaniy rabotaut tol'ko v ostav6eysa 4asti. V konce on avtomati4eski dobavlaetsa obratno k puti. Nastroyka po-umol4aniu; RewriteBase physical-directory-path

Kogda, dla kakogo-nibud' novogo URL proisxodit podstanovka(preobrazovanie), etot modul' doljen zanovo vovle4' etot URL v obrabotku. Dla togo 4tobi imet' vozmojnost' sdelat' eto, nujno znat' kakie u nego prefiks ili baza URL. Po-umol4aniu etot prefiks raven samomu puti. Odnako na bol'6instve saytov URL'i NE pramo sootvetstvuut fizi4eskim putam, poetomu eto dopu6enie obi4no okajetsa nevernim! V etom slu4ae vi doljni ispol'zovat' direktivu RewriteBase dla ukazania pravil'nogo prefiksa URL.

Esli URL va6ego servera ne sootvetstvuut fizi4eskim putam k faylam, vi doljni ispol'zovat' RewriteBase v kajdom iz .htaccess faylov gde vi xotite ispol'zovat' direktivi RewriteRule.

Naprimer, predpolojim sleduu6iy konfiguracionniy fayl kataloga:

# # /abc/def/.htaccess -- konfiguracionniy fayl kataloga /abc/def # Pomnite: /abc/def eto fizi4eskiy put' /xyz, 
t.e., u servera est' # direktiva 'Alias /xyz /abc/def' k primeru # RewriteEngine On # daem serveru znat' 4to mi
rabotaem 4erez /xyz a ne # 4erez prefiks fizi4eskogo puti /abc/def RewriteBase /xyz #
teper' pravila preobrazovaniy RewriteRule ^oldstuff.html$ newstuff.html 

V primere vi6e, zapros k /xyz/oldstuff.html korrektno preobrazuetsa v fizi4eskiy fayl /abc/def/newstuff.html.

Dla lubiteley pokovirat'sa v Apache

Sleduu6iy spisok daet podrobnuu informaciu ob etapax vnutrenney raboti:

Zapros: /xyz/oldstuff.html Vnutrennaa rabota: /xyz/oldstuff.html -> /abc/def/oldstuff.html (per-server Alias) /abc/def/oldstuff.html -> /abc/def/newstuff.html
(per-dir RewriteRule) /abc/def/newstuff.html -> /xyz/newstuff.html (per-dir RewriteBase) /xyz/newstuff.html -> /abc/def/newstuff.html (per-server Alias)
Rezul'tat: /abc/def/newstuff.html

Eto kajetsa o4en' slojnim odnako eto korrektnaa vnutrennaa rabota Apache, iz-za togo 4to preobrazovania v kontekste kataloga proisxodat sli6kom pozdno v etom processe. Poetomu, kogda eto proisxodit (preobrazovanie), zapros doljen bit' vozvra6en obratno adru Apache! NO: V to vrema kak eto kajetsa ser&¸znim nakladnim rasxodom, v deystvitel'nosti eto ne tak, potomu 4to etot vozvrat proisxodit celikom vnutri servera Apache i ta je samaa procedura ispol'zuetsa mnogimi drugimi operaciami vnutri Apache. Poetomu, vi mojete bit' uvereni 4to dizayn i realizacia pravil'nie.

RewriteCond Direktiva
Opisanie: Opredelaet uslovie pri kotorom proisxodit preobrazovanie
Sintaksis: RewriteCond SravnivaemaaStrokaUslovie
Zna4enie po umol4aniu: None
Kontekst: server configvirtual hostdirectory.htaccess
Razre6enie: FileInfo
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteCond opredelaet uslovia dla kakogo-libo pravila. Pered direktivoy RewriteRule raspolagautsa odna ili neskol'ko direktiv RewriteCond. Sleduu6ee za nimi pravilo preobrazovania ispol'zuetsa tol'ko togda, kogda URI sootvetstvuet usloviam etoy direktivi i takje usloviam etix dopolitel'nix direktiv.

SravnivaemaaStroka stroka kotoraa mojet soderjat' sleduu6ie dopolnitel'nie konstrukcii v dopolenii k prostomu tekstu:

  • RewriteRule obratnie_svazi: Eto obratnie svazi vida

    $N

    (0 <= N <= 9) predostavlau6ie dostup k sgruppirovannim 4astam (v kruglix skobkax!) 6ablona iz sootvetstvuu6ey direktivi RewriteRule (edinstvennoy, sleduu6ey srazu za teku6im naborom direktiv RewriteCond).
  • RewriteCond obratnie_svazi: Eto obratnie svazi vida

    %N

    (1 <= N <= 9) predostavlau6ie dostup k sgruppirovannim 4astam (v kruglix skobkax!) 6ablona iz sootvetstvuu6ey direktivi RewriteCond v teku6em nabore usloviy.
  • RewriteMap ras6irenia: Eto ras6irenia vida

    ${mapname:key|default}

    Smotrite dokumentaciu po RewriteMap dla polu4enia bolee podrobnoy informacii.
  • Peremennie servera: Eto peremennie vida

    %{NAME_OF_VARIABLE}

    gde NAME_OF_VARIABLE mojet bit' strokoy vzatoy iz sleduu6ego spiska:
    HTTP zagolovki: soedinenie & zapros:
    HTTP_USER_AGENT
    HTTP_REFERER
    HTTP_COOKIE
    HTTP_FORWARDED
    HTTP_HOST
    HTTP_PROXY_CONNECTION
    HTTP_ACCEPT
    REMOTE_ADDR
    REMOTE_HOST
    REMOTE_USER
    REMOTE_IDENT
    REQUEST_METHOD
    SCRIPT_FILENAME
    PATH_INFO
    QUERY_STRING
    AUTH_TYPE
    vnutrennie servera: sistemnie: special'nie:
    DOCUMENT_ROOT
    SERVER_ADMIN
    SERVER_NAME
    SERVER_ADDR
    SERVER_PORT
    SERVER_PROTOCOL
    SERVER_SOFTWARE
    TIME_YEAR
    TIME_MON
    TIME_DAY
    TIME_HOUR
    TIME_MIN
    TIME_SEC
    TIME_WDAY
    TIME
    API_VERSION
    THE_REQUEST
    REQUEST_ URI
    REQUEST_FILENAME
    IS_SUBREQ

    Eti peremennie polnost'u sootvetstvuut nazvannim poxojim obrazom MIME-zagolovkam HTTP , Si peremennim servera Apache ili polam struct tm sistem Unix. Bol'6instvo iz nix dokumentrovanni v drugix mestax rukovodstva ili v specifikacii CGI. Te, 4to avlautsa dla mod_rewrite special'nimi vklu4aut:

    IS_SUBREQ
    Budet soderjat' tekst «true» esli zapros vipolnaetsa v teku6iy moment kak podzapros, «false» v drugom slu4ae. Podzaprosi mogut bit' sgenerirovanni modulami kotorim nujno imet' delo s dopolnitel'nimi faylami ili URI dla togo 4tobi vipolnit' sobstvennie zada4i.
    API_VERSION
    Eto versia API modula Apache (vnutrenniy interfeys mejdu serverom i modulem) v teku6ey sborke servera, 4to opredeleno v include/ap_mmn.h. API versia modula sootvetstvuet ispol'zuemoy versii Apache (dla versii Apache 1.3.14, k primeru eto 19990320:10), odnako eto v osnovnom interesno avtoram moduley.
    THE_REQUEST
    Polnaa stroka HTTP zaprosa otpravlennaa brauzerom serveru (t.e., «GET /index.html HTTP/1.1»). Ona ne vklu4aet kakie-libo dopolnitel'nie zagolovki otpravlaemie brauzerom.
    REQUEST_URI
    Resurs, zapro6enniy v stroke HTTP zaprosa. (V primere vi6e, eto bilo bi «/index.html».)
    REQUEST_FILENAME
    Polniy put' v faylovoy sisteme servera k faylu ili skriptu sootvetstvuu6im etomu zaprosu.

Special'nie prime4ania:

  1. Peremennie SCRIPT_FILENAME i REQUEST_FILENAME soderjat odinakovie zna4enia, t.e., zna4enie pola filename vnutrenney strukturi request_rec servera Apache. Pervoe ima eto prosto 6iroko izvestnoe ima peremennoy CGI v to vrema kak vtoroe eto postoannaa kopia REQUEST_ URI (soderja6aa zna4enie pola uri strukturi request_rec).
  2. Est' special'niy format: %{ENV:peremennaa} gde peremennaa mojet bit' luboy peremennoy okrujenia. Eto i6etsa vo vnutrennix strukturax Apache i (esli tam net) s pomo6'u vizova getenv() iz processa Apache servera.
  3. Est' special'niy format: %{HTTP:zagolovok} gde zagolovok mojet bit' lubim imenem HTTP MIME-zagolovka. Eto i6etsa v HTTP zaprose. Primer: %{HTTP:Proxy-Connection} zna4enie HTTP zagolovka «Proxy-Connection:».
  4. Est' special'niy format %{LA-U:peremennaa} operejau6ix zaprosov kotorie proizvodatsa vnutrennim (osnovannom na URL) podzaprosom dla opredelenia kone4nogo zna4enia peremennoy. Ispol'zuyte eto kogda vi xotite ispol'zovat' peremennuu dla preobrazovaniy, kotoraa real'no opredelaetsa pozdnee, v kakoy-libo faze API, i takim obrazom nedostupna na dannom etape. Dla primera kogda vi xotite preobrazovat' sootvetstvenno peremennoy REMOTE_USER iz konteksta servera (fayl httpd.conf) vi doljni ispol'zovat' %{LA-U:REMOTE_USER} potomu 4to eta peremennaa ustanavlivaetsa v fazax avtorizacii kotorie idut posle fazi translacii URL v kotoroy i rabotaet mod_rewrite. S drugoy storoni, po pri4ine realizacii raboti mod_rewrite v kontekste kataloga (fayl .htaccess) 4erez Fixup fazu API i iz-za togo, fazi avtorizacii idut do etoy fazi, vi prosto mojete tam ispol'zovat' %{REMOTE_USER}.
  5. Est' special'niy format: %{LA-F:peremennaa} kotoriy sozdaet vnutrenniy (osnovanniy na imeni fayla) podzapros dla opredelenia kone4nogo zna4enia peremennoy. V osnovnom eto to je samoe 4to i format LA-U privedenniy vi6e.

Uslovie eto 6ablon uslovia, t.e., kakoe-libo regularnoe virajenie primenaemoe k teku6emu ekzemplaru SravnivaemaaStroka, t.e., SravnivaemaaStroka prosmatrivaetsa na poisk sootvetstvia Uslovie.

Pomnite: Uslovie eto perl sovmestimoe regularnoe virajenie s nekotorimi dopolneniami:

  1. Vi mojete predvarat' stroku 6ablona prefiksom '!' (vosklicatel'niy znak) dla ukazania nesootvetstvia 6ablonu.
  2. Est' nekotorie special'nie varianti Uslovies. Vmesto obi4nix strok s regularnimi virajeniami mojno takje ispol'zovat' odin iz sleduu6ix variantov:
    • '<Uslovie' (leksi4eski men'6e)
      Uslovie s4itaetsa prostoy strokoy i leksi4eski sravnivaetsa s SravnivaemaaStroka. Istinno esli SravnivaemaaStroka leksi4eski men'6e 4em Uslovie.
    • '>Uslovie' (leksi4eski bol'6e)
      Uslovie s4itaetsa prostoy strokoy i leksi4eski sravnivaetsa s SravnivaemaaStroka. Istinno esli SravnivaemaaStroka leksi4eski bol'6e 4em Uslovie.
    • '=Uslovie' (leksi4eski ravno)
      Uslovie s4itaetsa prostoy strokoy i leksi4eski sravnivaetsa s SravnivaemaaStroka. Istinno esli SravnivaemaaStroka leksi4eski ravno Uslovie, t.e. eti dve stroki polnost'u odinakovi (simvol v simvol). Esli Uslovie imeet vid "" (dva znaka duyma idu6ix podrad) eto sravnivaet SravnivaemaaStroka s pustoy strokoy.
    • '-d' (avlaetsa li katalogom)
      SravnivaemaaStroka s4itaetsa putem, proveraetsa su6estvovanie etogo puti i to 4to etot put' avlaetsa katalogom.
    • '-f' (avlaetsa li obi4nim faylom)
      SravnivaemaaStroka s4itaetsa putem, proveraetsa su6estvovanie etogo puti i to 4to etot put' avlaetsa obi4nim faylom.
    • '-s' (avlaetsa li obi4nim faylom s nenulevim razmerom)
      SravnivaemaaStroka s4itaetsa putem, proveraetsa su6estvovanie etogo puti i to 4to etot put' avlaetsa obi4nim faylom, razmer kotorogo bol'6e nula.
    • '-l' (avlaetsa li simvoli4eskoy ssilkoy)
      SravnivaemaaStroka s4itaetsa putem, proveraetsa su6estvovanie etogo puti i to 4to etot put' avlaetsa simvoli4eskoy ssilkoy.
    • '-F' (proverka su6estvovania fayla 4erez podzapros)
      Proveraet 4erez vse spiski kontrola dostupa servera, su6estvuu6ie v nastoa6iy moment, avlaetsa li SravnivaemaaStroka su6estvuu6im faylom, dostupnim po etomu puti. Dla etoy proverki ispol'zuetsa vnutrenniy podzapros, poetomu ispol'zuyte etu opciu s ostorojnost'u — eto otricatel'no skazivaetsa na proizvoditel'nosti servera!
    • '-U' (proverka su6estvovania URL 4erez podzapros)
      Proveraet 4erez vse spiski kontrola dostupa servera, su6estvuu6ie v nastoa6iy moment, avlaetsa li SravnivaemaaStroka su6estvuu6im URL, dostupnim po etomu puti. Dla etoy proverki ispol'zuetsa vnutrenniy podzapros, poetomu ispol'zuyte etu opciu s ostorojnost'u — eto otricatel'no skazivaetsa na proizvoditel'nosti servera!
    Zame4anieVse eti proverki takje mogut bit' predvareni prefiksom vosklicatel'niy znak ('!') dla invertirovania ix zna4enia.

Dopolnitel'no vi mojete ustanavlivat' special'nie flagi dla Uslovie dobavlaa

[flags]

tret'im argumentom v direktivu RewriteCond. Flags spisok sleduu6ix flagov razdelennix zapatimi:

  • 'nocase|NC' (registronezavisimo)
    Registr ne imeet zna4enie, t.e., net razli4iy mejdu 'A-Z' i 'a-z' kak v dopolnenii SravnivaemaaStroka tak i Uslovie. Etot flag effektiven tol'ko dla sravneniy mejdu SravnivaemaaStroka i Uslovie. On ne rabotaet pri proverkax v faylovoy sisteme i v podzaprosax.
  • 'ornext|OR' (libo sleduu6ee uslovie)
    Ispol'zuyte dla kombinirovania usloviy v pravilax OR vmesto AND. Tipi4niy primer:
    RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule ...some
    special stuff for any of these hosts...
    Bez etogo flaga vi doljni bili bi napisat' eto uslovie/pravilo tri raza.

Primer:

Dla vida4i glavnoy stranici kakogo-libo sayta soglasno «User-Agent:» zagolovku zaprosa, vi mojete ispol'zovat' sleduu6ie direktivi:

RewriteCond %{HTTP_USER_AGENT} ^Mozilla.* RewriteRule ^/$ /homepage.max.html
[L] RewriteCond %{HTTP_USER_AGENT} ^Lynx.* RewriteRule ^/$ /homepage.min.html [L] RewriteRule ^/$ /homepage.std.html [L]

Interpretacia: Esli u vas Netscape Navigator (kotoriy identificiruetsa kak 'Mozilla'), vi vidaete maksimal'no navoro4ennuu stranicu, s freymami, i t.d. Esli u vas Lynx (tekstoviy brauzer), vi vidaete naimenee navoro4ennuu stranicu, bez risunkov, tablic i t.d. Esli luboy drugoy brauzer, vidaete standartnuu stranicu.

RewriteEngine Direktiva
Opisanie: Vklu4aet ili viklu4aet rabotu mexanizma preobrazovania
Sintaksis: RewriteEngine on|off
Zna4enie po umol4aniu: RewriteEngine off
Kontekst: server configvirtual hostdirectory.htaccess
Razre6enie: FileInfo
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteEngine vklu4aet ili viklu4aet rabotu mexanizma preobrazovaniy. Esli ona ustanovlena v polojenie off etot modul' sovsem ne rabotaet. On daje ne obnovlaet peremennie okrujenia SCRIPT_URx.

Ispol'zuyte etu direktivu dla viklu4enia etogo modula vmesto prostogo zakommentirovania direktiv RewriteRule!

Otmet'te, 4to po-umol4aniu, nastroyki preobrazovaniy ne nasleduutsa. Eto ozna4aet 4to vi doljni imet' RewriteEngine on direktivu dla kajdogo virtual'nogo xosta v kotorom vi xotite ispol'zovat' etot modul'.

RewriteLock Direktiva
Opisanie: Ustanavlivaet ima fayla ispol'zuemogo dla RewriteMap sinxronizacii
Sintaksis: RewriteLock file-path
Zna4enie po umol4aniu: None
Kontekst: server config
Status: Ras6irenie
Modul': mod_rewrite

Eta direktiva opredelaet ima fayla sinxronizacii kotoriy nujen mod_rewrite dla svazi s RewriteMap programmami. Sdelayte etot fayl lokal'nim (razme6ennim ne na NFS-smontirovannom resurse) kogda vi xotite ispol'zovat' programmu dla sozdania associativnogo massiva preobrazovaniy. Eto ne avlaetsa obazatel'nim dla drugix tipov takix massivov.

RewriteLog Direktiva
Opisanie: Ustanavlivaet ima fayla ispol'zuemoe dla vedenia jurnala mexanizma preobrazovania
Sintaksis: RewriteLog file-path
Kontekst: server configvirtual host
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteLog ustanavlivaet ima fayla a kotorom server vedet jurnal lubix proisxoda6ix deystviy po preobrazovaniam URL. Esli eto ima ne na4inaetsa so sle6a ('/') v etom slu4ae put' s4itaetsa ot Server Root. V konfiguracionnom fayle servera eta direktiva doljna vster4at'sa tol'ko odin raz.

Dla otklu4enia vedenia jurnala preobrazovaniy ne rekomenduetsa ustanavlivat' Filename v /dev/null, potomu 4to xota mexanizm preobrazovaniy i ne proizvodit vivod v fayl jurnala v etom slu4ae, vnutri on vse e6¸ vedet jurnalizaciu. Eto zamedlit server bez kakix-libo preimu6estv dla administratora! Dla otklu4enia vedenia jurnala libo udalite libo zakommentiruyte direktivu RewriteLog libo ispol'zuyte RewriteLogLevel 0!
Bezopasnost'Smotrite dokument Apache Security Tips dla bolee podrobnoy informacii o tom po4emu vi mojete bit' uazvimi esli v katalogi gde xranatsa fayli jurnalov razre6ena zapis' komu ugodno krome pol'zovatela ot imeni kotorogo zapuskaetsa server.
Primer
RewriteLog "/usr/local/var/apache/logs/rewrite.log" 
RewriteLogLevel Direktiva
Opisanie: Ustanavlivaet uroven' detalizacii pri jurnalizacii deystviy mexanizma preobrazovaniy
Sintaksis: RewriteLogLevel Level
Zna4enie po umol4aniu: RewriteLogLevel 0
Kontekst: server configvirtual host
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteLogLevel ustanavlivaet uroven' detalizacii jurnala mexanizma preobrazovaniy. Po-umol4aniu uroven' 0 ozna4au6iy 4to jurnalizacia ne vedetsa, v to vrema kak 9 ili bolee ozna4aet 4to zapisivautsa prakti4eski vse deystvia.

Dla otklu4enia jurnalizacii deystviy mexanizma preobrazovaniy prosto ustanovite uroven' na 0. Eto otklu4aet vedenie jurnala dla vsex deystviy po preobrazovaniam.

Ispol'zovanie bol'6ix zna4eniy urovna o4en' sil'no zamedlit va6 server Apache! Ispol'zuyte jurnal preobrazovaniy na urovne bol'6em 4em 2 tol'ko dla otlado4nix celey!
Primer
RewriteLogLevel 3 
RewriteMap Direktiva
Opisanie: Opredelaet funkciu sozdania associativnogo massiva dla poiska po klu4u
Sintaksis: RewriteMap MapNameMapType:MapSource
Zna4enie po umol4aniu: net
Kontekst: server configvirtual host
Status: Ras6irenie
Modul': mod_rewrite
Sovmestimost': Vibor raznix tipov dbm dostupen v Apache 2.0.41 i bolee pozdnix versiax

Direktiva RewriteMap associativniy massiv preobrazovaniy, kotoriy mojet bit' ispol'zovan v pravilax preobrazovaniy i ispol'zuu6iy sootvetstvuu6ie funkcii dla vstavki/izvle4enia elementov, dla poiska po klu4u sootvetstvuu6ix zna4eniy. Isto4nik etogo poiska mojet imet' razli4niy tip.

MapName eto ima massiva kotoroe budet ispol'zovat'sa dla poiska sootvetstvuu6ego zna4enia iz massiva v pravile preobrazovania 4erez odin iz sleduu6ix konstruktorov:

${MapName:LookupKey}
${MapName:LookupKey|DefaultValue}

Kogda vstre4aetsa podobnaa konstrukcia, proisxodit obra6enie k massivu MapName i poisk zna4enia sopostavlennogo klu4u LookupKey. Esli naydeno iskomoe zna4enie klu4a, proisxodit izvle4enie zna4enia SubstValue s pomo6'u sootvetstvuu6ey funkcii. Esli klu4 ne nayden togda proisxodit podstanovka DefaultValue ili pustoy stroki esli ne ukazana DefaultValue.

Mogut bit' ispol'zovani sleduu6ie kombinacii tipa funkcii — MapType dla vstavki/izvle4enia elementov massiva i MapSource — samogo associativnogo massiva:

  • Prostoy tekst
    MapType: txt, MapSource: Put' k su6estvuu6emu faylu v faylovoy sisteme Unix

    Eto standartnaa opcia dla sozdania associativnogo massiva gde MapSource eto prostoy tekstoviy ASCII fayl soderja6iy libo pustiy stro4ki, stro4ki kommentariev (na4inau6iesa s simvola '#') libo pari podobnie sleduu6im — odna v stro4ke:

    MatchingKeySubstValue

    Primer
    ## ## map.txt -- massiv preobrazovaniy ## Ralf.S.Engelschall rse # Bastard Operator From Hell Mr.Joe.Average joe # Mr. Average 

    RewriteMap real-to-user txt:/path/to/file/map.txt

  • Proizvol'niy prostoy tekst
    MapType: rnd, MapSource: Put' k su6estvuu6emu faylu v faylovoy sisteme Unix

    Etot variant identi4en variantu s prostim tekstom prived¸nnom vi6e no so special'noy osobennost'u post-obrabotki: Posle naxojdenia kakuu-libo veli4inu proizvoditsa e¸ analiz na predmet naxojdenia simvolov «|» kotorie imeut zna4enie logi4eskogo «ili». Drugimi slovami oni ozna4aut nabor al'ternativnix variantov i vibor vozvra6aemoy veli4ini iz nix proizvoditsa proizvol'no. Xota eto kajetsa bezumiem i absolutno bespoleznim, eto v deystvitel'nosti ispol'zuetsa dla balansirovki nagruzki v situaciax s obratnim proksi gde proisxodit poisk imen serverov. Naprimer:

    ## ## map.txt -- massiv preobrazovaniy ## static www1|www2|www3|www4 dynamic www5|www6 

    RewriteMap servers rnd:/path/to/file/map.txt

  • Xe6 fayl
    MapType: dbm[=type], MapSource: Put' k su6estvuu6emu faylu v faylovoy sisteme Unix

    Zdes', isto4nik — eto dvoi4niy fayl DBM formata soderja6iy to je samoe soderjimoe 4to i prostoy tekstoviy fayl, odnako v special'nom vide, optimizirovannom dla deystvitel'no bistrogo poiska. Etot tip mojet bit' sdbm, gdbm, ndbm, ili db v zavisimosti ot nastroek pri kompilacii. Esli tip opu6en, vibiraetsa tip ustanovlenniy po-umol4aniu pri kompilacii. Vi mojete sozdavat' takoy fayl luboy utilitoy DBM ili sleduu6im Perl skriptom. Ubedites' 4to on nastroen dla sozdania trebuemogo tipa DBM fayla. Etot primer sozdaet fayl NDBM.

    #!/path/to/bin/perl ## ## txt2dbm -- convert txt map to dbm format ##
    use NDBM_File; use Fcntl; ($txtmap, $dbmmap) = @ARGV; open(TXT, "<$txtmap") or die "Couldn't open $txtmap!n"; tie (%DB, 'NDBM_File',
    $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644) or die "Couldn't create $dbmmap!n"; while (<TXT>) { next if (/^s*#/ or /^s*$/); $DB{$1} = $2 if (/^s*(S+)s+(S+)/); } untie %DB; close(TXT);

    $ txt2dbm map.txt map.db

  • Vnutrennaa funkcia
    MapType: int, MapSource: vnutrennaa funkcia Apache

    Zdes', isto4nik — eto kakaa-libo vnutrennaa funkcia Apache. V nastoa6ee vrema vi ne mojete sozdavat' svoi sobstvennie funkcii, odnako uje su6estvuut sleduu6ie funkcii:

    • toupper:
      Preobrazuet klu4 poiska v verxniy registr.
    • tolower:
      Preobrazuet klu4 poiska v nijniy registr.
    • escape:
      Transliruet special'nie simvoli v klu4e poiska v ix 4islovie kodi.
    • unescape:
      Transliruet 4islovie kodi v klu4e poiska obratno v special'nie simvoli.
  • Vne6naa programma preobrazovania
    MapType: prg, MapSource: Put' k su6estvuu6emu faylu v faylovoy sisteme Unix

    Zdes', isto4nik — eto programma, a ne fayl s associativnim massivom. Dla e¸ sozdania vi mojete ispol'zovat' luboy vibranniy azik, odnako rezul'tat doljen bit' ispolnaemim faylom (t.e., libo ob&ektnim kodom libo skriptom s magi4eskoy pervoy stro4koy '#!/path/to/interpreter').

    Eta programma zapuskaetsa odin raz pri zapuske servera Apache i zatem vzaimodeystvuet s mexanizmom preobrazovaniy 4erez faylovie obrabot4iki stdin(potok vvoda) i stdout(potok vivoda). Dla kajdogo poiska v massive, sootvetstvuu6iy klu4 dla poiska, budet polu4at'sa v vide stroki, podavaemoy na stdin i okan4ivau6eysa simvolom perevoda stroki. Zatem eta programma doljna vernut' zna4enie naydennoy veli4ini v stdout v vide stroki okan4ivau6eysa simvolom perevoda stroki libo strokoy iz 4etir¸x simvolov «NULL» esli poisk neuda4en (t.e., dla sootvetstvuu6ego zna4enia klu4a ne naydeno nikakogo zna4enia). Trivial'naa programma realizuu6aa massiv 1:1 (t.e., klu4 == zna4enie) mojet vigladet' tak:

    #!/usr/bin/perl $| = 1; while (<STDIN>) { # ...put here any transformations or lookups... print $_; } 

    Odnako bud'te o4en' ostorojni:

    1. "Keep it simple, stupid" (KISS) — delay eto pro6e, dura4ok, potomu 4to esli eta programma zavisnet — eto povesit server Apache kogda vstretitsa pravilo ispol'zuu6ee etot massiv (sozdavaemiy vne6ney programmoy).
    2. Dla izbejania rasprostranennoy o6ibki: nikogda ne delayte buferizovanniy vvod/vivod dla stdout! Eto vizovet beskone4noe zaciklivanie! Otsuda «$|=1» v vi6eprivedennom primere…
    3. Ispol'zuyte direktivu RewriteLock dla opredelenia fayla blokirovok kotoriy mod_rewrite mojet ispol'zovat' dla sinxronizacii svazi s etoy programmoy. Po-umol4aniu takaa sinxronizacia ne proizvoditsa.

Direktiva RewriteMap mojet vstre4at'sa bolee odnogo raza. Dla kajdogo massiva ispol'zuyte odnu RewriteMap direktivu dla ob&avlenia fayla s massivom preobrazovaniy. V to vrema kak vi ne mojete opredelat' massiv v kontekste kataloga, ego ispol'zovanie v etom kontekste kone4no je vozmojno.

Zame4anieDla prostogo tekstovogo i DBM faylov klu4i poiska ke6iruutsa adrom do tex por poka ne izmenitsa tip mtime fayla s massivom ili poka ne proizoydet restart servera. Takim obrazom, vi mojete ispol'zovat' associativnie massivi v pravilax kotorie ispol'zuutsa dla kajdogo zaprosa. Eto ne problema, potomu 4to vne6niy poisk proisxodit tol'ko odin raz!
RewriteOptions Direktiva
Opisanie: Ustanavlivaet koe-kakie special'nie opcii dla mexanizma preobrazovaniy
Sintaksis: RewriteOptions Options
Zna4enie po umol4aniu: None
Kontekst: server configvirtual hostdirectory.htaccess
Razre6enie: FileInfo
Status: Ras6irenie
Modul': mod_rewrite

Direktiva RewriteOptions ustanavlivaet nekotorie special'nie opcii dla teku6ey konfiguracii v kontekste servera ili kataloga. Stroki Option mogut imet' sleduu6iy vid:

  • 'inherit'
    Eto privodit v deystvie nasledovanie teku6ey konfiguraciey konfiguracii roditela. V kontekste virtual'nogo servera eto ozna4aet 4to associativnie massivi, uslovia i pravila osnovnogo servera nasleduutsa. V kontekste kataloga eto ozna4aet 4to uslovia i pravila v konfiguracionnix faylax .htaccess roditel'skix katalogov nasleduutsa.
RewriteRule Direktiva
Opisanie: Opredelaet pravila dla mexanizma preobrazovaniy
Sintaksis: RewriteRule 6ablonPodstanovka
Zna4enie po umol4aniu: None
Kontekst: server configvirtual hostdirectory.htaccess
Razre6enie: FileInfo
Status: Ras6irenie
Modul': mod_rewrite
Sovmestimost': Flag cookie dostupen v Apache 2.0.40 i bolee pozdnix.

Direktiva RewriteRule i est' nastoa6aa rabo4aa lo6adka preobrazovaniy. Eta direktiva mojet vstre4at'sa bolee odnogo raza. Kajdaa direktiva, v etom slu4ae, opredelaet odno pravilo preobrazovania. Poradok opredeleniy etix pravil vajen, potomu 4to etot poradok ispol'zuetsa pri obrabotke pravil vo vrema raboti.

6ablon eto perl sovmestimoe regularnoe virajenie kotoroe primenaetsa k teku6emu URL. Zdes' pod «teku6im» podrazumevaetsa zna4enie URL kogda primenaetsa eto pravilo. Etot URL ne obazatel'no sovpadaet s pervona4al'no zapro6ennim URL, potomu 4to luboe koli4estvo pravil vozmojno uje bili primeneni k nemu i sootvetstvenno preobrazovali ego.

Nekotorie ukazania po sintaksisu regularnix virajeniy:

Tekst: . Luboy odino4niy simvol [chars] Klass simvlolv: Odin iz simvolov [^chars] Klass simvlolv: Ni odin iz simvolov text1|text2 
Al'ternativa: text1 ili text2 Kvantori (simvoli dla obozna4enia koli4estvennix otno6eniy): ? 0 ili 1 iz pred6estvuu6ego teksta * 0 ili N iz
pred6estvuu6ego teksta (N > 0) + 1 ili N iz pred6estvuu6ego teksta (N > 1)
Gruppirovka: (text) Gruppirovka teksta (libo ustanovka granic al'ternativi ili dla sozdania obratnix svazey gde N gruppa, kotoraa mojet bit' ispol'zovana v
RHS direktivi RewriteRule s $N) Markeri: ^ Marker na4ala stroki $ Marker konca stroki
Ekranirovanie: char ekranirovanie konkretnogo simvola (k primeru dla ukazania simvolov ".[]()" i t.d.) 

Bolee podrobnuu informaciu o regularnix virajeniax, smotrite v dokumentacii po regularnim virajeniam Perl ("perldoc perlre"). Esli vi zainteresovani v e6¸ bolee detal'noy informacii o regularnix virajeniax i ix dialektax (POSIX i t.d.), smotrite sleduu6uu, special'no napisannuu po etoy teme knigu:

Mastering Regular Expressions
Jeffrey E.F. Friedl
Nutshell Handbook Series
O'Reilly & Associates, Inc. 1997
ISBN 1-56592-257-3

Krome togo, v mod_rewrite simvol otricania (NOT) ('!') — dopuskaemiy prefiks v 6ablone. Eto da¸t vam vozmojnost' invertirovat' deystvie 6ablona; nu k primeru skajem: "esli teku6iy URLne sovpadaet s etim 6ablonom". Eto mojet bit' ispol'zovano v osobix slu4aax, kogda pro6e nayti 6ablon dla nesootvetstvia, ili v ka4estve poslednego pravila, rabotau6ego po umol4aniu.

Prime4aniePri ispol'zovanii simvola NOT (ne) dla invertirovania deystvia 6ablona vi ne mojete imet' sgruppirovannie 4asti gruppovix simvolov v 6ablone. Eto nevozmojno potomu 4to kogda net sootvetstvia 6ablonu, dla grupp net nikakogo soderjimogo. V rezul'tate, esli ispol'zuutsa 6abloni s otricaniem, vi ne mojete ispol'zovat' $N v strokax podstanovok!

Podstanovka v pravile preobrazovania eto stroka budet podstavlat'sa (ili budet zamenat') vmesto original'nogo URL, dla kotorogo est'sovpadenie 6ablonu. Krome prostogo teksta vi mojete ispol'zovat'

  1. obratnie svazi $N na 6abloni v RewriteRule
  2. obratnie svazi %N na posledniy sootvetstvuu6iy 6ablon v RewriteCond
  3. peremennie servera v ka4estve proveraemix strok v usloviax pravil (%{VARNAME})
  4. vizovi zaprosov k massivu (${mapname:key|default})

Obratnie svazi eto $N (N=0..9) identifikatori kotorie zamenautsa soderjimim N-y gruppi podxoda6ego 6ablona. Peremennie servera Eto toje samoe 4to i SravnivaemaaStroka direktivi RewriteCond. Zaprosi k massivu pri6li iz direktivi RewriteMap tam oni i ob&asneni. Eti tri tipa peremennix rassmatrivautsa v poradke, v kotorom oni idut v vi6eprivedennom spiske.

Kak uje bilo upomanuto vi6e, vse pravila preobrazovaniy primenautsa s ispol'zovaniem Podstanovki (v poradke, v kotorom oni opredeleni v konfiguracionnom fayle). URL polnost'u zamenaetsa Podstanovkoy i process preobrazovania idet do tex por, poka ne ostanetsa bol'6e nikakix pravil, esli tol'ko on ne prervan special'no, s pomo6'u flaga L — sm. nije.

Su6estvuet special'naa stroka podstanovki vida '-' kotoraa ozna4aet: NET podstanovki! Zvu4it glupo? Net, eto polezno dla pravil preobrazovania kotorie tol'ko proveraut nekotorie URL odnako ne proizvodat podstanovok, t.e., v svazke s flagom C (cepo4ka) vozmojno imet' bolee 4em odin 6ablon, primenaemiy pered provedeniem neposredstvenno samoy podstanovki.

E6¸ odno zame4anie: Vi daje mojete sozdavat' URL, soderja6ie stroku zaprosa, v stroke podstanovki. Prosto ispol'zuyte voprositel'niy znak vnutri stroki podstanovki dla ukazania togo, sleduu6ee za nim soderjimoe doljno bit' preobrazovano v QUERY_STRING (stroku zaprosa). Kogda vi xotite ubrat' su6estvuu6uu stroku zaprosa, zaver6ayte stroku podstanovki prosto voprositel'nim znakom.

Prime4anieEst' odna osobennost': Kogda vi predvaraete pole podstanovki strokoy http://thishost[:thisport], — mod_rewrite otrezaet e¸ avtomati4eski. Eto avtomati4eskoe use4enie podrazumevaemoe pri vne6nem redirekte URL poleznaa i vajnaa osobennost' pri ispol'zovanii v svazke s zaprosami k massivam preobrazovaniy generiruu6ix ima xosta. Vzglanite na perviy primer, v razdele primerov nije, 4tobi ponat' eto.
PomniteBezuslovniy vne6niy redirekt na va6 sobstvenniy server ne budet rabotat' s prefiksom http://thishost iz-za etoy osobennosti. 4tobi ispol'zovat' takoy samoredirekt, Vi doljni ispol'zovat' flag R(sm. nije).

V podstanovke vi mojete ispol'zovat', v tom 4isle, i special'nie flagi putem dobavlenia sleduu6ey konstrukcii:

[flagi]

v ka4estve tret'ego argumenta direktivi RewriteRule. Flagi — eto razdel¸nniy zapatimi, sleduu6iy spisok flagov:

  • 'redirect|R [=code]' (vizivaet redirekt)
    Prefiks v Podstanovke vida http://thishost[:thisport]/ (sozdau6iy noviy URL iz kakogo-libo URI) zapuskaet vne6niy redirekt (perenapravlenie). Esli net nakakogo koda v podstanovke otvet budet s HTTP statusom 302 (VREMENNO PEREME6EN). Esli vi xotite ispol'zovat' drkgie kodi otvetov v diapazone 300-400, prosto napi6ite ix v vide 4isla ili ispol'zuyte odno iz sleduu6ix simvoli4eskix im¸n: temp (po-umol4aniu), permanent, seeother. Ispol'zuyte eto v direktivax, kotorie doljni preobrazovivat' nekie virtual'nie URL v real'nie i vozvra6at' ix klientu, naprimer, preobrazovivat' «/~» v «/u/» ili vsegda dobavlat' sle6 k /u/user, i t.d.

    Prime4anie: Pri ispol'zovanii etogo flaga, ubedites', 4to pole podstanovki, eto rabotau6iy URL! Esli eto ne tak, vi perenapravlaete v nikuda! I pomnite, 4to sam po sebe etot flag, tol'ko dopolnaet URL strokoy http://thishost[:thisport]/, i process preobrazovania prodoljaetsa. Takje, obi4no vi xotite ostanovit'sa i sdelat' etot redirekt nemedlenno. Dla ostanovki processa preobrazovania, vam takje nujno napisat' flag 'L'.

  • 'forbidden|F' (delaet URL zapre6ennim)
    Eto delaet teku6iy URL zapre6¸nnim, naprimer, klientu nemedlenno otpravlaetsa otvet s HTTP statusom 403 (ZAPRE6ENO). Ispol'zuyte etot flag v so4etanii s sootvetstvuu6imi RewriteConds dla blokirovania URL po nekotorim kriteriam.
  • 'gone|G' (delaet URL «m¸rtvim»)
    Etot flag delaet teku6iy URL «mertvim», t.e., nemedlenno otpravlaetsa HTTP otvet so statusom 410 (GONE). Ispol'zuyte etot flag dla markirovki «mertvimi» ne su6estvuu6ie bolee stranici.
  • 'proxy|P' (vizvaet proksi)
    Etot flag pome4aet podstanovo4nuu 4ast' kak vnutrenniy zapros proksi i nemedlenno (t.e., process preobrazovania zdes' ostanavlivaetsa) propuskaet ego 4erez proksi modul'. Vi doljni ubedit'sa, 4to stroka podstanovki eto real'niy URI (naprimer, tipi4no na4inau6iysa s http://hostname), kotoriy mojet bit' obrabotan proksi modulem Apache. Esli eto ne tak, vi polu4ite o6ibku ot proksi modula. Ispol'zuyte etot flag dla togo, 4tobi dobit'sa bolee mo6noy realizacii dirketivi ProxyPass, integriruu6ey nekotoroe soderjimoe na udalennix serverax, v prostranstvo im¸n lokal'nogo servera.

    Prime4anie: Dla togo 4tobi eto ispol'zovat' ubedites' 4to u vas est' rabotau6iy proksi modul' na va6em servere Apache. Esli vi ne znaete etogo prover'te est' li v vivode «httpd -l» stro4ka mod_proxy.c. Esli da, eti vozmojnosti dostupni mod_rewrite. Esli net, to sna4ala vi doljni peresobrat' programmu «httpd» s vklu4ennim proksi modulem.

  • 'last|L' (poslednee pravilo)
    Ostanovit' process preobrazovania na etom meste i ne primenat' bol'6e nikakix pravil preobrazovaniy. Eto sootvetstvuet operatoru last v Perl ili operatoru break v azike C. Ispol'zuyte etot flag dla togo, 4tobi ne preobrazovivat' teku6iy URL drugimi, sleduu6imi za etim, pravilami preobrazovaniy. K primeru, ispol'zuyte eto dla preobrazovania kornevogo URL iz ('/') v real'niy, naprimer, '/e/www/'.
  • 'next|N' (sleduu6iy raund)
    Perezapustit' process preobrazovaniy (na4av s pervogo pravila). V etom slu4ae URL snova sopostavlaetsa nekim usloviam, no ne original'niy URL, a URL vi6ed6iy iz poslednego pravila preobrazovania. Eto sootvetstvuet operatoru next v Perl ili operatoru continue iz azika C. Ispol'zuyte etot flag dla perezapuska processa preobrazovaniy, t.e., bezuslovnomu perexodu na na4alo cikla.
    Odnako bud'te ostorojni, dla togo 4tobi ne sdelat' beskone4niy cikl!
  • 'chain|C' (svaz' so sleduu6im pravilom)
    Etot flag svazivaet teku6ee pravilo so sleduu6im (kotoroe, v svou o4ered', mojet bit' svazano so sleduu6im za nim, i t.d.). Eto imeet sleduu6iy effekt: esli est' sootvetstvie pravilu, process prodoljaetsa kak obi4no, t.e., flag ne proizvodit nikakogo effekta. Esli pravilo ne sootvetstvuet usloviu, vse sleduu6ie, svazannie pravila, propuskautsa. Naprimer, impol'zuyte eto dla udalenia «.www» 4asti v konfiguracionnom pravile konteksta kataloga rabotau6ego kogda vi razre6aete vne6niy redirekt (gde ne doljno bit' «.www»!).
  • 'type|T=MIME-tip' (prinuditel'no ustanovit' MIME tip)
    Prinuditel'no ustanovit' MIME-tip celevogo fayla v MIME-tip. K primeru, eto mojno ispol'zovat' dla imitacii mod_alias direktivi ScriptAlias kotoraa prinuditel'no ustanavlivaet dla vsex faylov vnutri otobrajaemogo kataloga MIME tip ravniy «application/x-httpd-cgi».
  • 'nosubreq|NS' (ispol'zuetsa tol'ko v slu4ae nevnutrennego podzaprosa)
    Etot flag daet komandu mexanizmu preobrazovaniy propustit' direktivu esli teku6iy podzapros avlaetsa vnutrennim podzaprosom. K primeru, vnutrennie podzaprosi v Apache proisxodat togda, kogda mod_include pitaetsa polu4it' informaciu o vozmojnix faylax po-umol4aniu dla katalogov (index.xxx). Pri podzaprosax eto ne vsegda polezno i daje inogda vizivaet problemu v rabote vsego nabora direktiv preobrazovaniy. Ispol'zuyte etot flag dla isklu4enia nekotorix pravil.

    Ispol'zuyte sleduu6ee pravilo po svoemu usmotreniu: vsakiy raz kogda vi predvaraete nekotorie URL prefiksom peredavaa ix na obrabotku CGI-skriptu, — velik 6ans 4to vi naporetes' na problemi (ili daje na nenujnie izderjki) v slu4ae primenenia podzaprosov. V etix slu4aax, ispol'zuyte etot flag.

  • 'nocase|NC' (ne u4itivat' registr)
    Eto delaet 6ablon ne4ustvitel'nim k registru, t.e., net razli4iy mejdu 'A-Z' i 'a-z' kogda 6ablon primenaetsa k teku6emu URL.
  • 'qsappend|QSA' (dobavlat' stroku zaprosa)
    Etot flag ukazivaet mexanizmu preobrazovaniy na dobavlenie a ne zamenu, stroki zaprosa iz URL k su6estvuu6ey, v stroke podstanovki. Ispol'zuyte eto kogda vi xotite dobavlat' dopolnitel'nie dannie v stroku zaprosa s pomo6'u direktiv preobrazovaniy.
  • 'noescape|NE' (ne ekranirovat' URI pri vivode)
    Etot flag ne da¸t mod_rewrite primenat' obi4nie pravila ekranirovania URI k rezul'tatu preobrazovania. Obi4no, special'nie simvoli (takie kak '%', '$', ';', i tak dalee) budut ekranirovani ix 6estnadcatiri4nimi podstanovkami ('%25', '%24', i '%3B', sootvetstvenno); etot flag ne daet eto delat'. Eto pozvolaet simvolam procenta poavlatsa na vixode , kak v

    RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE]

    dla kotorogo '/foo/zed' preobrazovivalos' bi v bezopasniy zapros '/bar?arg=P1=zed'.
  • 'passthrough|PT' (propuskat' 4erez sleduu6iy obrabot4ik)
    Etot flag da¸t komandu mexanizmu preobrazovaniy ustanavlivat' pole uri vnutrenney strukturi request_rec ravnim polu filename. Etot flag, prosto li6' xitriy truk, dla togo 4tobi imet' vozmojnost' obrabotki vivoda direktiv RewriteRule, direktivami Alias, ScriptAlias, Redirect, i t.d. iz drugix translatorov URI-ima fayla. Trivial'niy primer dla pokaza etoy semantiki: esli vi xotite preobrazovat' /abc v /def s ispol'zovaniem mexanizma preobrazovaniy mod_rewrite i zatem /def v /ghi s ispol'zovaniem mod_alias:

    RewriteRule ^/abc(.*) /def$1 [PT]
    Alias /def /ghi

    Esli vi opustite flag PT, mod_rewrite prekrasno sdelaets svou rabotu, t.e., on preobrazuet uri=/abc/... v filename=/def/... kak doljen delat' polnost'u API-sovmestimiy translator URI-ima fayla. Zatem nasta¸t o4ered' mod_alias pitau6egosa sdelat' perexod URI-ima fayla kotoriy i ne budet rabotat'.

    Prime4anie: Vi doljni ispol'zovat' etot flag esli vi xotite sme6ivat' direktivi raznix moduley soderja6ix translatori URL-ima fayla. Tipi4niy primer eto ispol'zovanie moduley mod_alias i mod_rewrite..

    Dla lubiteley pokovirat'sa v ApacheEsli bi teku6iy Apache API imel kakoy-nibud' perexvat4ik ima fayla-ima fayla v dopolnenie k perexvat4iku URI-ima fayla nam bi ne ponadobilsa danniy flag! Odnako bez takogo perexvat4ika etot flag eto edinstvennoe re6enie. The Apache Group obsudila etu problemu i dobavit takoy perexvat4ik vo 2-y versii Apache.
  • 'skip|S=koli4estvo' (propustit' sleduu6ee pravilo(a))
    Etot flag ukazivaet mexanizmu preobrazovaniy propuskat' sleduu6ee koli4estvo pravil v posledovatel'nosti na4inau6eysa s teku6ego pravila. Ispol'zuyte eto dla sozdania psevdo if-then-else konstrukciy: Poslednee pravilo bloka then budet skip=N gde N koli4estvo pravil bloka else. (Eto ne to je samoe 4to i flag 'chain|C'!)
  • 'env|E=VAR:VAL' (ustanovit' peremennuu okurjenia)
    Prisvaivaet peremennoy okrujenia VAR zna4enie VAL, gde VAL mojet soderjat' obratnie svazi $N i %N ssilau6iesa na 4asti regularnix virajeniy, kotorie budut raskriti sootvetstvuu6im obrazom. Vi mojete ispol'zovat' etot flag bolee odnogo raza 4tobi prisvoit' zna4enie bolee 4em odnoy peremennoy. Pozje, eti peremennie mogut bit' ispol'zovani vo mnogix situaciax, obi4no v XSSI (4erez <!--#echo var="VAR"-->) ili v CGI skriptax (naprimer$ENV{'VAR'}). Krome togo, vi mojete eto ispol'zovat' v sleduu6em 6ablone RewriteCond 4erez %{ENV:VAR}. Ispol'zuyte eto dla udalenia, no zapominania nekotoroy informacii iz URL.
  • 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' (zapisat' cocookie)
    Zapisivaet cookie klientu. Ima cookie ukazivaetsa v NAME a ego zna4enie v VAL. Pole domain eto domen cookie, takoy kak naprimer '.apache.org', opcional'noe lifetime eto vrema jizni cookie v minutax, i opcional'niy path eto put' cookie
Prime4anieNikogda ne zabiva¸te 4to 6ablon primenaetsa ko vsemu URL v konfiguracionnix fayla servera. Odnako v konfiguracionnix faylax katalogov, prefiks kataloga (kotoriy vsegda odinakov dla konkretnogo kataloga !), avtomati4eski udalaetsa pri sootvetstvii 6ablonu i avtomati4eski dobavlaetsa posle zaver6enia podstanovki. Eta osobennost', osnova dla mnogix vidov preobrazovaniy, potomu 4to bez udalenia prefiksa dla roditel'skogo kataloga toje doljno bit' sootvetstvie, 4to ne vsegda vozmojno.

Est' odno isklu4enie: Esli stroka podstanovki na4inaetsa s «http://» v etom slu4ae prefiks kataloga ne dobavlaetsa i proisxodit libo vne6niy redirekt libo propuskanie 4erez proksi (esli ispol'zuetsa flag P!)!

Prime4anieDla togo 4tobi vklu4it' mexanizm preobrazovaniy v konfiguracionnix faylax katalogov vam nujno napisat' «RewriteEngine On» v etix samix faylax i, krome togo, doljna bit' razre6ena konfiguracionnaa direktiva «Options FollowSymLinks». Esli va6 administrator zapretil peregruzku konfiguracionnoy direktivi FollowSymLinks v pol'zovatel'skix katalogax, v etom slu4ae vi ne smojete ispol'zovat' mexanizm preobrazovaniy. Eto ograni4enie nujno po soobrajeniam bezopasnosti.

Vot vse vozmojnie kombinacii podstanovok s ras6ifrovkoy ix zna4eniy:

V konfiguracionnix faylax konteksta servera (httpd.conf)
dla zaprosa vida «GET /somepath/pathinfo»:

Pravilo Podstanovka ---------------------------------------------- ---------------------------------- ^/somepath(.*) otherpath$1 
ne podderjivaetsa, t.k. neverno! ^/somepath(.*) otherpath$1 [R] ne podderjivaetsa,
t.k. neverno! ^/somepath(.*) otherpath$1 [P] ne podderjivaetsa, t.k. neverno!
 ---------------------------------------------- ---------------------------------- ^/somepath(.*) /otherpath$1 /otherpath/pathinfo ^/somepath(.*) /otherpath$1 [R]
http://thishost/otherpath/pathinfo 4erez vne6niy redirekt ^/somepath(.*) /otherpath$1 [P] ne podderjivaetsa, - glupo! ----------------------------------------------
---------------------------------- ^/somepath(.*)
http://thishost/otherpath$1 /otherpath/pathinfo ^/somepath(.*) http://thishost/otherpath$1 [R]
 http://thishost/otherpath/pathinfo 4erez vne6niy redirekt ^/somepath(.*) http://thishost/otherpath$1 [P] ne podderjivaetsa, - glupo!
---------------------------------------------- ---------------------------------- ^/somepath(.*) http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo 4erez
vne6niy redirekt ^/somepath(.*)
http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo 4erez vne6niy redirekt (flag [R] izbito4en) ^/somepath(.*)
http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo 4erez vnutrenniy proksi 

Vnutri konfiguracionnogo fayla kataloga, dla /somepath
(t.e., fayl .htaccess v kataloge /physical/path/to/somepath soderjit RewriteBase /somepath)
dla zaprosa «GET /somepath/localpath/pathinfo»:

Pravilo Podstanovka ---------------------------------------------- 
---------------------------------- ^localpath(.*) otherpath$1 /somepath/otherpath/pathinfo ^localpath(.*) otherpath$1 [R]
http://thishost/somepath/otherpath/pathinfo 4erez vne6niy redirekt ^localpath(.*) otherpath$1 [P] ne podderjivaetsa, - glupo!
 ----------------------------------------------
---------------------------------- ^localpath(.*) /otherpath$1 /otherpath/pathinfo ^localpath(.*) /otherpath$1 [R] http://thishost/otherpath/pathinfo
4erez vne6niy redirekt ^localpath(.*) /otherpath$1 [P] ne podderjivaetsa, - glupo!
---------------------------------------------- 
---------------------------------- ^localpath(.*) http://thishost/otherpath$1 /otherpath/pathinfo ^localpath(.*) http://thishost/otherpath$1 [R]
http://thishost/otherpath/pathinfo 4erez vne6niy redirekt ^localpath(.*) http://thishost/otherpath$1 [P] ne podderjivaetsa, - glupo!
 ---------------------------------------------- ---------------------------------- ^localpath(.*)
 http://otherhost/otherpath$1 http://otherhost/otherpath/pathinfo 4erez vne6niy redirekt ^localpath(.*) http://otherhost/otherpath$1 
[R] http://otherhost/otherpath/pathinfo 4erez vne6niy redirekt (flag [R] izbito4en) ^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo 4erez vnutrenniy proksi 

Primer:

Mi xotim preobrazovat' URL vida

/ Language /~ Realname /.../ File

v

/u/ Username /.../ File . Language

Mi berem fayl, soderja6iy associativniy massiv dla preobrazovaniy, prived¸nniy vi6e i soxranae

3
Ñîçäàíèå ýêñêëþçèâíûõ ñàéòîâ, þçèáèëèòè àíàëèç è áåñïëàòíûé àíàëèç ïîä çàïðîñû îñíîâíûõ ïîèñêîâûõ ìàøèí
Êîíòàêòíàÿ èíôîðìàöèÿ :
òåë. +7(98I) 7608865

Íàïèñàòü ïèñüìî íà e-mail
icq 415547094  romverðåéòèíã íà mail.ru ñàéòà romverinbox.ru
© 1997 - 2024 romver.ru

Ïîëíàÿ êàðòà ñàéòà Display Pagerank