SlideShare a Scribd company logo
1 of 19
Download to read offline
mod_rewrite. Podrêcznik
                           administratora
                           Autor: Rich Bowen
                           T³umaczenie: Marek Pa³czyñski, Micha³ Rogalski
                           ISBN: 978-83-246-0465-4
                           Tytu³ orygina³u: The Definitive Guide to Apache mod_rewrite
                           Format: B5, stron: 160




                           Modu³ mod_rewrite, nazywany czêsto „scyzorykiem armii szwajcarskiej”, to potê¿ne
                           narzêdzie administratorów serwerów WWW, które uruchomiono w oparciu o Apache.
                           Za jego pomoc¹ mo¿na w dowolny niemal sposób manipulowaæ adresami URL
                           wpisywanymi przez u¿ytkowników w przegl¹darce internetowej. Mod_rewrite, oparty
                           na dyrektywach i wyra¿eniach regularnych, pozwala na zmianê postaci adresów URL
                           w oparciu o zmienne œrodowiskowe, nag³ówki HTTP i wiele innych warunków.
                           Ogromne mo¿liwoœci mod_rewrite sprawiaj¹, ¿e jest on okreœlany jako „równie
                           skomplikowany i tajemniczy jak magia woodoo”.
                           Celem ksi¹¿ki „mod_rewrite. Podrêcznik administratora” jest przybli¿enie mo¿liwoœci
                           tego modu³u administratorom serwerów. Przedstawia ona zarówno zagadnienia
                           podstawowe, czyli obszar zastosowañ modu³u oraz zasady wykorzystania wyra¿eñ
                           regularnych, jak i zagadnienia zaawansowane, takie jak tworzenie serwerów
                           wirtualnych, kontrola dostêpu i u¿ycie dyrektyw warunkowych. Czytaj¹c tê ksi¹¿kê,
                           dowiesz siê, kiedy nale¿y stosowaæ mod_rewrite, jak go instalowaæ i konfigurowaæ,
                           jak pracowaæ z mechanizmem przepisywania oraz w jaki sposób wyszukiwaæ i usuwaæ
                           b³êdy w dyrektywach modu³u.
                               • Podstawowe wiadomoœci o mod_rewrite
                               • Wyra¿enia regularne
                               • Procedura instalowania modu³u mod_rewrite
                               • Korzystanie z dyrektywy RewriteRule
                               • Przepisywanie warunkowe
                               • Zewnêtrzny mechanizm odwzorowania adresów
                               • Dynamiczne tworzenie serwerów wirtualnych
                               • Wspó³praca modu³u mod_rewrite z modu³em mod_proxy
Wydawnictwo Helion                         Przekonaj siê, ¿e mod_rewrite jest mniej skomplikowany
ul. Koœciuszki 1c                                    od formu³y uzyskania z³ota z o³owiu
44-100 Gliwice
tel. 032 230 98 63
e-mail: helion@helion.pl
Spis treści
               O autorze ......................................................................................... 9
               Wprowadzenie ................................................................................ 11
Rozdział 1. Wprowadzenie do modułu mod_rewrite ............................................ 15
               Kiedy należy stosować moduł mod_rewrite .................................................................... 16
                  Oczyszczenie ciągów URL ....................................................................................... 16
                  Duża liczba serwerów wirtualnych ........................................................................... 17
                  Reorganizacja witryny ............................................................................................... 17
                  Zmiany warunkowe ................................................................................................... 18
                  Inne zastosowania ..................................................................................................... 18
               Kiedy nie należy stosować modułu mod_rewrite ............................................................ 18
                  Zwykłe przekierowanie ............................................................................................. 18
                  Bardziej skomplikowane przekierowania ................................................................. 20
                  Serwery wirtualne ..................................................................................................... 20
                  Inne rozwiązania ....................................................................................................... 21
               Podsumowanie ................................................................................................................. 21
Rozdział 2. Wyrażenia regularne ....................................................................... 23
               Podstawowe elementy składowe ..................................................................................... 23
                  Dopasowanie dowolnego znaku (.) ........................................................................... 25
                  Znaki specjalne () ..................................................................................................... 25
                  Wyznaczenie początku i końca ciągu (^ i $) ............................................................. 26
                  Dopasowanie jednego lub większej liczby znaków (+) ............................................ 26
                  Dopasowanie zera lub większej liczby znaków (*) .................................................. 26
                  Zachłanne dopasowywanie ....................................................................................... 27
                  Dopasowanie opcjonalne (?) ..................................................................................... 27
                  Grupowanie i przechwytywanie ( () ) ....................................................................... 28
                  Dopasowanie jednego znaku ze zbioru ([ ]) .............................................................. 29
                  Negacja (!) ................................................................................................................. 30
               Przykłady wyrażeń regularnych ...................................................................................... 30
                  Adresy poczty elektronicznej .................................................................................... 31
                  Numer telefoniczny ................................................................................................... 32
                  Dopasowanie ciągów URI ......................................................................................... 33
               Narzędzia wspomagające pracę z wyrażeniami regularnymi .......................................... 35
                  Aplikacja Regex Coach ............................................................................................. 36
               Podsumowanie ................................................................................................................. 36
6                                                                                 mod_rewrite. Podręcznik administratora


Rozdział 3. Instalacja i konfiguracja modułu mod_rewrite .................................. 37
               Dystrybucje niezależnych firm ........................................................................................ 37
               Instalacja modułu mod_rewrite ....................................................................................... 38
                   Obiekty statyczne i współdzielone ............................................................................ 38
                   Instalowanie z plików źródłowych — statyczne ....................................................... 39
                   Instalacja z plików źródłowych — obiekty współdzielone ....................................... 40
                   Włączenie modułu mod_rewrite — instalacja pakietu binarnego ............................ 42
                   Sprawdzenie, czy moduł mod_rewrite jest poprawnie zainstalowany ...................... 44
               Brak uprawnień administratora systemu ......................................................................... 44
               Włączanie dziennika RewriteLog .................................................................................... 46
               Podsumowanie ................................................................................................................. 46
Rozdział 4. Dyrektywa RewriteRule .................................................................. 47
               Podstawowe informacje o dyrektywie RewriteRule ....................................................... 47
                  Składnia dyrektywy RewriteRule .............................................................................. 48
                  Kontekst użycia dyrektywy RewriteRule .................................................................. 48
                  Docelowy adres przepisywania ................................................................................. 51
                  Opcje dyrektywy RewriteRule .................................................................................. 53
               Podsumowanie ................................................................................................................. 62
Rozdział 5. Dyrektywa RewriteCond ................................................................. 63
               Składnia dyrektywy RewriteCond ................................................................................... 63
                   Zmienne dyrektywy RewriteCond ............................................................................ 64
                   Przekierowanie zależne od czasu .............................................................................. 67
                   Dodatkowe zmienne dyrektywy RewriteCond ......................................................... 68
                   Kradzież plików graficznych .................................................................................... 69
                   Wzorzec dyrektywy RewriteCond ............................................................................ 69
                   Przykłady ................................................................................................................... 70
                   Modyfikatory dyrektywy RewriteCond .................................................................... 71
               Zapętlenie ........................................................................................................................ 72
               Podsumowanie ................................................................................................................. 73
Rozdział 6. Dyrektywa RewriteMap .................................................................. 75
               Składnia dyrektywy RewriteMap .................................................................................... 75
               Typy map ......................................................................................................................... 76
                   Pliki txt ...................................................................................................................... 76
                   Losowe przepisywanie .............................................................................................. 78
                   Mapy indeksowane .................................................................................................... 80
                   Zewnętrzne programy ............................................................................................... 82
                   Funkcje wewnętrzne .................................................................................................. 83
               Podsumowanie ................................................................................................................. 84
Rozdział 7. Przepisania podstawowe ................................................................. 85
               Dopasowanie odnośników URL ...................................................................................... 85
                  Problem — chcemy przepisać ścieżkę z przekazywaniem informacji
                   w łańcuchu zapytań (przykład 1.) ........................................................................... 86
                  Problem — chcemy przepisać ścieżkę z przekazywaniem informacji
                   w łańcuchu zapytań (przykład 2.) ........................................................................... 86
                  Problem — chcemy przepisać ścieżkę z przekazywaniem informacji
                   w łańcuchu zapytań (przykład 3.) ........................................................................... 87
                  Problem — mamy więcej niż dziewięć argumentów ................................................ 88
               Zmiany nazw i reorganizacja ........................................................................................... 89
                  Problem — przeszliśmy z Cold Fusion na PHP i nadal chcemy,
                   aby wszystkie nasze odnośniki ciągle działały ....................................................... 89
                  Problem — poszukujemy pliku w więcej niż jednym miejscu ................................. 90
Spis treści                                                                                                                                       7


                  Problem — część zawartości naszej strony znajduje się na innym serwerze ........... 91
                  Problem — wymagamy kanonicznej nazwy hosta ................................................... 91
                  Problem — widzimy zły host SSL ............................................................................ 92
                  Problem — chcemy wymusić połączenie przez SSL ................................................ 92
               Podsumowanie ................................................................................................................. 93
Rozdział 8. Przepisywanie warunkowe .............................................................. 95
               Zapętlenie ........................................................................................................................ 95
               Przepisywanie zależne od czasu ...................................................................................... 98
                   Problem — strona konkursu dla użytkowników powinna być
                    dostępna jedynie w czasie jego trwania .................................................................. 98
               Przepisywanie zależne od parametrów przeglądarki ....................................................... 99
                   Problem — żądania użytkowników powinny być przekierowywane
                    zależnie od rodzaju przeglądarki ............................................................................ 99
                   Problem — zewnętrzni użytkownicy powinni zostać odesłani
                    do wybranej części witryny .................................................................................. 100
                   Problem — treść publikowana w serwisie powinna być uzależniona
                    od nazwy użytkownika ......................................................................................... 101
                   Problem — trzeba zmusić użytkowników do przejścia przez stronę startową ....... 102
                   Problem — trzeba uniemożliwić użytkownikom przesyłanie plików PHP
                    i uruchamianie ich ................................................................................................. 103
                   Problem — komunikat o błędzie weryfikacji
                    certyfikatu klienckiego jest niejasny ..................................................................... 103
               Podsumowanie ............................................................................................................... 104
Rozdział 9. Kontrola dostępu .......................................................................... 105
               Kiedy nie należy wykorzystywać modułu mod_rewrite ............................................... 105
                  Kontrola dostępu na podstawie adresu .................................................................... 106
                  Kontrola dostępu na podstawie wartości zmiennej środowiskowej ........................ 106
               Kontrola dostępu z wykorzystaniem modułu mod_rewrite ........................................... 107
                  Problem — Uniemożliwienie dostępu do określonego katalogu ............................ 108
                  Problem — Zablokowanie dostępu do kilku katalogów
                    za pomocą jednego bloku instrukcji ....................................................................... 109
               Kontrola dostępu na podstawie parametrów jednostki klienckiej ................................. 110
                  Problem — Zabezpieczenie serwisu przed działaniem programów-robotów ......... 110
                  Problem — Zabezpieczenie serwisu przed „kradzieżą plików graficznych” .......... 112
               Podsumowanie ............................................................................................................... 113
Rozdział 10. Serwery wirtualne ........................................................................ 115
               Tradycyjny sposób tworzenia serwerów wirtualnych ................................................... 116
               Konfiguracja serwerów wirtualnych z wykorzystaniem modułu mod_vhost_alias ...... 117
                  Serwer www.przyklad.pl działa poprawnie, a przyklad.pl nie ................................ 118
                  Zostało utworzonych zbyt wiele katalogów ............................................................ 119
                  Zaproponowane rozwiązanie psuje działanie innych serwerów wirtualnych ......... 120
                  Rejestracja zdarzeń .................................................................................................. 121
                  Niedostateczna elastyczność konfiguracji ............................................................... 121
               Zarządzanie wieloma serwerami wirtualnymi za pomocą modułu mod_rewrite .......... 121
                  Przepisywanie adresów serwerów wirtualnych ....................................................... 122
                  Wykorzystanie dyrektywy RewriteMap do zarządzania serwerami wirtualnymi ... 125
               Rejestracja zdarzeń dużej liczby serwerów wirtualnych ............................................... 126
                  Podzielenie pliku dziennika .................................................................................... 127
                  Potokowe procedury przetwarzania dzienników ..................................................... 128
               Podsumowanie ............................................................................................................... 128
8                                                                                mod_rewrite. Podręcznik administratora


Rozdział 11. Stosowanie proxy ......................................................................... 129
                Reguły przepisywania do proxy .................................................................................... 129
                Bezpieczeństwo ............................................................................................................. 130
                    Apache 1.3 ............................................................................................................... 131
                    Apache 2.0 ............................................................................................................... 131
                Usługa proxy bez używania mod_rewrite ..................................................................... 132
                Stosowanie proxy z modułem mod_rewrite .................................................................. 133
                    Używanie proxy do konkretnych rodzajów plików ................................................ 134
                    Używanie proxy wraz z serwerem aplikacji ........................................................... 134
                    Zmiany w treści przesyłanej przez proxy ................................................................ 135
                    Wyjątki w przesyłaniu treści strony za pośrednictwem proxy ................................ 136
                    Szukając gdzie indziej ............................................................................................. 136
                Podsumowanie ............................................................................................................... 137
Rozdział 12. Debugowanie ............................................................................... 139
                Dyrektywa RewriteLog ................................................................................................. 139
                   Przykład wykorzystania dyrektywy RewriteLog .................................................... 140
                   Unikanie pętli .......................................................................................................... 143
                   Dyrektywa RewriteRule w plikach .htaccess .......................................................... 144
                Podsumowanie ............................................................................................................... 146
Rozdział A      Dodatkowe źródła informacji ......................................................... 147
                Skorowidz .................................................................................... 149
Rozdział 2.
Wyrażenia regularne
   Działanie modułu mod_rewrite bazuje na definicjach wyrażeń regularnych zgodnych
   z wyrażeniami języka Perl (PCRE — Perl Compatible Regular Expression). Z tego
   względu osoby, które dzięki tej książce chcą poszerzyć swoją wiedzę na temat mo-
   dułu mod_rewrite, muszą najpierw zapoznać się z podstawami wyrażeń regularnych.
   Znajomość zaawansowanych mechanizmów działania wyrażeń regularnych nie jest tutaj
   konieczna, ale niezbędne jest przynajmniej poznanie ich składni. Nie zaszkodzi również
   przygotowanie sobie podręcznego słownika wyrażeń regularnych.

   Wszystkie potrzebne informacje zostaną przedstawione w niniejszym rozdziale. Trzeba
   jednak pamiętać, że istnieje wiele szczegółowych opracowań związanych z tym te-
   matem. Wyrażenia regularne są bowiem obszernym zagadnieniem, często opisywanym
   w różnych dokumentach. Na szczególną uwagę zasługuje książka Jeffreya Friedla pt.
   Wyrażenia regularne (Helion, 2001). Jest to rzetelna, świetnie napisana i wyczerpująca
   publikacja.

   Celem niniejszego rozdziału jest przedstawienie podstawowych elementów składowych
   wyrażeń regularnych — podstawowych symboli — oraz omówienie niektórych zaawan-
   sowanych technik przygotowywania własnych wyrażeń regularnych oraz analizowania
   wyrażeń definiowanych przez kogoś innego.

   Osoby, które znają składnię wyrażeń regularnych, mogą pominąć ten rozdział.



Podstawowe elementy składowe
   Wyrażenia regularne są sposobem na opisanie wzorców ciągów tekstowych (w zasadzie
   mogą opisywać dane dowolnego rodzaju, ale zazwyczaj odnoszą się do tekstu), umoż-
   liwiających wyszukanie określonego ciągu w bloku danych. Najlepszym sposobem
   analizowania jakiegokolwiek wyrażenia regularnego jest interpretowanie pojedynczych
   znaków. Trzeba więc wiedzieć, co każdy ze znaków reprezentuje.
24                                                            mod_rewrite. Podręcznik administratora


             Znaki te są podstawowymi elementami składowymi wyrażeń regularnych. Osoby, które
             nie znają składni wyrażeń regularnych, powinny włożyć w to miejsce książki zakładkę,
             gdyż będą musiały niejednokrotnie odwoływać się do prezentowanych tu informacji
             (dopóki nie nabędą biegłości w korzystaniu z opisywanych symboli). Tabela 2.1 jest
             kluczem do przekształcenia pozornie przypadkowego zbioru znaków we wzorzec do-
             pasowania. Informacje zamieszczone w tabeli zostały również uzupełnione (o znajdujące
             się w dalszej części rozdziału) przykłady i objaśnienia.

Tabela 2.1. Symbole wyrażeń regularnych
    Symbol      Znaczenie
    .           Dowolny znak.
               Symbol poprzedzający znak specjalny. Na przykład ciąg . oznacza znak kropki (.).
                Dodatkowo umieszczenie znaku  przed zwykłym znakiem może przekształcić go
                w symbol specjalny. Na przykład symbol t odpowiada znakowi tabulacji.
    ^           Wyznacznik początku, oznaczający, że wzorzec rozpoczyna się wraz z początkiem ciągu
                tekstowego. Na przykład wzorzec ^A oznacza, że ciąg tekstowy musi się rozpocząć literą A.
    $           Wyznacznik końca, oznaczający, że ciąg tekstowy kończy się wraz z określonym wzorcem.
                Na przykład wzorzec X$ oznacza, że ciąg tekstowy musi się zakończyć literą X.
    +           Dopasowanie poprzedniego bloku jeden raz lub więcej razy. Na przykład wzorzec a+
                odpowiada jednej lub większej liczbie liter a.
    *           Dopasowanie poprzedniego bloku zero lub więcej razy. Znaczenie symbolu jest takie samo,
                jak znaku +, z wyjątkiem faktu, że akceptowany jest również brak jakiejkolwiek wartości.
    ?           Dopasowanie poprzedniego bloku zero lub jeden raz. Innymi słowy, symbol ten definiuje
                poprzedzający go blok jako opcjonalny. Czyni również symbole + i * „niezachłannymi”
                (więcej informacji na temat zachłannego i niezachłannego dopasowywania znajduje się
                w kolejnym podrozdziale).
    ()          Funkcje grupowania i przechwytywania. Grupowanie oznacza przetwarzanie jednego
                lub większej liczby znaków w taki sposób, jakby były pojedynczym elementem.
                Przechwytywanie polega na zapamiętywaniu dopasowanego fragmentu, w celu późniejszego
                wykorzystania. Operacje te są nazywane wstecznym odwołaniem (ang. backreference).
    []          Symbole te wyznaczają klasę znaków. Za dopasowany uznaje się tylko jeden znak
                z wymienionego zbioru. Na przykład wzorzec [abc] odpowiada pojedynczemu znakowi
                o wartości a, b lub c.
    ^           Negacja dopasowania do zbioru znaków. Choć pozornie istnieje sprzeczność w interpretacji
                tego symbolu, w rzeczywistości nie ma tu żadnej niejednoznaczności. Znak ^ ma po prostu
                różne znaczenia w różnym kontekście. Na przykład wzorzec [^abc] odpowiada
                za dopasowanie pojedynczego znaku, który nie jest literą a, b ani c.
    !           Umieszczenie symbolu na początku wyrażenia regularnego oznacza jego negację.
                Zatem akceptowane są ciągi, które nie są zgodne z podanym wzorcem1.




1
    Składnia ta jest specyficzna dla wyrażeń regularnych modułu mod_rewrite i może nie być zgodna z
    wyrażeniami regularnymi stosowanymi w innych przypadkach.
Rozdział 2. ♦ Wyrażenia regularne                                                               25


        Choć nie jest to pełna lista wyrażeń regularnych, stanowi dobry punkt wyjściowy do
        dalszej pracy. Znaczenie każdego wyrażenia regularnego przedstawionego w książce
        zostało wyjaśnione w dalszej części rozdziału. Opisy te zawierają przykłady, po-
        zwalające na analizę praktycznego znaczenia symboli, prezentowanych w tabeli 2.1.
        Z mojego doświadczenia wynika, że wyrażenia regularne są znacznie łatwiejsze do zro-
        zumienia dzięki analizie przykładów niż dzięki poznaniu teorii.

        Szczegółowy opis poszczególnych pozycji tabeli 2.1 wraz z odpowiadającymi im
        przykładami został zamieszczony w kolejnych punktach podrozdziału.


Dopasowanie dowolnego znaku (.)
        Znak kropki (.), umieszczony w definicji wyrażenia regularnego, odpowiada za dopa-
        sowanie dowolnego znaku. Jako przykład rozważmy wzorzec:
          a.c

        Za dopasowany zostanie uznany ciąg zawierający literę a, po której występuje dowolny
        znak i litera c. Zatem wzorzec ten odpowiada ciągom tekstowym abc, asceta i marchew.
        Każdy z nich zawiera bowiem zdefiniowane w wzorcu litery. Za zgodny nie zostanie
        natomiast uznany ciąg palec, ponieważ między literami a i c występują dwa znaki.
        Symbol kropki (.) odpowiada jedynie pojedynczemu znakowi.


Znaki specjalne ()
        Znak odwrotnego ukośnika dodaje specjalne znaczenie do kolejnego znaku lub je usuwa
        — zależnie o kontekstu. Na przykład wiadomo już, że znak kropki (.) ma specjalne
        znaczenie. Gdyby jednak konieczne było zdefiniowanie rzeczywistego znaku kropki
        w ciągu tekstowym, należałoby poprzedzić go znakiem odwrotnego ukośnika. Symbol .
        oznacza więc „dowolny znak”, natomiast symbol . odpowiada faktycznemu zna-
        kowi kropki (.).

        Niektóre znaki otrzymują specjalne znaczenie, gdy zostaną poprzedzone znakiem ().
        Na przykład o ile znak s odpowiada rzeczywistej literze s w ciągu tekstowym, o tyle
        symbol s zastępuje znak odstępu — znak spacji lub tabulacji.

        Poprzedzenie znaku symbolem odwrotnego ukośnika nadaje mu specjalne znaczenie,
        przekształcając go w symbol specjalny. W dalszej części książki będą wykorzystywane
        również inne symbole specjalne, takie jak d (znak cyfry) lub w (znak „słowa”).

           Określenie „symbol specjalny” często odnosi się do takich znaków, jak . i $, które
           mają szczególne znaczenie dla wyrażeń regularnych.
26                                               mod_rewrite. Podręcznik administratora



Wyznaczenie początku i końca ciągu (^ i $)
     Znaki ^ i $ są nazywane znakami kotwic, ponieważ ich celem jest zapewnienie, że ciąg
     tekstowy rozpoczyna się od określonej sekwencji znaków i kończy określoną sekwencją
     znaków. Z uwagi na częstość występowania znaków kotwic są one wymienianie w grupie
     podstawowych symboli specjalnych.

     Oto przykłady ich zastosowania:
       ^/

     Powyższy wzorzec odpowiada dowolnemu ciągowi tekstowemu, który rozpoczyna się
     od znaku ukośnika.
       .jpg$

     Ten wzorzec z kolei opisuje dowolny ciąg tekstowy, który kończy się sekwencją zna-
     ków .jpg.
       ^/$

     Ostatni z przykładów wyznacza ciąg tekstowy, który rozpoczyna się i kończy znakiem
     ukośnika. Za dopasowany zostanie więc uznany jedynie ciąg złożony z jednego znaku
     ukośnika, bez jakichkolwiek dodatkowych znaków.


Dopasowanie jednego lub większej liczby znaków (+)
     Symbol + pozwala na jednokrotne lub wielokrotne dopasowanie grupy znaków. Na
     przykład poniższy wzorzec zaakceptuje często popełniane błędy w zapisie angielskiego
     słowa giraffe.
       giraf+e+

     Umożliwia on bowiem wprowadzenie jednego lub większej liczby znaków f oraz
     jednego lub większej liczby znaków e. Zatem za dopasowane zostaną uznane ciągi
     girafe, giraffe, giraffee, a także giraffffeeeee.


Dopasowanie zera lub większej liczby znaków (*)
     Symbol * pozwala na wystąpienie poprzedzającego go znaku zero lub więcej razy.
     Jego funkcja jest więc niemal identyczna z przeznaczeniem symbolu +. Jedyna różni-
     ca polega na tym, że akceptowane są również ciągi, które nie zawierają w ogóle se-
     kwencji zdefiniowanych we wzorcu. W praktyce symbol ten jest często wykorzystywa-
     ny w przypadkach, w których powinien zostać zastosowany symbol +. Problemem jest
     wówczas fakt, że za dopasowany zostaje uznany również pusty ciąg tekstowy. Przy-
     kładem może tu być nieznacznie zmodyfikowany wzorzec z poprzedniego punktu.
       giraf*e*
Rozdział 2. ♦ Wyrażenia regularne                                                         27


        Będzie on odpowiadał ciągom wymienionym poprzednio (giraffe, girafe i giraffee),
        ale będzie również zgodny z ciągiem giraeeee, który nie zawiera żadnych znaków f,
        czy z ciągiem gira, w którym nie występują ani znaki f, ani e.

        Najczęściej symbol ten wykorzystuje się w połączeniu z symbolem ., oznaczającym
        dopasowanie dowolnej treści. Często osoby stosujące je zapominają, że wyrażenia re-
        gularne dopasowują podciągi. Jako przykład warto tu rozważyć wzorzec:
          .*.gif$

        Z założenia wzorzec tego typu powinien akceptować ciągi tekstowe kończące się se-
        kwencją .gif. Takie zakończenie jest wymuszane przez symbol $. Z kolei symbol 
        poprzedzający znak . sprawia, że znak kropki jest traktowany jako rzeczywisty znak,
        a nie symbol specjalny. W tym przypadku celem zastosowania sekwencji .* było wska-
        zanie, że ciąg może się rozpoczynać od dowolnych znaków. W rzeczywistości jest ona
        jednak zbędna i niepotrzebnie zajmuje czas procesora podczas wykonywania zadania.

        Bardziej użytecznym przykładem wykorzystania symbolu * jest zadanie wyszukania
        wierszy komentarzy w pliku konfiguracyjnym serwera Apache. W takim przypadku
        pierwszym znakiem (innym niż znak odstępu) musi być #. Niemniej trzeba również
        uwzględnić możliwość poprzedzenia go znakami spacji.
          ^s*#

        Wzorzec ten odpowiada za dopasowanie ciągu tekstowego; może on (ale nie musi)
        rozpoczynać się znakami odstępu, po których występuje znak #. Wymusza więc stoso-
        wanie znaku #, jako pierwszego znaku (poza znakami odstępu) w wierszu.


Zachłanne dopasowywanie
        W przypadku stosowania symboli + i * mamy do czynienia z zachłannym dopasowy-
        waniem. Wyrażenie regularne dopasowuje wówczas możliwie największą liczbę zna-
        ków. Oznacza to, że zastosowanie wyrażenia regularnego a+ w odniesieniu do ciągu aaaa
        spowoduje, że za dopasowane zostaną uznane wszystkie znaki, a nie tylko pierwsza
        litera a. Ma to szczególne znaczenie w przypadku wyrażenia .*, które niekiedy może
        objąć większą część ciągu, niż powinno. Przykład tego problemu zostanie przedstawio-
        ny po omówieniu kilku kolejnych symboli specjalnych.


Dopasowanie opcjonalne (?)
        Symbol ? wyznacza opcjonalny pojedynczy znak. Jest on niezwykle użyteczny, gdy
        trzeba uwzględnić często występujące błędy w pisowni lub elementy, które mogą (ale
        nie muszą) być zapisane w ciągu. Na przykład można go wykorzystać w słowie, co do
        którego nie mamy pewności, czy powinno zawierać znak myślnika, czy nie.
          e-?mail

        Podany wzorzec akceptuje zarówno ciąg email, jak i e-mail, więc zwolennicy obydwu
        form zapisu będą usatysfakcjonowani.
28                                                         mod_rewrite. Podręcznik administratora


           Dodatkowo znak ? wyłącza „zachłanność” symboli + i *. Zatem umieszczenie znaku ?
           za symbolami + i * sprawia, że wyrażenie dopasuje możliwie najmniej znaków (zobacz
           wcześniejsze informacje na temat zachłannego dopasowania).

           Na przykład, jeśli wzorzec g.*a zostanie zastosowany w odniesieniu do ciągu gramatyka,
           symbole .* będą odpowiadały za dopasowanie fragmentu ramatyk. Gdyby jednak wzo-
           rzec miał postać g.*?a, wyrażenie .* nie miałoby charakteru zachłannego i odpowia-
           dałoby za dopasowanie jedynie pierwszej litery r.

           Kolejne porównania zachłannych i niezachłannych wyrażeń zostały zamieszczone
           w części występującej za omówieniem odwołań wstecznych.


Grupowanie i przechwytywanie ( () )
           Znaki nawiasów umożliwiają grupowanie kilku znaków w jeden element oraz prze-
           chwytywanie wyników dopasowania w celu późniejszego wykorzystania. Możliwość
           przetwarzania kilku znaków jako jednego elementu jest niezwykle użyteczna w przy-
           padku dopasowywania treści do wzorca. Przedstawiony poniżej przykład, choć niezbyt
           przydatny, jest poprawny pod względem funkcjonalnym.
              (abc)+

           Odpowiada on za wyszukanie sekwencji abc, występującej jeden lub więcej razy. Za do-
           pasowany zostanie więc uznany ciąg abc, jak również ciąg abcabc.

           Jeszcze bardziej użyteczną funkcją znaków nawiasu jest zdolność „przechwytywania”
           wyniku. Gdy ciąg zostanie dopasowany do wzorca, często zachodzi konieczność za-
           pamiętania jego treści, by można ją było wykorzystać w dalszych operacjach. Takie póź-
           niejsze wykorzystanie nazywa się odwołaniem wstecznym.

           Może na przykład wystąpić konieczność wyszukania pliku .gif (podobnie jak we wcze-
           śniejszym przykładzie), ale w sposób, który pozwoli na określenie, jaka w rzeczywi-
           stości była nazwa dopasowanego pliku. Dzięki zastosowaniu znaków nawiasu prze-
           chwycona nazwa może zostać wykorzystana w późniejszych operacjach przetwarzania.
              (.*.gif)$

           W przypadku dopasowania treści do wzorca, przechwycona wartość zostanie zapisana
           w specjalnej zmiennej $1 (w niektórych przypadkach nazwą zmiennej może być %12).
           Jeżeli w wyrażeniu zostało zdefiniowanych więcej nawiasów, druga wartość zostanie
           przechwycona w zmiennej $2, trzecia w $3 itd. Ostatnią z możliwych do wykorzystania
           zmiennych jest $9. Ograniczenie wynika z faktu, że zmienna $10 byłaby niejednoznacz-
           na. Mogłaby odpowiadać zmiennej $1, po której występuje rzeczywisty znak zera (0)
           lub zmiennej $10. Zamiast wprowadzać dodatkowe symbole specjalne wyróżniające po-
           szczególne przypadki, programiści modułu mod_rewrite zdecydowali się na ogranicze-
           nie zmiennych odwołania wstecznego do $9.
2
    W regułach RewriteRule zmienne są poprzedzane znakiem dolara ($), natomiast w regułach RewriteCond
    są zapisywane za znakiem wartości procentowej (%). Więcej informacji na temat dyrektyw RewriteRule
    i RewriteCond znajduje się w rozdziałach 4. i 5.
Rozdział 2. ♦ Wyrażenia regularne                                                          29


        Praktyczny sposób wykorzystania tej opcji zostanie przedstawiony w rozdziale 3., doty-
        czącym dyrektywy RewriteRule.

        Analizując ponownie przykład opisujący dopasowanie zachłanne i niezachłanne, warto
        rozważyć dwa następujące wzorce, zastosowane w odniesieniu do ciągu gramatyka.
          g(.*)a
          g(.*?)a

        Pierwszy wzorzec zwróci w zmiennej $1 wartość ramatyk, natomiast drugi spowoduje
        zapisanie w zmiennej $1 wartości r. Gdy wyrażenie jest analizowane w trybie zachłan-
        nym, dopasowuje jak najwięcej znaków i zatrzymuje swoje działanie po odczytaniu
        ostatniego znaku a. W trybie niezachłannym zadanie zostanie zrealizowane po odczyta-
        niu najmniejszej wystarczającej liczby znaków, czyli po odczytaniu pierwszej litery a.

        Aby mieć pewność, w jaki sposób będą dopasowywane do wzorców poszczególne
        fragmenty ciągów, warto wykorzystać takie narzędzia programowe, jak np. Regex Coach.
        Szczegółowy opis odwołań wstecznych, zachłannego dopasowywania i procesów za-
        chodzących w trakcie dopasowywania został zamieszczony w książce pt. Wyrażenia
        regularne (Helion, 2001).


Dopasowanie jednego znaku ze zbioru ([ ])
        Znaki klasy ([]) umożliwiają definiowanie zbioru znaków, z których każdy spełnia
        kryteria dopasowania. Wyrażenia regularne udostępniają kilka wbudowanych klas zna-
        ków (definiowanych na przykład za pomocą symbolu specjalnego s, prezentowanego
        wcześniej), ale pozwalają również na wyznaczanie własnych klas. Oto bardzo prosty
        przykład opisywanego mechanizmu:
          [abc]

        Zdefiniowana klasa znaków odpowiada za dopasowanie litery a, b lub c. Na przykład,
        gdyby było konieczne ustalenie podzbioru użytkowników, których nazwy rozpoczy-
        nają się od jednej z wymienionych liter, można by zastosować następujący wzorzec
        dopasowania:
          /home/([abc].*)

        Wzorzec ten zawiera kilka znaków, które zostały wcześniej opisane. Jego zadanie polega
        na dopasowaniu porównywanego ciągu do ścieżek dostępu do katalogów pewnego
        podzbioru użytkowników i zapisaniu nazw poszczególnych użytkowników w zmien-
        nej $1. Choć, jak się za chwilę okaże, nie do końca jest to prawda.

        W definicji klasy znaków można również dość łatwo wyznaczać zakres akceptowa-
        nych wartości. Na przykład, gdyby było konieczne dopasowanie wartości liczbowych
        z przedziału od 1 do 5, należałoby zastosować definicję klasy o treści [1-5].
30                                                mod_rewrite. Podręcznik administratora


     Jeżeli w definicji klasy znaków jako pierwszy występuje symbol ^, otrzymuje on spe-
     cjalne znaczenie. Klasa wyznaczona za pomocą ciągu [^abc] jest przeciwieństwem
     klasy [abc]. Odpowiada więc każdemu znakowi, który nie jest znakiem a, b lub c.

     W tym miejscu warto powrócić do wcześniejszego przykładu — próby dopasowania
     nazw użytkowników rozpoczynających się od liter a, b i c. Problem w tym, że w pre-
     zentowanym rozwiązaniu znak * ma charakter zachłanny, czyli dopasowuje możliwie
     najwięcej znaków. Aby zatrzymać dopasowywanie po odczytaniu znaku ukośnika,
     konieczne byłoby zdefiniowanie wzorca, który akceptowałby wszystkie znaki oprócz
     znaku ukośnika.
       /home/([abc][^/]+)

     Sekwencja .* została zastąpiona wyrażeniem [^/]+, które w praktyce oznacza dopa-
     sowanie dowolnych znaków poprzedzających znak ukośnika lub koniec ciągu teksto-
     wego (zależnie od tego, co będzie pierwsze). Dodatkowo zamiast symbolu * został
     użyty symbol + — nazwa użytkownika składająca się z jednego znaku zazwyczaj nie
     jest akceptowana. Po tej operacji w zmiennej $1 jest zapisana nazwa użytkownika, a nie
     nazwa użytkownika i ewentualne elementy ścieżki dostępu do innego katalogu (wystę-
     pujące za nazwą).


Negacja (!)
     Jeżeli zachodzi konieczność zanegowania całego wyrażenia regularnego, wystarczy po-
     przedzić je znakiem !. Rozwiązanie to nie jest uniwersalne dla wszystkich implementa-
     cji wyrażeń regularnych, ale może być wykorzystywane w znacznej większości z nich.
     W przypadku reguł przepisywania bardzo często jest ono stosowane do zaznaczenia,
     że dany wzorzec odnosi się do wszystkich katalogów, oprócz jednego. Zatem aby wyłą-
     czyć ze zbioru przetwarzanych katalogów katalog /obrazy, należy wyznaczyć wyrażenie
     dopasowania do katalogu /obrazy, a następnie je zanegować.
       !^/obrazy

     Taka definicja pozwala na zaakceptowanie wszystkich ścieżek dostępu, które nie roz-
     poczynają się od ciągu /obrazy. Więcej podobnych przykładów znajduje się w dalszej
     części książki, a szczególnie w rozdziale 11.



Przykłady wyrażeń regularnych
     W zrozumieniu zasad działania wyrażeń regularnych pomocnych może być kilka przy-
     kładów. Opis poszczególnych wyrażeń regularnych rozpoczyna się od często spoty-
     kanych przypadków, które zostały uzupełnione o pewne rozwiązania alternatywne.
Rozdział 2. ♦ Wyrażenia regularne                                                                       31


Adresy poczty elektronicznej
           Prezentację przykładów rozpoczyna wyrażenie rozwiązujące często występujący pro-
           blem — przygotowanie wzorca, który pozwoli na sprawdzenie adresu poczty elektro-
           nicznej3. Ogólna składnia adresu e-mail to: coś@coś.coś. Przygotowując wyrażenie
           regularne od podstaw, warto zawsze opisać sobie wzorzec właśnie w takiej formie,
           gdyż jest to dobry punkt wyjścia do prac nad samą treścią wyrażenia.

           Aby opisać adres e-mail za pomocą wyrażenia regularnego, trzeba przeanalizować jego
           poszczególne elementy składowe. Fragmenty zapisane jako coś można łatwo wyrazić za
           pomocą sekwencji .+. Natomiast fragment @ jest rzeczywistym znakiem, występującym
           w treści adresu.

           Uzyskujemy więc wzorzec o następującej treści:
              .+@.+..+

           Jest to dobry punkt wyjściowy, odpowiadający większości adresów poczty elektronicz-
           nej; prawdopodobnie nawet wszystkim. Jednak za dopasowane zostaną uznane rów-
           nież inne ciągi, które nie są adresami e-mail (np. @@@.@ czy @.com). Trzeba się więc
           zastanowić nad bardziej szczegółową weryfikacją.

           W pierwszej kolejności należałoby się upewnić, że ciąg występujący przed znakiem @ nie
           jest pusty i składa się ze znaków określonego rodzaju. Powinny to być znaki alfanume-
           ryczne i niektóre znaki specjalne (takie jak znaki kropki, podkreślenia czy myślnika).

           Na szczęście wyrażenia zgodne ze standardem PCRE udostępniają wygodne mechani-
           zmy wskazywania „znaków alfanumerycznych” — za pomocą predefiniowanej klasy
           znaków. Istnieje klika wstępnie przygotowanych klas tego typu, między innymi [:alpha:]
           (dopasowanie liter), [:digit:] (dopasowanie cyfr od 0 do 9) i [:alnum:] (dopasowanie
           znaków alfanumerycznych).

           Kolejna czynność powinna polegać na wymuszeniu stosowania znaków alfanumerycz-
           nych w części nazwy domeny, ale z pominięciem domeny najwyższego poziomu (ostat-
           niego elementu nazwy domenowej), która może zawierać jedynie litery. Dawniej podczas
           wyznaczania wzorców można było ograniczyć tę część do trzech liter. Jednak obecnie
           wykorzystywane są domeny nie spełniające tego założenia.

           Ostatnim zadaniem jest umożliwienie wykorzystania dowolnej liczby znaków kropki
           w nazwie serwera, tak aby zarówno ciąg a.com, jak i poczta.wsg.byd.pl były uznawane
           za poprawne elementy składowe adresu e-mail.

           Po przekształceniu wymienionych założeń do postaci wyrażenia otrzymujemy nastę-
           pujący ciąg:
              ^[[:alnum:].-_]+@[[:alnum:].]+.[:alpha:]+$


3
    Nie jest to wzorzec występujący szczególnie często w dyrektywach modułu mod_rewrite, lecz w definicjach
    wyrażeń regularnych jako takich. Adresy poczty elektronicznej rzadko występują w ciągach URL,
    dlatego sporadycznie są opisywane przez dyrektywy mod_rewrite.
32                                                 mod_rewrite. Podręcznik administratora


     Taka definicja jest z pewnością bardziej szczegółowa i zapewni poprawną weryfikację
     adresu poczty elektronicznej. Oczywiście nadal istnieje możliwość dopasowania ciągu
     nie odpowiadającego adresowi e-mail, ale prawdopodobieństwo takiego zdarzenia jest
     niewielkie.


Numer telefoniczny
     Kolejnym rozważanym zagadnieniem jest sprawdzenie numeru telefonicznego. Zdefi-
     niowanie wzorca jest znacznie trudniejsze, niż można by sądzić na początku. Aby ułatwić
     sobie zadanie, ograniczymy się jedynie do numerów stosowanych w Polsce, składają-
     cych się z dziesięciu cyfr.

     Numer telefoniczny stanowią trzy cyfry numeru kierunkowego i siedem cyfr abonenta.
     Cyfry te mogą, ale nie muszą, być rozdzielane za pomocą różnych znaków. Pierwsze
     trzy z nich są niekiedy otoczone znakami nawiasu. Rozwiązaniem może być nastę-
     pujący wzorzec:
       (?d{3})?[- ]?d{3}[- ]?d{2}[- ]?d{2}

     Odpowiada on większości polskich numerów telefonicznych, zapisywanych w typo-
     wych formatach. Trzy pierwsze cyfry mogą, ale nie muszą, być umieszczone w na-
     wiasie, a bloki trzech, dwóch i dwóch kolejnych cyfr mogą być rozdzielane za pomocą
     spacji lub znaków myślnika, bądź pozostać nie rozdzielone w ogóle. Zaproponowane
     rozwiązanie jest dalekie od doskonałości, ponieważ użytkownicy znajdą sposób na
     wprowadzenie danych w formacie innym niż założony.

     Przeanalizujmy regułę symbol po symbolu.
         Symbol (? reprezentuje opcjonalny znak otwarcia nawiasu. Znak odwrotnego
         ukośnika jest niezbędny, ponieważ nawias ma szczególne znaczenie, opisane we
         wcześniejszej części rozdziału. W tym wyrażeniu uwzględniony jest rzeczywisty
         znak nawiasu, a nie symbol specjalny. Znak zapytania z kolei przekształca
         znak nawiasu w element opcjonalny. Oznacza to, że osoba wprowadzająca dane
         może, ale nie musi, zapisać trzy pierwsze cyfry w nawiasie. Każda z metod
         jest akceptowana.
         Symbol d{3} obejmuje dwa elementy, które nie były dotychczas opisywane.
         Sekwencja d oznacza cyfry. Ta sama definicja może być zapisana za pomocą
         elementu [:digit:], ale notacja d jest znacznie częściej stosowana i wymaga
         mniej pisania. Ciąg {3} umieszczony za ciągiem d wskazuje, że dany znak musi
         wystąpić trzy razy. W tym przypadku oznacza to, że konieczne jest wprowadzenie
         trzech cyfr. W przeciwnym razie dopasowanie zakończy się błędem.
         Notacja typu {n} występuje jeszcze w dwóch formach składniowych, zależnych
         od liczby powtórzeń znaków. Wspomniane formy zapisu zostały zestawione
         w tabeli 2.2.
Rozdział 2. ♦ Wyrażenia regularne                                                             33


Tabela 2.2. Składnia wzorca powtórzenia {n,m}
 Składnia      Znaczenie
 {n}           Znak musi zostać wymieniony dokładnie n razy.
 {n,}          Znak musi zostać wymieniony n razy, ale dopuszczalne są kolejne powtórzenia.
 {n,m}         Znak musi zostać wymieniony przynajmniej n razy, ale nie więcej niż m razy.

             Symbol )? oznacza opcjonalny znak zamknięcia nawiasu — analogicznie
             do znaku otwierającego nawias.
             Sekwencja [- ]? definiuje kolejny znak opcjonalny. Jest to znak myślnika
             lub spacji (bądź jego brak), rozdzielający pierwsze trzy cyfry od kolejnych
             trzech cyfr.

         Pozostała część wyrażenia zawiera opisane już elementy. Jedyna różnica polega na licz-
         bie cyfr, które są wymagane w poszczególnych blokach.

         Kolejnym etapem przygotowywania wyrażenia regularnego powinno być opracowa-
         nie sposobów „obejścia” zabezpieczenia i ustalenie, czy obsługa tych skrajnych przy-
         padków jest warta dodatkowej pracy. Na przykład niektórzy użytkownicy będą po-
         przedzali numer znakami +48. W niektórych numerach dopisywane będą na końcu
         numery wewnętrzne. Z pewnością również znajdzie się osoba, która będzie chciała
         rozdzielać bloki cyfr za pomocą innego znaku niż zdefiniowane. Problem oczywiście
         można rozwiązać za pomocą bardziej złożonego wyrażenia regularnego. Jednak wzrost
         złożoności wiąże się z obniżeniem szybkości działania i zmniejszeniem czytelności
         dyrektywy. Opis przedstawionego wyrażenia zajął całą stronę, co najlepiej oddaje pro-
         blem czasu, który będzie potrzebny na rozszyfrowanie wyrażenia przy ponownej jego
         analizie po kilku miesiącach od utworzenia (gdy jego autor zapomni już, do czego
         ono służyło).


Dopasowanie ciągów URI
         Ponieważ książka ta jest poświęcona modułowi mod_rewrite, warto przeanalizować
         kilka przykładów dopasowania ciągów URI, gdyż to one będą podstawą wszelkich
         działań opisywanych w dalszej części publikacji.

         Większość dyrektyw, wymienionych w pozostałej części książki, wymaga podania wy-
         rażenia regularnego jako jednego z parametrów. W większości przypadków wyrażenia
         te będą opisywały ciąg URI, który jest techniczną nazwą dla zasobu wymienionego
         w żądaniu, przekazanym do serwera. Zazwyczaj odpowiada on treści zamieszczonej
         po adresie http://www.domena.pl.

         W kolejnych punktach zostaną opisane typowe przykłady wartości, które podlegają
         dopasowaniu za pomocą wyrażeń regularnych.
34                                                 mod_rewrite. Podręcznik administratora


Dopasowanie strony głównej
     Niekiedy zachodzi konieczność dopasowania strony głównej danej witryny. Zazwyczaj
     właściwym dla tego przypadku adresem URI jest ciąg pusty, ciąg złożony ze znaku /
     lub z nazwy strony indeksu (np. /index.html lub /index.php). Pusty ciąg URI wystę-
     puje wówczas, gdy zapisany w żądaniu adres nie zawiera końcowego znaku ukośnika
     (np. http://www.przyklad.pl).

     W pierwszej kolejności rozważmy przypadek, w którym przesłane przez użytkownika
     żądanie zawiera adres http://www.przyklad.pl lub http://www.przyklad.pl/ (tj. ciąg ad-
     resu z końcowym znakiem ukośnika lub bez niego, ale bez określonego pliku strony).
     Celem wyrażenia jest więc dopasowanie opcjonalnego znaku ukośnika.

     Zgodnie z informacjami przedstawionymi wcześniej, znaki opcjonalne są wyznaczane
     za pomocą symbolu ?. Zatem wyrażenie powinno mieć postać:
       ^/?$

     Odpowiada ono za dopasowanie ciągów tekstowych, które rozpoczynają się opcjo-
     nalnym znakiem ukośnika i nim kończą. Innymi słowy, akceptuje jedynie ciągi tek-
     stowe, które rozpoczynają się i kończą znakiem ukośnika lub rozpoczynają się i kończą
     „niczym”.

     W kolejnym kroku wyrażenie powinno zostać uzupełnione o bardziej złożone nazwy
     plików. Za dopasowane powinny być uznawane cztery następujące ciągi tekstowe:
         Pusty ciąg (gdy użytkownik zapisze adres http://www.przyklad.pl bez końcowego
         ukośnika).
         Ciąg / (gdy użytkownik zapisze adres http://www.przyklad.pl/ z końcowym
         ukośnikiem).
         Ciąg /index.html.
         Ciąg /index.php.

     Podstawą dla wyrażenia będzie reguła opracowana poprzednio.
       ^/?(index.(html|php))?$

     Nie jest to całkiem poprawna postać (o czym się będzie można przekonać, czytając
     dalszą część rozdziału), ale jest bliska ideałowi. Zawiera natomiast element, który nie
     był dotychczas opisywany — symbol |, reprezentujący alternatywę, czyli możliwość
     wyboru jednej lub drugiej opcji. W przypadku ciągu (html|php) oznacza to spełnienie
     kryteriów dla rozszerzenia html lub php.

     Wyrażenie definiuje więc ciąg tekstowy, który rozpoczyna się od opcjonalnego znaku
     ukośnika, po którym występuje ciąg index., a za nim ciąg html lub php. Cały ciąg (po-
     cząwszy od słowa index) jest opcjonalny, a po nim nie występuje żadna wartość.
Rozdział 2. ♦ Wyrażenia regularne                                                            35


        Jedyna wada wyrażenia polega na tym, że uznaje za dopasowane również ciągi index.php
        i index.html pozbawione poprzedzających je znaków ukośnika. Choć jest to sytuacja
        niedozwolona w tym kontekście wykorzystania ciągu URI, w praktyce nie powinna
        być powodem szczególnego zmartwienia. Mimo że użytkownik mógłby przesłać żą-
        danie w jednej z opisanych postaci, można przyjąć, że w najprawdopodobniej tego nie
        zrobi, a nawet gdyby tak uczynił, to nic się nie stanie, jeżeli żądanie zostanie potrak-
        towane w taki sam sposób, jakby zawierało poprawną wartość URI.

Dopasowanie katalogu
        Gdyby koniczne było ustalenie, jaki katalog został zapisany w ciągu URI lub jakim
        słowem kluczowym się rozpoczyna, trzeba byłoby wyodrębnić całą treść, występującą
        przed pierwszym znakiem ukośnika. Wyrażenie miałoby wówczas następującą postać:
          ^/([^/]+)

        Składa się ono z kilku elementów. Pierwszym jest standardowy, często stosowany,
        symbol ^/, oznaczający „rozpoczęcie od znaku ukośnika”. Kolejny wyznacza klasę
        znaków [^/], która odpowiada za dopasowanie wszystkich znaków oprócz ukośnika.
        Symbol + oznacza natomiast, że liczba tych znaków powinna wynosić jeden lub wię-
        cej. Z kolei nawias zapewnia zapisanie wartości w zmiennej $1 do późniejszego wy-
        korzystania.

Dopasowanie rozszerzenia pliku
        Trzecim z prezentowanych przykładów jest rozwiązanie umożliwiające dopasowanie
        plików o określonym rozszerzeniu — również bardzo często wykorzystywane. Za-
        łóżmy, że celem wzorca jest wyodrębnienie plików graficznych. Wyrażenie regularne
        przedstawione poniżej znajduje zastosowanie w odniesieniu do większości najczęściej
        wykorzystywanych rodzajów plików graficznych:
          .(jpg|gif|png)$

        W dalszej części książki zostaną również przedstawione sposoby ignorowania wielkości
        znaków, co umożliwi dopasowywanie również rozszerzeń zapisanych wielkimi literami.



Narzędzia wspomagające pracę
z wyrażeniami regularnymi
        Osoby, które zajmują się wyrażeniami regularnymi przez dłuższy czas, prędzej czy
        później sięgają po narzędzia programowe, zapewniające wsparcie i wizualizację reali-
        zowanych procesów. Programów wspomagających pracę jest wiele, a każdy z nich ma
        pewne wady i zalety. Nie ulega wątpliwości, że większość najbardziej użytecznych
        aplikacji opracowywania wyrażeń regularnych jest dostarczanych przez programistów
        skupionych wokół projektu Perl. Wynika to z faktu, że wyrażenia regularne są szcze-
        gólnie często stosowane w języku Perl i występują w niemal każdym programie.
36                                                mod_rewrite. Podręcznik administratora



Aplikacja Regex Coach
     Jedną z wartych polecenia aplikacji jest Regex Coach. Program ten jest dostępny za-
     równo dla platformy Linux, jak i Windows, i można go pobrać ze strony http://
     www.weitz.de/regex-coach/. Umożliwia on krokowe wykonanie wyrażenia regularnego
     i przeglądanie dopasowanych fragmentów ciągu. Funkcja ta jest niezwykle użyteczna,
     gdy użytkownik uczy się projektować własne wyrażenia.



Podsumowanie
     Zapoznanie się z podstawowymi informacjami na temat wyrażeń regularnych jest
     niezbędne przed przystąpieniem do pracy z modułem mod_rewrite. Zbyt często admi-
     nistratorzy starają się opracowywać wyrażenia stosując metody siłowe — wprowa-
     dzają różne kombinacje parametrów do chwili, gdy opracowany wzorzec wydaje się
     spełniać swoje zadanie. Rezultatem takich działań są nieefektywne i niestabilne wyra-
     żenia, których przygotowanie zabiera wiele czasu i wywołuje frustracje.

     Warto włożyć zakładkę w tę część książki i wracać do lektury rozdziału za każdym
     razem, gdy konieczne będzie ustalenie, jakie funkcje realizuje dane wyrażenie.

     Do innych źródeł informacji, wartych polecenia, można zaliczyć dokumentację wyra-
     żeń regularnych języka Perl, dostępną pod adresem http://perldoc.perl.org/perlre.html)
     i po wpisaniu polecenia perldoc perlre, a także dokumentację PCRE, która jest do-
     stępna pod adresem http://pcre.org/pcre.txt.

More Related Content

What's hot

Oracle Database 11g. Programowanie w języku PL/SQL
Oracle Database 11g. Programowanie w języku PL/SQLOracle Database 11g. Programowanie w języku PL/SQL
Oracle Database 11g. Programowanie w języku PL/SQLWydawnictwo Helion
 
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danychPHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danychWydawnictwo Helion
 
Pajączek 5 NxG. Oficjalny podręcznik
Pajączek 5 NxG. Oficjalny podręcznikPajączek 5 NxG. Oficjalny podręcznik
Pajączek 5 NxG. Oficjalny podręcznikWydawnictwo Helion
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIWydawnictwo Helion
 
PostgreSQL. Leksykon kieszonkowy
PostgreSQL. Leksykon kieszonkowyPostgreSQL. Leksykon kieszonkowy
PostgreSQL. Leksykon kieszonkowyWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 

What's hot (20)

Java. Rozmówki
Java. RozmówkiJava. Rozmówki
Java. Rozmówki
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Po prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxGPo prostu Pajączek 5 NxG
Po prostu Pajączek 5 NxG
 
Rozbudowa i naprawa serwerów
Rozbudowa i naprawa serwerówRozbudowa i naprawa serwerów
Rozbudowa i naprawa serwerów
 
Oracle Database 11g. Programowanie w języku PL/SQL
Oracle Database 11g. Programowanie w języku PL/SQLOracle Database 11g. Programowanie w języku PL/SQL
Oracle Database 11g. Programowanie w języku PL/SQL
 
Jak działa Linux
Jak działa LinuxJak działa Linux
Jak działa Linux
 
PHP5. Praktyczny kurs
PHP5. Praktyczny kursPHP5. Praktyczny kurs
PHP5. Praktyczny kurs
 
Linux. Kurs. Wydanie II
Linux. Kurs. Wydanie IILinux. Kurs. Wydanie II
Linux. Kurs. Wydanie II
 
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danychPHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
PHP, Microsoft IIS i SQL Server. Projektowanie i programowanie baz danych
 
Pajączek 5 NxG. Oficjalny podręcznik
Pajączek 5 NxG. Oficjalny podręcznikPajączek 5 NxG. Oficjalny podręcznik
Pajączek 5 NxG. Oficjalny podręcznik
 
MySQL. Szybki start
MySQL. Szybki startMySQL. Szybki start
MySQL. Szybki start
 
Contribute 2. Szybki start
Contribute 2. Szybki startContribute 2. Szybki start
Contribute 2. Szybki start
 
SQL. Szybki start
SQL. Szybki startSQL. Szybki start
SQL. Szybki start
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Po prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VIPo prostu JavaScript i Ajax. Wydanie VI
Po prostu JavaScript i Ajax. Wydanie VI
 
PostgreSQL. Leksykon kieszonkowy
PostgreSQL. Leksykon kieszonkowyPostgreSQL. Leksykon kieszonkowy
PostgreSQL. Leksykon kieszonkowy
 
JavaScript dla każdego
JavaScript dla każdegoJavaScript dla każdego
JavaScript dla każdego
 
Praktyczny kurs SQL
Praktyczny kurs SQLPraktyczny kurs SQL
Praktyczny kurs SQL
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 

Viewers also liked

Po prostu OpenOffice.ux.pl 2.0
Po prostu OpenOffice.ux.pl 2.0Po prostu OpenOffice.ux.pl 2.0
Po prostu OpenOffice.ux.pl 2.0Wydawnictwo Helion
 
Sudoku. 101 łamigłówek dla zaawansowanych
Sudoku. 101 łamigłówek dla zaawansowanychSudoku. 101 łamigłówek dla zaawansowanych
Sudoku. 101 łamigłówek dla zaawansowanychWydawnictwo Helion
 
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Wydawnictwo Helion
 
Excel w zastosowaniach inżynieryjnych
Excel w zastosowaniach inżynieryjnychExcel w zastosowaniach inżynieryjnych
Excel w zastosowaniach inżynieryjnychWydawnictwo Helion
 
Visual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektoweVisual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektoweWydawnictwo Helion
 
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...Wydawnictwo Helion
 
SQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystkoSQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystkoWydawnictwo Helion
 

Viewers also liked (9)

Po prostu OpenOffice.ux.pl 2.0
Po prostu OpenOffice.ux.pl 2.0Po prostu OpenOffice.ux.pl 2.0
Po prostu OpenOffice.ux.pl 2.0
 
C# 2005. Wprowadzenie
C# 2005. WprowadzenieC# 2005. Wprowadzenie
C# 2005. Wprowadzenie
 
Ajax w akcji
Ajax w akcjiAjax w akcji
Ajax w akcji
 
Sudoku. 101 łamigłówek dla zaawansowanych
Sudoku. 101 łamigłówek dla zaawansowanychSudoku. 101 łamigłówek dla zaawansowanych
Sudoku. 101 łamigłówek dla zaawansowanych
 
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
Agile. Programowanie zwinne: zasady, wzorce i praktyki zwinnego wytwarzania o...
 
Excel w zastosowaniach inżynieryjnych
Excel w zastosowaniach inżynieryjnychExcel w zastosowaniach inżynieryjnych
Excel w zastosowaniach inżynieryjnych
 
Visual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektoweVisual Basic .NET. Wzorce projektowe
Visual Basic .NET. Wzorce projektowe
 
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...
Kuloodporne strony internetowe. Jak poprawić elastyczność z wykorzystaniem XH...
 
SQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystkoSQL Server 2005. Wyciśnij wszystko
SQL Server 2005. Wyciśnij wszystko
 

Similar to mod_rewrite. Podręcznik administratora

Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieWydawnictwo Helion
 
Visual Basic 2008. Warsztat programisty
Visual Basic 2008. Warsztat programistyVisual Basic 2008. Warsztat programisty
Visual Basic 2008. Warsztat programistyWydawnictwo Helion
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programistyWydawnictwo Helion
 
Microsoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyMicrosoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...Wydawnictwo Helion
 
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarka
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarkaWitryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarka
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarkaWydawnictwo Helion
 
Windows Server 2003. Wysoko wydajne rozwiązania
Windows Server 2003. Wysoko wydajne rozwiązaniaWindows Server 2003. Wysoko wydajne rozwiązania
Windows Server 2003. Wysoko wydajne rozwiązaniaWydawnictwo Helion
 
Po prostu własny serwer internetowy
Po prostu własny serwer internetowyPo prostu własny serwer internetowy
Po prostu własny serwer internetowyWydawnictwo Helion
 
Projektowanie serwisów WWW. Standardy sieciowe
Projektowanie serwisów WWW. Standardy siecioweProjektowanie serwisów WWW. Standardy sieciowe
Projektowanie serwisów WWW. Standardy siecioweWydawnictwo Helion
 
100 sposobów na serwery Windows
100 sposobów na serwery Windows100 sposobów na serwery Windows
100 sposobów na serwery WindowsWydawnictwo Helion
 
CATIA V5. Podstawy budowy modeli autogenerujących
CATIA V5. Podstawy budowy modeli autogenerującychCATIA V5. Podstawy budowy modeli autogenerujących
CATIA V5. Podstawy budowy modeli autogenerującychWydawnictwo Helion
 
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki start
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki startPHP6 i MySQL 5. Dynamiczne strony WWW. Szybki start
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki startWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaWydawnictwo Helion
 
Windows Server 2008 PL. Księga eksperta
Windows Server 2008 PL. Księga ekspertaWindows Server 2008 PL. Księga eksperta
Windows Server 2008 PL. Księga ekspertaWydawnictwo Helion
 
Kurs tworzenia stron internetowych
Kurs tworzenia stron internetowychKurs tworzenia stron internetowych
Kurs tworzenia stron internetowychWydawnictwo Helion
 

Similar to mod_rewrite. Podręcznik administratora (20)

Serwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanieSerwer SQL 2008. Administracja i programowanie
Serwer SQL 2008. Administracja i programowanie
 
Visual Basic 2008. Warsztat programisty
Visual Basic 2008. Warsztat programistyVisual Basic 2008. Warsztat programisty
Visual Basic 2008. Warsztat programisty
 
Uczta programistów
Uczta programistówUczta programistów
Uczta programistów
 
mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programisty
 
Dreamweaver MX
Dreamweaver MXDreamweaver MX
Dreamweaver MX
 
Microsoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programistyMicrosoft SQL Server 2005. Podręcznik programisty
Microsoft SQL Server 2005. Podręcznik programisty
 
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...
Pozycjonowanie i optymalizacja stron WWW. Jak się to robi. Wydanie II poprawi...
 
C++BuilderX. Ćwiczenia
C++BuilderX. ĆwiczeniaC++BuilderX. Ćwiczenia
C++BuilderX. Ćwiczenia
 
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarka
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarkaWitryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarka
Witryny nie do ukrycia. Jak zbudować stronę, którą znajdzie każda wyszukiwarka
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 
Windows Server 2003. Wysoko wydajne rozwiązania
Windows Server 2003. Wysoko wydajne rozwiązaniaWindows Server 2003. Wysoko wydajne rozwiązania
Windows Server 2003. Wysoko wydajne rozwiązania
 
Po prostu własny serwer internetowy
Po prostu własny serwer internetowyPo prostu własny serwer internetowy
Po prostu własny serwer internetowy
 
Projektowanie serwisów WWW. Standardy sieciowe
Projektowanie serwisów WWW. Standardy siecioweProjektowanie serwisów WWW. Standardy sieciowe
Projektowanie serwisów WWW. Standardy sieciowe
 
100 sposobów na serwery Windows
100 sposobów na serwery Windows100 sposobów na serwery Windows
100 sposobów na serwery Windows
 
CATIA V5. Podstawy budowy modeli autogenerujących
CATIA V5. Podstawy budowy modeli autogenerującychCATIA V5. Podstawy budowy modeli autogenerujących
CATIA V5. Podstawy budowy modeli autogenerujących
 
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki start
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki startPHP6 i MySQL 5. Dynamiczne strony WWW. Szybki start
PHP6 i MySQL 5. Dynamiczne strony WWW. Szybki start
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Microsoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga ekspertaMicrosoft Visual Studio 2008. Księga eksperta
Microsoft Visual Studio 2008. Księga eksperta
 
Windows Server 2008 PL. Księga eksperta
Windows Server 2008 PL. Księga ekspertaWindows Server 2008 PL. Księga eksperta
Windows Server 2008 PL. Księga eksperta
 
Kurs tworzenia stron internetowych
Kurs tworzenia stron internetowychKurs tworzenia stron internetowych
Kurs tworzenia stron internetowych
 

More from Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++Wydawnictwo Helion
 
Rewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejRewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejWydawnictwo Helion
 
Fotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówFotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówWydawnictwo Helion
 
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWydawnictwo Helion
 

More from Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesieE-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image'u w biznesie
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 
USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++USB. Praktyczne programowanie z Windows API w C++
USB. Praktyczne programowanie z Windows API w C++
 
Rewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowejRewizor GT. Prowadzenie ewidencji księgowej
Rewizor GT. Prowadzenie ewidencji księgowej
 
Fotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantówFotografia cyfrowa. Poradnik bez kantów
Fotografia cyfrowa. Poradnik bez kantów
 
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows Vista. Naprawa i optymalizacja. Ćwiczenia praktyczne
 
JavaScript. Praktyczny kurs
JavaScript. Praktyczny kursJavaScript. Praktyczny kurs
JavaScript. Praktyczny kurs
 

mod_rewrite. Podręcznik administratora

  • 1. mod_rewrite. Podrêcznik administratora Autor: Rich Bowen T³umaczenie: Marek Pa³czyñski, Micha³ Rogalski ISBN: 978-83-246-0465-4 Tytu³ orygina³u: The Definitive Guide to Apache mod_rewrite Format: B5, stron: 160 Modu³ mod_rewrite, nazywany czêsto „scyzorykiem armii szwajcarskiej”, to potê¿ne narzêdzie administratorów serwerów WWW, które uruchomiono w oparciu o Apache. Za jego pomoc¹ mo¿na w dowolny niemal sposób manipulowaæ adresami URL wpisywanymi przez u¿ytkowników w przegl¹darce internetowej. Mod_rewrite, oparty na dyrektywach i wyra¿eniach regularnych, pozwala na zmianê postaci adresów URL w oparciu o zmienne œrodowiskowe, nag³ówki HTTP i wiele innych warunków. Ogromne mo¿liwoœci mod_rewrite sprawiaj¹, ¿e jest on okreœlany jako „równie skomplikowany i tajemniczy jak magia woodoo”. Celem ksi¹¿ki „mod_rewrite. Podrêcznik administratora” jest przybli¿enie mo¿liwoœci tego modu³u administratorom serwerów. Przedstawia ona zarówno zagadnienia podstawowe, czyli obszar zastosowañ modu³u oraz zasady wykorzystania wyra¿eñ regularnych, jak i zagadnienia zaawansowane, takie jak tworzenie serwerów wirtualnych, kontrola dostêpu i u¿ycie dyrektyw warunkowych. Czytaj¹c tê ksi¹¿kê, dowiesz siê, kiedy nale¿y stosowaæ mod_rewrite, jak go instalowaæ i konfigurowaæ, jak pracowaæ z mechanizmem przepisywania oraz w jaki sposób wyszukiwaæ i usuwaæ b³êdy w dyrektywach modu³u. • Podstawowe wiadomoœci o mod_rewrite • Wyra¿enia regularne • Procedura instalowania modu³u mod_rewrite • Korzystanie z dyrektywy RewriteRule • Przepisywanie warunkowe • Zewnêtrzny mechanizm odwzorowania adresów • Dynamiczne tworzenie serwerów wirtualnych • Wspó³praca modu³u mod_rewrite z modu³em mod_proxy Wydawnictwo Helion Przekonaj siê, ¿e mod_rewrite jest mniej skomplikowany ul. Koœciuszki 1c od formu³y uzyskania z³ota z o³owiu 44-100 Gliwice tel. 032 230 98 63 e-mail: helion@helion.pl
  • 2. Spis treści O autorze ......................................................................................... 9 Wprowadzenie ................................................................................ 11 Rozdział 1. Wprowadzenie do modułu mod_rewrite ............................................ 15 Kiedy należy stosować moduł mod_rewrite .................................................................... 16 Oczyszczenie ciągów URL ....................................................................................... 16 Duża liczba serwerów wirtualnych ........................................................................... 17 Reorganizacja witryny ............................................................................................... 17 Zmiany warunkowe ................................................................................................... 18 Inne zastosowania ..................................................................................................... 18 Kiedy nie należy stosować modułu mod_rewrite ............................................................ 18 Zwykłe przekierowanie ............................................................................................. 18 Bardziej skomplikowane przekierowania ................................................................. 20 Serwery wirtualne ..................................................................................................... 20 Inne rozwiązania ....................................................................................................... 21 Podsumowanie ................................................................................................................. 21 Rozdział 2. Wyrażenia regularne ....................................................................... 23 Podstawowe elementy składowe ..................................................................................... 23 Dopasowanie dowolnego znaku (.) ........................................................................... 25 Znaki specjalne () ..................................................................................................... 25 Wyznaczenie początku i końca ciągu (^ i $) ............................................................. 26 Dopasowanie jednego lub większej liczby znaków (+) ............................................ 26 Dopasowanie zera lub większej liczby znaków (*) .................................................. 26 Zachłanne dopasowywanie ....................................................................................... 27 Dopasowanie opcjonalne (?) ..................................................................................... 27 Grupowanie i przechwytywanie ( () ) ....................................................................... 28 Dopasowanie jednego znaku ze zbioru ([ ]) .............................................................. 29 Negacja (!) ................................................................................................................. 30 Przykłady wyrażeń regularnych ...................................................................................... 30 Adresy poczty elektronicznej .................................................................................... 31 Numer telefoniczny ................................................................................................... 32 Dopasowanie ciągów URI ......................................................................................... 33 Narzędzia wspomagające pracę z wyrażeniami regularnymi .......................................... 35 Aplikacja Regex Coach ............................................................................................. 36 Podsumowanie ................................................................................................................. 36
  • 3. 6 mod_rewrite. Podręcznik administratora Rozdział 3. Instalacja i konfiguracja modułu mod_rewrite .................................. 37 Dystrybucje niezależnych firm ........................................................................................ 37 Instalacja modułu mod_rewrite ....................................................................................... 38 Obiekty statyczne i współdzielone ............................................................................ 38 Instalowanie z plików źródłowych — statyczne ....................................................... 39 Instalacja z plików źródłowych — obiekty współdzielone ....................................... 40 Włączenie modułu mod_rewrite — instalacja pakietu binarnego ............................ 42 Sprawdzenie, czy moduł mod_rewrite jest poprawnie zainstalowany ...................... 44 Brak uprawnień administratora systemu ......................................................................... 44 Włączanie dziennika RewriteLog .................................................................................... 46 Podsumowanie ................................................................................................................. 46 Rozdział 4. Dyrektywa RewriteRule .................................................................. 47 Podstawowe informacje o dyrektywie RewriteRule ....................................................... 47 Składnia dyrektywy RewriteRule .............................................................................. 48 Kontekst użycia dyrektywy RewriteRule .................................................................. 48 Docelowy adres przepisywania ................................................................................. 51 Opcje dyrektywy RewriteRule .................................................................................. 53 Podsumowanie ................................................................................................................. 62 Rozdział 5. Dyrektywa RewriteCond ................................................................. 63 Składnia dyrektywy RewriteCond ................................................................................... 63 Zmienne dyrektywy RewriteCond ............................................................................ 64 Przekierowanie zależne od czasu .............................................................................. 67 Dodatkowe zmienne dyrektywy RewriteCond ......................................................... 68 Kradzież plików graficznych .................................................................................... 69 Wzorzec dyrektywy RewriteCond ............................................................................ 69 Przykłady ................................................................................................................... 70 Modyfikatory dyrektywy RewriteCond .................................................................... 71 Zapętlenie ........................................................................................................................ 72 Podsumowanie ................................................................................................................. 73 Rozdział 6. Dyrektywa RewriteMap .................................................................. 75 Składnia dyrektywy RewriteMap .................................................................................... 75 Typy map ......................................................................................................................... 76 Pliki txt ...................................................................................................................... 76 Losowe przepisywanie .............................................................................................. 78 Mapy indeksowane .................................................................................................... 80 Zewnętrzne programy ............................................................................................... 82 Funkcje wewnętrzne .................................................................................................. 83 Podsumowanie ................................................................................................................. 84 Rozdział 7. Przepisania podstawowe ................................................................. 85 Dopasowanie odnośników URL ...................................................................................... 85 Problem — chcemy przepisać ścieżkę z przekazywaniem informacji w łańcuchu zapytań (przykład 1.) ........................................................................... 86 Problem — chcemy przepisać ścieżkę z przekazywaniem informacji w łańcuchu zapytań (przykład 2.) ........................................................................... 86 Problem — chcemy przepisać ścieżkę z przekazywaniem informacji w łańcuchu zapytań (przykład 3.) ........................................................................... 87 Problem — mamy więcej niż dziewięć argumentów ................................................ 88 Zmiany nazw i reorganizacja ........................................................................................... 89 Problem — przeszliśmy z Cold Fusion na PHP i nadal chcemy, aby wszystkie nasze odnośniki ciągle działały ....................................................... 89 Problem — poszukujemy pliku w więcej niż jednym miejscu ................................. 90
  • 4. Spis treści 7 Problem — część zawartości naszej strony znajduje się na innym serwerze ........... 91 Problem — wymagamy kanonicznej nazwy hosta ................................................... 91 Problem — widzimy zły host SSL ............................................................................ 92 Problem — chcemy wymusić połączenie przez SSL ................................................ 92 Podsumowanie ................................................................................................................. 93 Rozdział 8. Przepisywanie warunkowe .............................................................. 95 Zapętlenie ........................................................................................................................ 95 Przepisywanie zależne od czasu ...................................................................................... 98 Problem — strona konkursu dla użytkowników powinna być dostępna jedynie w czasie jego trwania .................................................................. 98 Przepisywanie zależne od parametrów przeglądarki ....................................................... 99 Problem — żądania użytkowników powinny być przekierowywane zależnie od rodzaju przeglądarki ............................................................................ 99 Problem — zewnętrzni użytkownicy powinni zostać odesłani do wybranej części witryny .................................................................................. 100 Problem — treść publikowana w serwisie powinna być uzależniona od nazwy użytkownika ......................................................................................... 101 Problem — trzeba zmusić użytkowników do przejścia przez stronę startową ....... 102 Problem — trzeba uniemożliwić użytkownikom przesyłanie plików PHP i uruchamianie ich ................................................................................................. 103 Problem — komunikat o błędzie weryfikacji certyfikatu klienckiego jest niejasny ..................................................................... 103 Podsumowanie ............................................................................................................... 104 Rozdział 9. Kontrola dostępu .......................................................................... 105 Kiedy nie należy wykorzystywać modułu mod_rewrite ............................................... 105 Kontrola dostępu na podstawie adresu .................................................................... 106 Kontrola dostępu na podstawie wartości zmiennej środowiskowej ........................ 106 Kontrola dostępu z wykorzystaniem modułu mod_rewrite ........................................... 107 Problem — Uniemożliwienie dostępu do określonego katalogu ............................ 108 Problem — Zablokowanie dostępu do kilku katalogów za pomocą jednego bloku instrukcji ....................................................................... 109 Kontrola dostępu na podstawie parametrów jednostki klienckiej ................................. 110 Problem — Zabezpieczenie serwisu przed działaniem programów-robotów ......... 110 Problem — Zabezpieczenie serwisu przed „kradzieżą plików graficznych” .......... 112 Podsumowanie ............................................................................................................... 113 Rozdział 10. Serwery wirtualne ........................................................................ 115 Tradycyjny sposób tworzenia serwerów wirtualnych ................................................... 116 Konfiguracja serwerów wirtualnych z wykorzystaniem modułu mod_vhost_alias ...... 117 Serwer www.przyklad.pl działa poprawnie, a przyklad.pl nie ................................ 118 Zostało utworzonych zbyt wiele katalogów ............................................................ 119 Zaproponowane rozwiązanie psuje działanie innych serwerów wirtualnych ......... 120 Rejestracja zdarzeń .................................................................................................. 121 Niedostateczna elastyczność konfiguracji ............................................................... 121 Zarządzanie wieloma serwerami wirtualnymi za pomocą modułu mod_rewrite .......... 121 Przepisywanie adresów serwerów wirtualnych ....................................................... 122 Wykorzystanie dyrektywy RewriteMap do zarządzania serwerami wirtualnymi ... 125 Rejestracja zdarzeń dużej liczby serwerów wirtualnych ............................................... 126 Podzielenie pliku dziennika .................................................................................... 127 Potokowe procedury przetwarzania dzienników ..................................................... 128 Podsumowanie ............................................................................................................... 128
  • 5. 8 mod_rewrite. Podręcznik administratora Rozdział 11. Stosowanie proxy ......................................................................... 129 Reguły przepisywania do proxy .................................................................................... 129 Bezpieczeństwo ............................................................................................................. 130 Apache 1.3 ............................................................................................................... 131 Apache 2.0 ............................................................................................................... 131 Usługa proxy bez używania mod_rewrite ..................................................................... 132 Stosowanie proxy z modułem mod_rewrite .................................................................. 133 Używanie proxy do konkretnych rodzajów plików ................................................ 134 Używanie proxy wraz z serwerem aplikacji ........................................................... 134 Zmiany w treści przesyłanej przez proxy ................................................................ 135 Wyjątki w przesyłaniu treści strony za pośrednictwem proxy ................................ 136 Szukając gdzie indziej ............................................................................................. 136 Podsumowanie ............................................................................................................... 137 Rozdział 12. Debugowanie ............................................................................... 139 Dyrektywa RewriteLog ................................................................................................. 139 Przykład wykorzystania dyrektywy RewriteLog .................................................... 140 Unikanie pętli .......................................................................................................... 143 Dyrektywa RewriteRule w plikach .htaccess .......................................................... 144 Podsumowanie ............................................................................................................... 146 Rozdział A Dodatkowe źródła informacji ......................................................... 147 Skorowidz .................................................................................... 149
  • 6. Rozdział 2. Wyrażenia regularne Działanie modułu mod_rewrite bazuje na definicjach wyrażeń regularnych zgodnych z wyrażeniami języka Perl (PCRE — Perl Compatible Regular Expression). Z tego względu osoby, które dzięki tej książce chcą poszerzyć swoją wiedzę na temat mo- dułu mod_rewrite, muszą najpierw zapoznać się z podstawami wyrażeń regularnych. Znajomość zaawansowanych mechanizmów działania wyrażeń regularnych nie jest tutaj konieczna, ale niezbędne jest przynajmniej poznanie ich składni. Nie zaszkodzi również przygotowanie sobie podręcznego słownika wyrażeń regularnych. Wszystkie potrzebne informacje zostaną przedstawione w niniejszym rozdziale. Trzeba jednak pamiętać, że istnieje wiele szczegółowych opracowań związanych z tym te- matem. Wyrażenia regularne są bowiem obszernym zagadnieniem, często opisywanym w różnych dokumentach. Na szczególną uwagę zasługuje książka Jeffreya Friedla pt. Wyrażenia regularne (Helion, 2001). Jest to rzetelna, świetnie napisana i wyczerpująca publikacja. Celem niniejszego rozdziału jest przedstawienie podstawowych elementów składowych wyrażeń regularnych — podstawowych symboli — oraz omówienie niektórych zaawan- sowanych technik przygotowywania własnych wyrażeń regularnych oraz analizowania wyrażeń definiowanych przez kogoś innego. Osoby, które znają składnię wyrażeń regularnych, mogą pominąć ten rozdział. Podstawowe elementy składowe Wyrażenia regularne są sposobem na opisanie wzorców ciągów tekstowych (w zasadzie mogą opisywać dane dowolnego rodzaju, ale zazwyczaj odnoszą się do tekstu), umoż- liwiających wyszukanie określonego ciągu w bloku danych. Najlepszym sposobem analizowania jakiegokolwiek wyrażenia regularnego jest interpretowanie pojedynczych znaków. Trzeba więc wiedzieć, co każdy ze znaków reprezentuje.
  • 7. 24 mod_rewrite. Podręcznik administratora Znaki te są podstawowymi elementami składowymi wyrażeń regularnych. Osoby, które nie znają składni wyrażeń regularnych, powinny włożyć w to miejsce książki zakładkę, gdyż będą musiały niejednokrotnie odwoływać się do prezentowanych tu informacji (dopóki nie nabędą biegłości w korzystaniu z opisywanych symboli). Tabela 2.1 jest kluczem do przekształcenia pozornie przypadkowego zbioru znaków we wzorzec do- pasowania. Informacje zamieszczone w tabeli zostały również uzupełnione (o znajdujące się w dalszej części rozdziału) przykłady i objaśnienia. Tabela 2.1. Symbole wyrażeń regularnych Symbol Znaczenie . Dowolny znak. Symbol poprzedzający znak specjalny. Na przykład ciąg . oznacza znak kropki (.). Dodatkowo umieszczenie znaku przed zwykłym znakiem może przekształcić go w symbol specjalny. Na przykład symbol t odpowiada znakowi tabulacji. ^ Wyznacznik początku, oznaczający, że wzorzec rozpoczyna się wraz z początkiem ciągu tekstowego. Na przykład wzorzec ^A oznacza, że ciąg tekstowy musi się rozpocząć literą A. $ Wyznacznik końca, oznaczający, że ciąg tekstowy kończy się wraz z określonym wzorcem. Na przykład wzorzec X$ oznacza, że ciąg tekstowy musi się zakończyć literą X. + Dopasowanie poprzedniego bloku jeden raz lub więcej razy. Na przykład wzorzec a+ odpowiada jednej lub większej liczbie liter a. * Dopasowanie poprzedniego bloku zero lub więcej razy. Znaczenie symbolu jest takie samo, jak znaku +, z wyjątkiem faktu, że akceptowany jest również brak jakiejkolwiek wartości. ? Dopasowanie poprzedniego bloku zero lub jeden raz. Innymi słowy, symbol ten definiuje poprzedzający go blok jako opcjonalny. Czyni również symbole + i * „niezachłannymi” (więcej informacji na temat zachłannego i niezachłannego dopasowywania znajduje się w kolejnym podrozdziale). () Funkcje grupowania i przechwytywania. Grupowanie oznacza przetwarzanie jednego lub większej liczby znaków w taki sposób, jakby były pojedynczym elementem. Przechwytywanie polega na zapamiętywaniu dopasowanego fragmentu, w celu późniejszego wykorzystania. Operacje te są nazywane wstecznym odwołaniem (ang. backreference). [] Symbole te wyznaczają klasę znaków. Za dopasowany uznaje się tylko jeden znak z wymienionego zbioru. Na przykład wzorzec [abc] odpowiada pojedynczemu znakowi o wartości a, b lub c. ^ Negacja dopasowania do zbioru znaków. Choć pozornie istnieje sprzeczność w interpretacji tego symbolu, w rzeczywistości nie ma tu żadnej niejednoznaczności. Znak ^ ma po prostu różne znaczenia w różnym kontekście. Na przykład wzorzec [^abc] odpowiada za dopasowanie pojedynczego znaku, który nie jest literą a, b ani c. ! Umieszczenie symbolu na początku wyrażenia regularnego oznacza jego negację. Zatem akceptowane są ciągi, które nie są zgodne z podanym wzorcem1. 1 Składnia ta jest specyficzna dla wyrażeń regularnych modułu mod_rewrite i może nie być zgodna z wyrażeniami regularnymi stosowanymi w innych przypadkach.
  • 8. Rozdział 2. ♦ Wyrażenia regularne 25 Choć nie jest to pełna lista wyrażeń regularnych, stanowi dobry punkt wyjściowy do dalszej pracy. Znaczenie każdego wyrażenia regularnego przedstawionego w książce zostało wyjaśnione w dalszej części rozdziału. Opisy te zawierają przykłady, po- zwalające na analizę praktycznego znaczenia symboli, prezentowanych w tabeli 2.1. Z mojego doświadczenia wynika, że wyrażenia regularne są znacznie łatwiejsze do zro- zumienia dzięki analizie przykładów niż dzięki poznaniu teorii. Szczegółowy opis poszczególnych pozycji tabeli 2.1 wraz z odpowiadającymi im przykładami został zamieszczony w kolejnych punktach podrozdziału. Dopasowanie dowolnego znaku (.) Znak kropki (.), umieszczony w definicji wyrażenia regularnego, odpowiada za dopa- sowanie dowolnego znaku. Jako przykład rozważmy wzorzec: a.c Za dopasowany zostanie uznany ciąg zawierający literę a, po której występuje dowolny znak i litera c. Zatem wzorzec ten odpowiada ciągom tekstowym abc, asceta i marchew. Każdy z nich zawiera bowiem zdefiniowane w wzorcu litery. Za zgodny nie zostanie natomiast uznany ciąg palec, ponieważ między literami a i c występują dwa znaki. Symbol kropki (.) odpowiada jedynie pojedynczemu znakowi. Znaki specjalne () Znak odwrotnego ukośnika dodaje specjalne znaczenie do kolejnego znaku lub je usuwa — zależnie o kontekstu. Na przykład wiadomo już, że znak kropki (.) ma specjalne znaczenie. Gdyby jednak konieczne było zdefiniowanie rzeczywistego znaku kropki w ciągu tekstowym, należałoby poprzedzić go znakiem odwrotnego ukośnika. Symbol . oznacza więc „dowolny znak”, natomiast symbol . odpowiada faktycznemu zna- kowi kropki (.). Niektóre znaki otrzymują specjalne znaczenie, gdy zostaną poprzedzone znakiem (). Na przykład o ile znak s odpowiada rzeczywistej literze s w ciągu tekstowym, o tyle symbol s zastępuje znak odstępu — znak spacji lub tabulacji. Poprzedzenie znaku symbolem odwrotnego ukośnika nadaje mu specjalne znaczenie, przekształcając go w symbol specjalny. W dalszej części książki będą wykorzystywane również inne symbole specjalne, takie jak d (znak cyfry) lub w (znak „słowa”). Określenie „symbol specjalny” często odnosi się do takich znaków, jak . i $, które mają szczególne znaczenie dla wyrażeń regularnych.
  • 9. 26 mod_rewrite. Podręcznik administratora Wyznaczenie początku i końca ciągu (^ i $) Znaki ^ i $ są nazywane znakami kotwic, ponieważ ich celem jest zapewnienie, że ciąg tekstowy rozpoczyna się od określonej sekwencji znaków i kończy określoną sekwencją znaków. Z uwagi na częstość występowania znaków kotwic są one wymienianie w grupie podstawowych symboli specjalnych. Oto przykłady ich zastosowania: ^/ Powyższy wzorzec odpowiada dowolnemu ciągowi tekstowemu, który rozpoczyna się od znaku ukośnika. .jpg$ Ten wzorzec z kolei opisuje dowolny ciąg tekstowy, który kończy się sekwencją zna- ków .jpg. ^/$ Ostatni z przykładów wyznacza ciąg tekstowy, który rozpoczyna się i kończy znakiem ukośnika. Za dopasowany zostanie więc uznany jedynie ciąg złożony z jednego znaku ukośnika, bez jakichkolwiek dodatkowych znaków. Dopasowanie jednego lub większej liczby znaków (+) Symbol + pozwala na jednokrotne lub wielokrotne dopasowanie grupy znaków. Na przykład poniższy wzorzec zaakceptuje często popełniane błędy w zapisie angielskiego słowa giraffe. giraf+e+ Umożliwia on bowiem wprowadzenie jednego lub większej liczby znaków f oraz jednego lub większej liczby znaków e. Zatem za dopasowane zostaną uznane ciągi girafe, giraffe, giraffee, a także giraffffeeeee. Dopasowanie zera lub większej liczby znaków (*) Symbol * pozwala na wystąpienie poprzedzającego go znaku zero lub więcej razy. Jego funkcja jest więc niemal identyczna z przeznaczeniem symbolu +. Jedyna różni- ca polega na tym, że akceptowane są również ciągi, które nie zawierają w ogóle se- kwencji zdefiniowanych we wzorcu. W praktyce symbol ten jest często wykorzystywa- ny w przypadkach, w których powinien zostać zastosowany symbol +. Problemem jest wówczas fakt, że za dopasowany zostaje uznany również pusty ciąg tekstowy. Przy- kładem może tu być nieznacznie zmodyfikowany wzorzec z poprzedniego punktu. giraf*e*
  • 10. Rozdział 2. ♦ Wyrażenia regularne 27 Będzie on odpowiadał ciągom wymienionym poprzednio (giraffe, girafe i giraffee), ale będzie również zgodny z ciągiem giraeeee, który nie zawiera żadnych znaków f, czy z ciągiem gira, w którym nie występują ani znaki f, ani e. Najczęściej symbol ten wykorzystuje się w połączeniu z symbolem ., oznaczającym dopasowanie dowolnej treści. Często osoby stosujące je zapominają, że wyrażenia re- gularne dopasowują podciągi. Jako przykład warto tu rozważyć wzorzec: .*.gif$ Z założenia wzorzec tego typu powinien akceptować ciągi tekstowe kończące się se- kwencją .gif. Takie zakończenie jest wymuszane przez symbol $. Z kolei symbol poprzedzający znak . sprawia, że znak kropki jest traktowany jako rzeczywisty znak, a nie symbol specjalny. W tym przypadku celem zastosowania sekwencji .* było wska- zanie, że ciąg może się rozpoczynać od dowolnych znaków. W rzeczywistości jest ona jednak zbędna i niepotrzebnie zajmuje czas procesora podczas wykonywania zadania. Bardziej użytecznym przykładem wykorzystania symbolu * jest zadanie wyszukania wierszy komentarzy w pliku konfiguracyjnym serwera Apache. W takim przypadku pierwszym znakiem (innym niż znak odstępu) musi być #. Niemniej trzeba również uwzględnić możliwość poprzedzenia go znakami spacji. ^s*# Wzorzec ten odpowiada za dopasowanie ciągu tekstowego; może on (ale nie musi) rozpoczynać się znakami odstępu, po których występuje znak #. Wymusza więc stoso- wanie znaku #, jako pierwszego znaku (poza znakami odstępu) w wierszu. Zachłanne dopasowywanie W przypadku stosowania symboli + i * mamy do czynienia z zachłannym dopasowy- waniem. Wyrażenie regularne dopasowuje wówczas możliwie największą liczbę zna- ków. Oznacza to, że zastosowanie wyrażenia regularnego a+ w odniesieniu do ciągu aaaa spowoduje, że za dopasowane zostaną uznane wszystkie znaki, a nie tylko pierwsza litera a. Ma to szczególne znaczenie w przypadku wyrażenia .*, które niekiedy może objąć większą część ciągu, niż powinno. Przykład tego problemu zostanie przedstawio- ny po omówieniu kilku kolejnych symboli specjalnych. Dopasowanie opcjonalne (?) Symbol ? wyznacza opcjonalny pojedynczy znak. Jest on niezwykle użyteczny, gdy trzeba uwzględnić często występujące błędy w pisowni lub elementy, które mogą (ale nie muszą) być zapisane w ciągu. Na przykład można go wykorzystać w słowie, co do którego nie mamy pewności, czy powinno zawierać znak myślnika, czy nie. e-?mail Podany wzorzec akceptuje zarówno ciąg email, jak i e-mail, więc zwolennicy obydwu form zapisu będą usatysfakcjonowani.
  • 11. 28 mod_rewrite. Podręcznik administratora Dodatkowo znak ? wyłącza „zachłanność” symboli + i *. Zatem umieszczenie znaku ? za symbolami + i * sprawia, że wyrażenie dopasuje możliwie najmniej znaków (zobacz wcześniejsze informacje na temat zachłannego dopasowania). Na przykład, jeśli wzorzec g.*a zostanie zastosowany w odniesieniu do ciągu gramatyka, symbole .* będą odpowiadały za dopasowanie fragmentu ramatyk. Gdyby jednak wzo- rzec miał postać g.*?a, wyrażenie .* nie miałoby charakteru zachłannego i odpowia- dałoby za dopasowanie jedynie pierwszej litery r. Kolejne porównania zachłannych i niezachłannych wyrażeń zostały zamieszczone w części występującej za omówieniem odwołań wstecznych. Grupowanie i przechwytywanie ( () ) Znaki nawiasów umożliwiają grupowanie kilku znaków w jeden element oraz prze- chwytywanie wyników dopasowania w celu późniejszego wykorzystania. Możliwość przetwarzania kilku znaków jako jednego elementu jest niezwykle użyteczna w przy- padku dopasowywania treści do wzorca. Przedstawiony poniżej przykład, choć niezbyt przydatny, jest poprawny pod względem funkcjonalnym. (abc)+ Odpowiada on za wyszukanie sekwencji abc, występującej jeden lub więcej razy. Za do- pasowany zostanie więc uznany ciąg abc, jak również ciąg abcabc. Jeszcze bardziej użyteczną funkcją znaków nawiasu jest zdolność „przechwytywania” wyniku. Gdy ciąg zostanie dopasowany do wzorca, często zachodzi konieczność za- pamiętania jego treści, by można ją było wykorzystać w dalszych operacjach. Takie póź- niejsze wykorzystanie nazywa się odwołaniem wstecznym. Może na przykład wystąpić konieczność wyszukania pliku .gif (podobnie jak we wcze- śniejszym przykładzie), ale w sposób, który pozwoli na określenie, jaka w rzeczywi- stości była nazwa dopasowanego pliku. Dzięki zastosowaniu znaków nawiasu prze- chwycona nazwa może zostać wykorzystana w późniejszych operacjach przetwarzania. (.*.gif)$ W przypadku dopasowania treści do wzorca, przechwycona wartość zostanie zapisana w specjalnej zmiennej $1 (w niektórych przypadkach nazwą zmiennej może być %12). Jeżeli w wyrażeniu zostało zdefiniowanych więcej nawiasów, druga wartość zostanie przechwycona w zmiennej $2, trzecia w $3 itd. Ostatnią z możliwych do wykorzystania zmiennych jest $9. Ograniczenie wynika z faktu, że zmienna $10 byłaby niejednoznacz- na. Mogłaby odpowiadać zmiennej $1, po której występuje rzeczywisty znak zera (0) lub zmiennej $10. Zamiast wprowadzać dodatkowe symbole specjalne wyróżniające po- szczególne przypadki, programiści modułu mod_rewrite zdecydowali się na ogranicze- nie zmiennych odwołania wstecznego do $9. 2 W regułach RewriteRule zmienne są poprzedzane znakiem dolara ($), natomiast w regułach RewriteCond są zapisywane za znakiem wartości procentowej (%). Więcej informacji na temat dyrektyw RewriteRule i RewriteCond znajduje się w rozdziałach 4. i 5.
  • 12. Rozdział 2. ♦ Wyrażenia regularne 29 Praktyczny sposób wykorzystania tej opcji zostanie przedstawiony w rozdziale 3., doty- czącym dyrektywy RewriteRule. Analizując ponownie przykład opisujący dopasowanie zachłanne i niezachłanne, warto rozważyć dwa następujące wzorce, zastosowane w odniesieniu do ciągu gramatyka. g(.*)a g(.*?)a Pierwszy wzorzec zwróci w zmiennej $1 wartość ramatyk, natomiast drugi spowoduje zapisanie w zmiennej $1 wartości r. Gdy wyrażenie jest analizowane w trybie zachłan- nym, dopasowuje jak najwięcej znaków i zatrzymuje swoje działanie po odczytaniu ostatniego znaku a. W trybie niezachłannym zadanie zostanie zrealizowane po odczyta- niu najmniejszej wystarczającej liczby znaków, czyli po odczytaniu pierwszej litery a. Aby mieć pewność, w jaki sposób będą dopasowywane do wzorców poszczególne fragmenty ciągów, warto wykorzystać takie narzędzia programowe, jak np. Regex Coach. Szczegółowy opis odwołań wstecznych, zachłannego dopasowywania i procesów za- chodzących w trakcie dopasowywania został zamieszczony w książce pt. Wyrażenia regularne (Helion, 2001). Dopasowanie jednego znaku ze zbioru ([ ]) Znaki klasy ([]) umożliwiają definiowanie zbioru znaków, z których każdy spełnia kryteria dopasowania. Wyrażenia regularne udostępniają kilka wbudowanych klas zna- ków (definiowanych na przykład za pomocą symbolu specjalnego s, prezentowanego wcześniej), ale pozwalają również na wyznaczanie własnych klas. Oto bardzo prosty przykład opisywanego mechanizmu: [abc] Zdefiniowana klasa znaków odpowiada za dopasowanie litery a, b lub c. Na przykład, gdyby było konieczne ustalenie podzbioru użytkowników, których nazwy rozpoczy- nają się od jednej z wymienionych liter, można by zastosować następujący wzorzec dopasowania: /home/([abc].*) Wzorzec ten zawiera kilka znaków, które zostały wcześniej opisane. Jego zadanie polega na dopasowaniu porównywanego ciągu do ścieżek dostępu do katalogów pewnego podzbioru użytkowników i zapisaniu nazw poszczególnych użytkowników w zmien- nej $1. Choć, jak się za chwilę okaże, nie do końca jest to prawda. W definicji klasy znaków można również dość łatwo wyznaczać zakres akceptowa- nych wartości. Na przykład, gdyby było konieczne dopasowanie wartości liczbowych z przedziału od 1 do 5, należałoby zastosować definicję klasy o treści [1-5].
  • 13. 30 mod_rewrite. Podręcznik administratora Jeżeli w definicji klasy znaków jako pierwszy występuje symbol ^, otrzymuje on spe- cjalne znaczenie. Klasa wyznaczona za pomocą ciągu [^abc] jest przeciwieństwem klasy [abc]. Odpowiada więc każdemu znakowi, który nie jest znakiem a, b lub c. W tym miejscu warto powrócić do wcześniejszego przykładu — próby dopasowania nazw użytkowników rozpoczynających się od liter a, b i c. Problem w tym, że w pre- zentowanym rozwiązaniu znak * ma charakter zachłanny, czyli dopasowuje możliwie najwięcej znaków. Aby zatrzymać dopasowywanie po odczytaniu znaku ukośnika, konieczne byłoby zdefiniowanie wzorca, który akceptowałby wszystkie znaki oprócz znaku ukośnika. /home/([abc][^/]+) Sekwencja .* została zastąpiona wyrażeniem [^/]+, które w praktyce oznacza dopa- sowanie dowolnych znaków poprzedzających znak ukośnika lub koniec ciągu teksto- wego (zależnie od tego, co będzie pierwsze). Dodatkowo zamiast symbolu * został użyty symbol + — nazwa użytkownika składająca się z jednego znaku zazwyczaj nie jest akceptowana. Po tej operacji w zmiennej $1 jest zapisana nazwa użytkownika, a nie nazwa użytkownika i ewentualne elementy ścieżki dostępu do innego katalogu (wystę- pujące za nazwą). Negacja (!) Jeżeli zachodzi konieczność zanegowania całego wyrażenia regularnego, wystarczy po- przedzić je znakiem !. Rozwiązanie to nie jest uniwersalne dla wszystkich implementa- cji wyrażeń regularnych, ale może być wykorzystywane w znacznej większości z nich. W przypadku reguł przepisywania bardzo często jest ono stosowane do zaznaczenia, że dany wzorzec odnosi się do wszystkich katalogów, oprócz jednego. Zatem aby wyłą- czyć ze zbioru przetwarzanych katalogów katalog /obrazy, należy wyznaczyć wyrażenie dopasowania do katalogu /obrazy, a następnie je zanegować. !^/obrazy Taka definicja pozwala na zaakceptowanie wszystkich ścieżek dostępu, które nie roz- poczynają się od ciągu /obrazy. Więcej podobnych przykładów znajduje się w dalszej części książki, a szczególnie w rozdziale 11. Przykłady wyrażeń regularnych W zrozumieniu zasad działania wyrażeń regularnych pomocnych może być kilka przy- kładów. Opis poszczególnych wyrażeń regularnych rozpoczyna się od często spoty- kanych przypadków, które zostały uzupełnione o pewne rozwiązania alternatywne.
  • 14. Rozdział 2. ♦ Wyrażenia regularne 31 Adresy poczty elektronicznej Prezentację przykładów rozpoczyna wyrażenie rozwiązujące często występujący pro- blem — przygotowanie wzorca, który pozwoli na sprawdzenie adresu poczty elektro- nicznej3. Ogólna składnia adresu e-mail to: coś@coś.coś. Przygotowując wyrażenie regularne od podstaw, warto zawsze opisać sobie wzorzec właśnie w takiej formie, gdyż jest to dobry punkt wyjścia do prac nad samą treścią wyrażenia. Aby opisać adres e-mail za pomocą wyrażenia regularnego, trzeba przeanalizować jego poszczególne elementy składowe. Fragmenty zapisane jako coś można łatwo wyrazić za pomocą sekwencji .+. Natomiast fragment @ jest rzeczywistym znakiem, występującym w treści adresu. Uzyskujemy więc wzorzec o następującej treści: .+@.+..+ Jest to dobry punkt wyjściowy, odpowiadający większości adresów poczty elektronicz- nej; prawdopodobnie nawet wszystkim. Jednak za dopasowane zostaną uznane rów- nież inne ciągi, które nie są adresami e-mail (np. @@@.@ czy @.com). Trzeba się więc zastanowić nad bardziej szczegółową weryfikacją. W pierwszej kolejności należałoby się upewnić, że ciąg występujący przed znakiem @ nie jest pusty i składa się ze znaków określonego rodzaju. Powinny to być znaki alfanume- ryczne i niektóre znaki specjalne (takie jak znaki kropki, podkreślenia czy myślnika). Na szczęście wyrażenia zgodne ze standardem PCRE udostępniają wygodne mechani- zmy wskazywania „znaków alfanumerycznych” — za pomocą predefiniowanej klasy znaków. Istnieje klika wstępnie przygotowanych klas tego typu, między innymi [:alpha:] (dopasowanie liter), [:digit:] (dopasowanie cyfr od 0 do 9) i [:alnum:] (dopasowanie znaków alfanumerycznych). Kolejna czynność powinna polegać na wymuszeniu stosowania znaków alfanumerycz- nych w części nazwy domeny, ale z pominięciem domeny najwyższego poziomu (ostat- niego elementu nazwy domenowej), która może zawierać jedynie litery. Dawniej podczas wyznaczania wzorców można było ograniczyć tę część do trzech liter. Jednak obecnie wykorzystywane są domeny nie spełniające tego założenia. Ostatnim zadaniem jest umożliwienie wykorzystania dowolnej liczby znaków kropki w nazwie serwera, tak aby zarówno ciąg a.com, jak i poczta.wsg.byd.pl były uznawane za poprawne elementy składowe adresu e-mail. Po przekształceniu wymienionych założeń do postaci wyrażenia otrzymujemy nastę- pujący ciąg: ^[[:alnum:].-_]+@[[:alnum:].]+.[:alpha:]+$ 3 Nie jest to wzorzec występujący szczególnie często w dyrektywach modułu mod_rewrite, lecz w definicjach wyrażeń regularnych jako takich. Adresy poczty elektronicznej rzadko występują w ciągach URL, dlatego sporadycznie są opisywane przez dyrektywy mod_rewrite.
  • 15. 32 mod_rewrite. Podręcznik administratora Taka definicja jest z pewnością bardziej szczegółowa i zapewni poprawną weryfikację adresu poczty elektronicznej. Oczywiście nadal istnieje możliwość dopasowania ciągu nie odpowiadającego adresowi e-mail, ale prawdopodobieństwo takiego zdarzenia jest niewielkie. Numer telefoniczny Kolejnym rozważanym zagadnieniem jest sprawdzenie numeru telefonicznego. Zdefi- niowanie wzorca jest znacznie trudniejsze, niż można by sądzić na początku. Aby ułatwić sobie zadanie, ograniczymy się jedynie do numerów stosowanych w Polsce, składają- cych się z dziesięciu cyfr. Numer telefoniczny stanowią trzy cyfry numeru kierunkowego i siedem cyfr abonenta. Cyfry te mogą, ale nie muszą, być rozdzielane za pomocą różnych znaków. Pierwsze trzy z nich są niekiedy otoczone znakami nawiasu. Rozwiązaniem może być nastę- pujący wzorzec: (?d{3})?[- ]?d{3}[- ]?d{2}[- ]?d{2} Odpowiada on większości polskich numerów telefonicznych, zapisywanych w typo- wych formatach. Trzy pierwsze cyfry mogą, ale nie muszą, być umieszczone w na- wiasie, a bloki trzech, dwóch i dwóch kolejnych cyfr mogą być rozdzielane za pomocą spacji lub znaków myślnika, bądź pozostać nie rozdzielone w ogóle. Zaproponowane rozwiązanie jest dalekie od doskonałości, ponieważ użytkownicy znajdą sposób na wprowadzenie danych w formacie innym niż założony. Przeanalizujmy regułę symbol po symbolu. Symbol (? reprezentuje opcjonalny znak otwarcia nawiasu. Znak odwrotnego ukośnika jest niezbędny, ponieważ nawias ma szczególne znaczenie, opisane we wcześniejszej części rozdziału. W tym wyrażeniu uwzględniony jest rzeczywisty znak nawiasu, a nie symbol specjalny. Znak zapytania z kolei przekształca znak nawiasu w element opcjonalny. Oznacza to, że osoba wprowadzająca dane może, ale nie musi, zapisać trzy pierwsze cyfry w nawiasie. Każda z metod jest akceptowana. Symbol d{3} obejmuje dwa elementy, które nie były dotychczas opisywane. Sekwencja d oznacza cyfry. Ta sama definicja może być zapisana za pomocą elementu [:digit:], ale notacja d jest znacznie częściej stosowana i wymaga mniej pisania. Ciąg {3} umieszczony za ciągiem d wskazuje, że dany znak musi wystąpić trzy razy. W tym przypadku oznacza to, że konieczne jest wprowadzenie trzech cyfr. W przeciwnym razie dopasowanie zakończy się błędem. Notacja typu {n} występuje jeszcze w dwóch formach składniowych, zależnych od liczby powtórzeń znaków. Wspomniane formy zapisu zostały zestawione w tabeli 2.2.
  • 16. Rozdział 2. ♦ Wyrażenia regularne 33 Tabela 2.2. Składnia wzorca powtórzenia {n,m} Składnia Znaczenie {n} Znak musi zostać wymieniony dokładnie n razy. {n,} Znak musi zostać wymieniony n razy, ale dopuszczalne są kolejne powtórzenia. {n,m} Znak musi zostać wymieniony przynajmniej n razy, ale nie więcej niż m razy. Symbol )? oznacza opcjonalny znak zamknięcia nawiasu — analogicznie do znaku otwierającego nawias. Sekwencja [- ]? definiuje kolejny znak opcjonalny. Jest to znak myślnika lub spacji (bądź jego brak), rozdzielający pierwsze trzy cyfry od kolejnych trzech cyfr. Pozostała część wyrażenia zawiera opisane już elementy. Jedyna różnica polega na licz- bie cyfr, które są wymagane w poszczególnych blokach. Kolejnym etapem przygotowywania wyrażenia regularnego powinno być opracowa- nie sposobów „obejścia” zabezpieczenia i ustalenie, czy obsługa tych skrajnych przy- padków jest warta dodatkowej pracy. Na przykład niektórzy użytkownicy będą po- przedzali numer znakami +48. W niektórych numerach dopisywane będą na końcu numery wewnętrzne. Z pewnością również znajdzie się osoba, która będzie chciała rozdzielać bloki cyfr za pomocą innego znaku niż zdefiniowane. Problem oczywiście można rozwiązać za pomocą bardziej złożonego wyrażenia regularnego. Jednak wzrost złożoności wiąże się z obniżeniem szybkości działania i zmniejszeniem czytelności dyrektywy. Opis przedstawionego wyrażenia zajął całą stronę, co najlepiej oddaje pro- blem czasu, który będzie potrzebny na rozszyfrowanie wyrażenia przy ponownej jego analizie po kilku miesiącach od utworzenia (gdy jego autor zapomni już, do czego ono służyło). Dopasowanie ciągów URI Ponieważ książka ta jest poświęcona modułowi mod_rewrite, warto przeanalizować kilka przykładów dopasowania ciągów URI, gdyż to one będą podstawą wszelkich działań opisywanych w dalszej części publikacji. Większość dyrektyw, wymienionych w pozostałej części książki, wymaga podania wy- rażenia regularnego jako jednego z parametrów. W większości przypadków wyrażenia te będą opisywały ciąg URI, który jest techniczną nazwą dla zasobu wymienionego w żądaniu, przekazanym do serwera. Zazwyczaj odpowiada on treści zamieszczonej po adresie http://www.domena.pl. W kolejnych punktach zostaną opisane typowe przykłady wartości, które podlegają dopasowaniu za pomocą wyrażeń regularnych.
  • 17. 34 mod_rewrite. Podręcznik administratora Dopasowanie strony głównej Niekiedy zachodzi konieczność dopasowania strony głównej danej witryny. Zazwyczaj właściwym dla tego przypadku adresem URI jest ciąg pusty, ciąg złożony ze znaku / lub z nazwy strony indeksu (np. /index.html lub /index.php). Pusty ciąg URI wystę- puje wówczas, gdy zapisany w żądaniu adres nie zawiera końcowego znaku ukośnika (np. http://www.przyklad.pl). W pierwszej kolejności rozważmy przypadek, w którym przesłane przez użytkownika żądanie zawiera adres http://www.przyklad.pl lub http://www.przyklad.pl/ (tj. ciąg ad- resu z końcowym znakiem ukośnika lub bez niego, ale bez określonego pliku strony). Celem wyrażenia jest więc dopasowanie opcjonalnego znaku ukośnika. Zgodnie z informacjami przedstawionymi wcześniej, znaki opcjonalne są wyznaczane za pomocą symbolu ?. Zatem wyrażenie powinno mieć postać: ^/?$ Odpowiada ono za dopasowanie ciągów tekstowych, które rozpoczynają się opcjo- nalnym znakiem ukośnika i nim kończą. Innymi słowy, akceptuje jedynie ciągi tek- stowe, które rozpoczynają się i kończą znakiem ukośnika lub rozpoczynają się i kończą „niczym”. W kolejnym kroku wyrażenie powinno zostać uzupełnione o bardziej złożone nazwy plików. Za dopasowane powinny być uznawane cztery następujące ciągi tekstowe: Pusty ciąg (gdy użytkownik zapisze adres http://www.przyklad.pl bez końcowego ukośnika). Ciąg / (gdy użytkownik zapisze adres http://www.przyklad.pl/ z końcowym ukośnikiem). Ciąg /index.html. Ciąg /index.php. Podstawą dla wyrażenia będzie reguła opracowana poprzednio. ^/?(index.(html|php))?$ Nie jest to całkiem poprawna postać (o czym się będzie można przekonać, czytając dalszą część rozdziału), ale jest bliska ideałowi. Zawiera natomiast element, który nie był dotychczas opisywany — symbol |, reprezentujący alternatywę, czyli możliwość wyboru jednej lub drugiej opcji. W przypadku ciągu (html|php) oznacza to spełnienie kryteriów dla rozszerzenia html lub php. Wyrażenie definiuje więc ciąg tekstowy, który rozpoczyna się od opcjonalnego znaku ukośnika, po którym występuje ciąg index., a za nim ciąg html lub php. Cały ciąg (po- cząwszy od słowa index) jest opcjonalny, a po nim nie występuje żadna wartość.
  • 18. Rozdział 2. ♦ Wyrażenia regularne 35 Jedyna wada wyrażenia polega na tym, że uznaje za dopasowane również ciągi index.php i index.html pozbawione poprzedzających je znaków ukośnika. Choć jest to sytuacja niedozwolona w tym kontekście wykorzystania ciągu URI, w praktyce nie powinna być powodem szczególnego zmartwienia. Mimo że użytkownik mógłby przesłać żą- danie w jednej z opisanych postaci, można przyjąć, że w najprawdopodobniej tego nie zrobi, a nawet gdyby tak uczynił, to nic się nie stanie, jeżeli żądanie zostanie potrak- towane w taki sam sposób, jakby zawierało poprawną wartość URI. Dopasowanie katalogu Gdyby koniczne było ustalenie, jaki katalog został zapisany w ciągu URI lub jakim słowem kluczowym się rozpoczyna, trzeba byłoby wyodrębnić całą treść, występującą przed pierwszym znakiem ukośnika. Wyrażenie miałoby wówczas następującą postać: ^/([^/]+) Składa się ono z kilku elementów. Pierwszym jest standardowy, często stosowany, symbol ^/, oznaczający „rozpoczęcie od znaku ukośnika”. Kolejny wyznacza klasę znaków [^/], która odpowiada za dopasowanie wszystkich znaków oprócz ukośnika. Symbol + oznacza natomiast, że liczba tych znaków powinna wynosić jeden lub wię- cej. Z kolei nawias zapewnia zapisanie wartości w zmiennej $1 do późniejszego wy- korzystania. Dopasowanie rozszerzenia pliku Trzecim z prezentowanych przykładów jest rozwiązanie umożliwiające dopasowanie plików o określonym rozszerzeniu — również bardzo często wykorzystywane. Za- łóżmy, że celem wzorca jest wyodrębnienie plików graficznych. Wyrażenie regularne przedstawione poniżej znajduje zastosowanie w odniesieniu do większości najczęściej wykorzystywanych rodzajów plików graficznych: .(jpg|gif|png)$ W dalszej części książki zostaną również przedstawione sposoby ignorowania wielkości znaków, co umożliwi dopasowywanie również rozszerzeń zapisanych wielkimi literami. Narzędzia wspomagające pracę z wyrażeniami regularnymi Osoby, które zajmują się wyrażeniami regularnymi przez dłuższy czas, prędzej czy później sięgają po narzędzia programowe, zapewniające wsparcie i wizualizację reali- zowanych procesów. Programów wspomagających pracę jest wiele, a każdy z nich ma pewne wady i zalety. Nie ulega wątpliwości, że większość najbardziej użytecznych aplikacji opracowywania wyrażeń regularnych jest dostarczanych przez programistów skupionych wokół projektu Perl. Wynika to z faktu, że wyrażenia regularne są szcze- gólnie często stosowane w języku Perl i występują w niemal każdym programie.
  • 19. 36 mod_rewrite. Podręcznik administratora Aplikacja Regex Coach Jedną z wartych polecenia aplikacji jest Regex Coach. Program ten jest dostępny za- równo dla platformy Linux, jak i Windows, i można go pobrać ze strony http:// www.weitz.de/regex-coach/. Umożliwia on krokowe wykonanie wyrażenia regularnego i przeglądanie dopasowanych fragmentów ciągu. Funkcja ta jest niezwykle użyteczna, gdy użytkownik uczy się projektować własne wyrażenia. Podsumowanie Zapoznanie się z podstawowymi informacjami na temat wyrażeń regularnych jest niezbędne przed przystąpieniem do pracy z modułem mod_rewrite. Zbyt często admi- nistratorzy starają się opracowywać wyrażenia stosując metody siłowe — wprowa- dzają różne kombinacje parametrów do chwili, gdy opracowany wzorzec wydaje się spełniać swoje zadanie. Rezultatem takich działań są nieefektywne i niestabilne wyra- żenia, których przygotowanie zabiera wiele czasu i wywołuje frustracje. Warto włożyć zakładkę w tę część książki i wracać do lektury rozdziału za każdym razem, gdy konieczne będzie ustalenie, jakie funkcje realizuje dane wyrażenie. Do innych źródeł informacji, wartych polecenia, można zaliczyć dokumentację wyra- żeń regularnych języka Perl, dostępną pod adresem http://perldoc.perl.org/perlre.html) i po wpisaniu polecenia perldoc perlre, a także dokumentację PCRE, która jest do- stępna pod adresem http://pcre.org/pcre.txt.