Spis treści Wprowadzenie ...................................................................................................................17
Część I. Internet Information Services (IIS) 1 Konfiguracja środowiska roboczego .................................................................................25 Uruchamianie IIS ................................................................................................................................26 Instalowanie IIS przy użyciu Menedżera serwera .............................................................................26 Instalowanie IIS z poziomu wiersza poleceń .....................................................................................27
Uruchamianie PHP ............................................................................................................................28 Instalowanie PHP ..................................................................................................................................28 Dostępne moduły PHP .........................................................................................................................29
Konfigurowanie PHP w IIS ...............................................................................................................30 Konfigurowanie PHP przy użyciu Menedżera internetowych usług informacyjnych ................30 Konfigurowanie PHP w wierszu poleceń ...........................................................................................33
Konfigurowanie przy użyciu Instalatora platformy sieci Web ....................................................33 Uruchamianie Web PI ..........................................................................................................................34 Uruchamianie IIS i PHP .......................................................................................................................34 Sprawdzanie konfiguracji PHP ............................................................................................................35
Kopia zapasowa konfiguracji ............................................................................................................35 Pierwsza przykładowa aplikacja .......................................................................................................36 Zdalny dostęp ......................................................................................................................................38 Podsumowanie ....................................................................................................................................39
2 Architektura IIS .................................................................................................................41 Witryny ................................................................................................................................................42 Uruchamianie nowej witryny ..............................................................................................................42 Definiowanie dodatkowych powiązań ...............................................................................................46 Zarządzanie witryną WWW ................................................................................................................47
Aplikacje ..............................................................................................................................................48 Ścieżki i foldery ......................................................................................................................................49 Definiowanie nowej aplikacji ...............................................................................................................50 Zmiana ustawień aplikacji ....................................................................................................................51
Katalogi wirtualne ...............................................................................................................................51 Definiowanie katalogu wirtualnego w Menedżerze IIS ...................................................................52 Definiowanie katalogu wirtualnego w wierszu poleceń ...................................................................52
4 Spis treści
Przetwarzanie żądań HTTP ..............................................................................................................53 Ogólny opis przetwarzania żądań HTTP ...........................................................................................53 Przebieg procesu aplikacji ....................................................................................................................54
Moduły .................................................................................................................................................55 Pule aplikacji ........................................................................................................................................56 Tworzenie pul aplikacji w Menedżerze IIS ........................................................................................56 Tworzenie pul aplikacji w wierszu poleceń .......................................................................................57 Tożsamość puli aplikacji .......................................................................................................................57
FastCGI ................................................................................................................................................59 FastCGI a CGI ........................................................................................................................................59 FastCGI a ISAPI .....................................................................................................................................61
Podsumowanie ....................................................................................................................................61
3 Konfigurowanie serwera IIS .............................................................................................63 Pliki konfiguracyjne ...........................................................................................................................64 Konfiguracja globalna ...........................................................................................................................64 Konfiguracja rozproszona ....................................................................................................................64
Struktura konfiguracji ........................................................................................................................65 Sekcje i grupy sekcji ...............................................................................................................................66 Elementy i listy konfiguracji ................................................................................................................66 Przenoszenie i dołączanie sekcji ..........................................................................................................67 Edytor konfiguracji ...............................................................................................................................67
Schemat i configSections ...................................................................................................................69 Konfigurowanie ścieżek za pomocą elementów location .............................................................69 Konfiguracja w Menedżerze IIS ..........................................................................................................70 Konfiguracja w wierszu poleceń ..........................................................................................................71
Witryny, aplikacje i katalogi ..............................................................................................................71 Witryny ...................................................................................................................................................72 Powiązania ..............................................................................................................................................74 Aplikacje .................................................................................................................................................74 Katalogi wirtualne .................................................................................................................................75
Blokowanie konfiguracji ....................................................................................................................75 Blokowanie przy użyciu configSections .............................................................................................76 Blokowanie i odblokowywanie przy użyciu location .......................................................................76 Określanie praw dla pojedynczych ustawień .....................................................................................78 Blokowanie i odblokowywanie w Menedżerze IIS ...........................................................................80
Podsumowanie ....................................................................................................................................82
4 Konfigurowanie PHP ..........................................................................................................83 Instalowanie PHP Managera .............................................................................................................83 Konfigurowanie PHP .........................................................................................................................85 Rozpoznawanie zmian w konfiguracji ................................................................................................85 Ustawienia konfiguracyjne dla ścieżek i komputerów w pliku php.ini .........................................87 Konfigurowanie w pliku .user.ini ........................................................................................................88
Spis treści 5
Wskazywanie domyślnego dokumentu ...........................................................................................91 Wskazywanie dokumentu domyślnego w Menedżerze IIS .............................................................92 Wskazywanie dokumentu domyślnego w wierszu poleceń ............................................................92 Wskazywanie dokumentu domyślnego bezpośrednio w konfiguracji ..........................................93
Ograniczenia żądań ............................................................................................................................93 Konfigurowanie w Menedżerze IIS .....................................................................................................94 Konfigurowanie w wierszu poleceń ....................................................................................................95 Konfigurowanie bezpośrednio w pliku konfiguracyjnym ...............................................................95
Czasowe ograniczenia przetwarzania żądań ...................................................................................96 Ograniczenia PHP .................................................................................................................................96 Ograniczenia FastCGI ...........................................................................................................................97
Przechowywanie sesji i pliki tymczasowe ........................................................................................98 Włączanie wyróżniania składni PHP ...............................................................................................98 Konfigurowanie wyróżniania składni PHP w Menedżerze IIS ......................................................99 Konfigurowanie w wierszu poleceń ..................................................................................................100
Ustawianie różnych wersji PHP .....................................................................................................101 Instalowanie nowej wersji języka PHP .............................................................................................101 Instalowanie w PHP Managerze ........................................................................................................101 Konfigurowanie przypisania uchwytu .............................................................................................102 Konfigurowanie aplikacji FastCGI ....................................................................................................103
Ustawianie różnych konfiguracji PHP ..........................................................................................105 Podsumowanie ..................................................................................................................................106
5 Bezpieczeństwo ...............................................................................................................107 Nadawanie struktury aplikacji ........................................................................................................107 Folder główny lub katalog wirtualny ................................................................................................108 Wskazywanie plików wykonywalnych .............................................................................................110
Konfiguracja PHP .............................................................................................................................111 Uwierzytelnianie użytkownika .......................................................................................................114 Instalowanie wymaganych usług ról .................................................................................................114 Ustawianie metody uwierzytelniania użytkowników w Menedżerze IIS ....................................115 Ustawianie metody uwierzytelniania w wierszu poleceń ..............................................................116 Uwierzytelnianie systemu Windows i nazwy komputerów ..........................................................116 Uzyskiwanie danych uwierzytelniania w PHP ................................................................................117
Tożsamość i prawa dostępu ............................................................................................................117 Tożsamość puli aplikacji .....................................................................................................................118 Informacje o ścieżce logowania .........................................................................................................118 Definiowanie tożsamości anonimowego użytkownika ..................................................................119 Zabezpieczanie aplikacji PHP ............................................................................................................119
Reguły autoryzacji ............................................................................................................................120 Instalowanie wymaganych usług ról .................................................................................................120 Definiowanie reguł w Menedżerze IIS .............................................................................................121 Definiowanie reguł w wierszu poleceń .............................................................................................122
6 Spis treści
Filtrowanie żądań .............................................................................................................................122 Definiowanie ustawień ogólnych ......................................................................................................123 Filtrowanie rozszerzeń nazw plików .................................................................................................127 Filtrowanie na podstawie reguł .........................................................................................................128
Połączenia szyfrowane (HTTPS) ....................................................................................................130 Tworzenie kluczy i certyfikatów ........................................................................................................130 Uruchamianie szyfrowanego połączenia .........................................................................................131 Uwierzytelnianie przy użyciu certyfikatów klientów .....................................................................134
Podsumowanie ..................................................................................................................................135
6 Pamięć podręczna ...........................................................................................................137 Pamięć podręczna a sieć WWW .....................................................................................................138 Przechowywanie w pamięci podręcznej przez określony czas ......................................................138 Treści zmienne .....................................................................................................................................140 Warunki zapisywania w pamięci podręcznej ..................................................................................142 Definiowanie nagłówków na serwerze IIS .......................................................................................143
Buforowanie danych wyjściowych .................................................................................................146 Konfigurowanie przy użyciu Menedżera IIS ...................................................................................146 Konfigurowanie w wierszu poleceń ..................................................................................................148 Elementy konfiguracji .........................................................................................................................149
Rozszerzenie WinCache dla PHP ...................................................................................................150 Uruchamianie rozszerzenia WinCache ............................................................................................150 Bufor kodu operacji i bufor plików ...................................................................................................152 Uchwyt sesji ..........................................................................................................................................153 Pamięć podręczna dla użytkownika ..................................................................................................154
Podsumowanie ..................................................................................................................................156
7 Ponowne zapisywanie adresów URL ..............................................................................157 Uruchamianie mechanizmu ponownego zapisywania adresów URL .......................................158 Ręczna instalacja modułu URL Rewrite ...........................................................................................158 Instalacja modułu URL Rewrite przy użyciu Web PI ....................................................................158
Zmienne predefiniowane .................................................................................................................158 Zmienne Common Gateway Interface .............................................................................................159 Zmienne IIS i PHP ..............................................................................................................................160 Przykładowy skrypt PHP ....................................................................................................................162
Przetwarzanie reguł ..........................................................................................................................164 Typy akcji ..............................................................................................................................................164 Hierarchia i ścieżki adresów URL .....................................................................................................164 Czas przetwarzania ..............................................................................................................................165
Definiowanie reguł ...........................................................................................................................166 Definiowanie reguł przekierowania ..................................................................................................166 Definiowanie reguł ponownego zapisywania ..................................................................................169
Spis treści 7 Inne typy akcji ......................................................................................................................................171 Definiowanie reguł na podstawie szablonów ..................................................................................172
Mapy ponownego zapisywania .......................................................................................................174 Tworzenie mapy ponownego zapisywania ......................................................................................174 Tworzenie reguły skojarzonej ............................................................................................................176
Szczegółowe zasady działania reguł ...............................................................................................176 Wzorce ..................................................................................................................................................176 Warunki ................................................................................................................................................180 Akcje ......................................................................................................................................................182 Ustawianie zmiennych serwera i nagłówków protokołu HTTP ..................................................183 Reguły wychodzące .............................................................................................................................184 Tworzenie reguły wychodzącej ..........................................................................................................186
Konfiguracja XML ............................................................................................................................187 URL Rewrite .........................................................................................................................................187 Dostępne zmienne serwera ................................................................................................................188 Reguły ....................................................................................................................................................188 Warunki ................................................................................................................................................190 Zmienne serwera i nagłówki HTTP ..................................................................................................190 Akcje ......................................................................................................................................................190 Mapy ponownego zapisywania ..........................................................................................................191 Reguły wychodzące .............................................................................................................................191 Pojedyncza reguła wychodząca .........................................................................................................193
Przykłady ...........................................................................................................................................193 Adresy URL przyjazne dla użytkowników .......................................................................................195 Kanoniczna nazwa komputera ..........................................................................................................195 Strony w różnych językach .................................................................................................................196 Kanoniczne nazwy katalogów użytkownika ....................................................................................197 Zapobieganie osadzaniu grafik na obcych witrynach ....................................................................198 Przekierowywanie do HTTPS ............................................................................................................199 Dodawanie informacji na każdej stronie .........................................................................................200
Konwersje z modułu mod_rewrite serwera Apache ....................................................................200 Podsumowanie ..................................................................................................................................202
8 Komunikaty o błędach i wyszukiwanie błędów ..............................................................203 Szczegółowe komunikaty o błędach ...............................................................................................203 Wyłączanie przyjaznych komunikatów o błędach w Internet Explorerze ..................................204 Włączanie wyświetlania szczegółowych komunikatów o błędach ...............................................205 Zwracanie błędów PHP ......................................................................................................................206
Śledzenie .............................................................................................................................................207 Instalacja usługi roli śledzenia ...........................................................................................................208 Włączanie śledzenia ............................................................................................................................208 Konfigurowanie reguł zapisywania w dzienniku zdarzeń .............................................................209 Wpisy śledzenia ...................................................................................................................................210
8 Spis treści
Komunikaty o błędach .....................................................................................................................211 Zapisywanie w standardowym strumieniu błędów STDERR .......................................................211 Komunikaty PHP w śladzie ................................................................................................................212 FastCGI i STDERR ..............................................................................................................................212
Ustalanie przyczyn problemów na serwerze .................................................................................214 Nie można znaleźć serwera ................................................................................................................214 Skrypty PHP nie są wykonywane ......................................................................................................215
Podsumowanie ..................................................................................................................................216
Część II. SQL Server 9 Konfiguracja SQL Servera ................................................................................................219 Instalowanie SQL Servera ................................................................................................................220 Konfigurowanie SQL Servera ............................................................................................................220 Instalacja SQL Servera w wersji Express ..........................................................................................223 Instalowanie rozszerzenia SQL Server języka PHP ........................................................................226 Instalacja za pomocą Web PI .............................................................................................................228
Narzędzia SQL Servera .....................................................................................................................228 SQL Server Management Studio .......................................................................................................228 Program wiersza poleceń sqlcmd ......................................................................................................230 Wsadowe przetwarzanie poleceń T-SQL .........................................................................................230
Konfigurowanie zdalnego dostępu .................................................................................................230 Włączenie protokołu TCP/IP ............................................................................................................231 Włączenie dostępu na zaporze sieciowej systemu Windows ........................................................232
Instalowanie przykładowej bazy danych .......................................................................................233 Migracja baz danych serwera MySQL ...........................................................................................235 Instalowanie narzędzia Migration Assistant ...................................................................................235 Migracja bazy danych MySQL ...........................................................................................................236
Podsumowanie ..................................................................................................................................238
10 Bazy danych i tabele ........................................................................................................239 Bazy danych .......................................................................................................................................239 Systemowe bazy danych .....................................................................................................................240 Struktura bazy danych ........................................................................................................................240 Tworzenie bazy danych ......................................................................................................................241 Usuwanie bazy danych .......................................................................................................................244 Tworzenie migawki .............................................................................................................................245
Typy danych ......................................................................................................................................247 Liczbowe typy danych .........................................................................................................................248 Ciągi znaków i dane binarne ..............................................................................................................249 Daty i godziny ......................................................................................................................................250 Inne typy danych .................................................................................................................................251
Spis treści 9
Schematy i nazwy obiektów ............................................................................................................251 Nazwy obiektów ...................................................................................................................................252 Tworzenie schematów ........................................................................................................................252 Usuwanie schematów ..........................................................................................................................253
Tabele .................................................................................................................................................253 Tworzenie tabel ....................................................................................................................................253 Usuwanie tabel .....................................................................................................................................256
Klucze i indeksy ................................................................................................................................256 Klucze główne ......................................................................................................................................257 Klucze obce ...........................................................................................................................................259 Definiowanie kluczy obcych ..............................................................................................................260 Indeksy ..................................................................................................................................................262
Podsumowanie ..................................................................................................................................265
11 Praca z SQL Serverem .....................................................................................................267 Wykonywanie zapytań o dane (SELECT) .....................................................................................267 Proste wyrażenia SELECT ..................................................................................................................268 Ograniczanie wyników zapytań za pomocą klauzuli WHERE .....................................................268 Grupowanie wyników zapytania (GROUP BY, HAVING) ..........................................................269 Sortowanie (ORDER BY) ...................................................................................................................270 Zapytania na więcej niż jednej tabeli ................................................................................................271 Standardowe wyrażenia tabelowe (WITH) .....................................................................................275 Stronicowanie danych .........................................................................................................................277
Manipulowanie danymi ...................................................................................................................279 Polecenie INSERT ...............................................................................................................................279 Polecenie UPDATE .............................................................................................................................282 Polecenie DELETE ..............................................................................................................................285
Wykonywanie zapytań o metadane ...............................................................................................288 Lista baz danych ...................................................................................................................................288 Lista tabel ..............................................................................................................................................289 Odczytywanie informacji o tabelach ................................................................................................289 Lista kolumn w tabeli ..........................................................................................................................290 Lista ograniczeń ...................................................................................................................................290 Lista kluczy i indeksów .......................................................................................................................291
Podsumowanie ..................................................................................................................................291
12 PHP i SQL Server .............................................................................................................293 Podejście i proces ..............................................................................................................................293 Przygotowania ......................................................................................................................................293 Przykładowy program .........................................................................................................................294 Analiza kolejnych kroków ..................................................................................................................296 Skrypt pomocniczy ..............................................................................................................................298
10 Spis treści
Połączenia z bazami danych ............................................................................................................299 Nazwy serwera .....................................................................................................................................299 Uwierzytelnianie ..................................................................................................................................300 Tworzenie pul połączeń ......................................................................................................................302 Dodatkowe opcje połączeń ................................................................................................................304
Zapytania do baz danych .................................................................................................................304 Parametryzowanie poleceń ................................................................................................................305 Pobieranie wyników ............................................................................................................................310 Polecenia predefiniowane ..................................................................................................................313
Typy danych ......................................................................................................................................317 Przekształcanie danych PHP do SQL Servera .................................................................................317 Przekształcanie danych SQL Servera do PHP .................................................................................318 Strumienie ............................................................................................................................................319 Obiekty PDO i SQL Server .................................................................................................................323 Cykl komunikacji obiektów PDO z bazą danych ...........................................................................323 Łączenie z SQL Serverem ...................................................................................................................324 Zapytania bezpośrednie i polecenia predefiniowane .....................................................................325 Pobieranie wyników ............................................................................................................................327 Typy danych i strumienie ...................................................................................................................328
Podsumowanie ..................................................................................................................................330
13 Zaawansowane funkcje bazodanowe .............................................................................331 Wyszukiwanie pełnotekstowe .........................................................................................................331 Instalowanie modułu ..........................................................................................................................332 Wybór języka ........................................................................................................................................332 Tworzenie katalogu i indeksu w SSMS .............................................................................................333 Tworzenie katalogu i indeksu przy użyciu języka T-SQL .............................................................334 Wyszukiwanie z indeksem pełnotekstowym ...................................................................................335
Transakcje ..........................................................................................................................................338 Transakcje języka T-SQL ....................................................................................................................338 Poziomy izolacji transakcji .................................................................................................................339 Transakcje PHP ...................................................................................................................................340 Transakcje i obiekty danych PHP (PDO) ........................................................................................342
Procedury składowane .....................................................................................................................343 Zmienne ................................................................................................................................................343 Definiowanie procedur .......................................................................................................................344 Wywoływanie procedur ......................................................................................................................345 Parametry wyjściowe i wartości wynikowe ......................................................................................345 Struktury kontrolne .............................................................................................................................346 Wywołania w kodzie PHP ..................................................................................................................347 Wywoływanie procedur składowanych z PDO ...............................................................................348
Spis treści 11
Funkcje własne ..................................................................................................................................349 Funkcje skalarne ..................................................................................................................................349 Funkcje tabelowe .................................................................................................................................350
Wyzwalacze .......................................................................................................................................351 Tworzenie wyzwalacza ........................................................................................................................351 Szczegółowy opis kodu tworzącego wyzwalacz ..............................................................................352 Inicjowanie wyzwalacza ......................................................................................................................353
Podsumowanie ..................................................................................................................................353
14 Użytkownicy i uprawnienia .............................................................................................355 Role główne SQL Servera .................................................................................................................355 Role główne serwera ............................................................................................................................356 Role główne bazy danych ...................................................................................................................357
Tworzenie ról głównych SQL Servera ...........................................................................................357 Tworzenie loginów ..............................................................................................................................358 Tworzenie użytkowników ..................................................................................................................360 Tworzenie ról baz danych ..................................................................................................................363
Obiekty i uprawnienia ......................................................................................................................365 Uprawnienia .........................................................................................................................................365 Zarządzanie uprawnieniami w SSMS ...............................................................................................367 Zarządzanie uprawnieniami przy użyciu języka T-SQL ................................................................368
Procedury składowane .....................................................................................................................370 Bezpieczeństwo przez uprawnienia ..................................................................................................370 Wykonywanie jako inny użytkownik ...............................................................................................372
Podsumowanie ..................................................................................................................................373
Część III. Active Directory 15 Konfigurowanie Active Directory ....................................................................................377 Przegląd ..............................................................................................................................................377 Domeny .................................................................................................................................................378 Obiekty Active Directory ...................................................................................................................379
Instalowanie Active Directory ........................................................................................................380 Przygotowanie ......................................................................................................................................380 Instalowanie roli ..................................................................................................................................380 Instalowanie usług katalogowych ......................................................................................................382
Pierwsze kroki ...................................................................................................................................384 Usługi domenowe w usłudze Active Directory ...............................................................................384 Jednostki organizacyjne ......................................................................................................................385 Użytkownicy .........................................................................................................................................387 Grupy .....................................................................................................................................................389 Konfigurowanie członków i członkostwa ........................................................................................389
12 Spis treści
Konfigurowanie usług certyfikatów w Active Directory .............................................................391 Operacje na certyfikatach ................................................................................................................395 Wystawianie certyfikatu dla Active Directory ................................................................................395 Eksportowanie certyfikatu głównego ...............................................................................................397 Eksportowanie innych certyfikatów .................................................................................................398
Podsumowanie ..................................................................................................................................398
16 Podstawy LDAP ...............................................................................................................399 Podstawy LDAP ................................................................................................................................400 Struktura hierarchiczna ......................................................................................................................400
Klasy i dziedziczenie .........................................................................................................................401 Elementy protokołu .............................................................................................................................402
Narzędzia ...........................................................................................................................................402 LDP ........................................................................................................................................................403 Edytor ADSI .........................................................................................................................................405
Konfigurowanie rozszerzenia LDAP dla PHP ..............................................................................407 Aktywowanie rozszerzenia LDAP .....................................................................................................408 Proces komunikacji .............................................................................................................................409 Skrypt pomocniczy ..............................................................................................................................409 Tworzenie połączenia szyfrowanego ................................................................................................411
Uwierzytelnianie użytkowników ....................................................................................................412 Wyszukiwanie obiektów ..................................................................................................................413 Przykładowa aplikacja: wyszukiwanie użytkowników domeny ...................................................414 Filtry LDAP ..........................................................................................................................................415 Iterowanie po wynikach wyszukiwania ............................................................................................418
Podsumowanie ..................................................................................................................................420
17 Wyszukiwanie w Active Directory ..................................................................................421 Przeglądarka LDAP w PHP .............................................................................................................421 Główny program i interfejs użytkownika ........................................................................................422 Formatowanie obiektu LDAP ............................................................................................................425 Dane o typach i definicje wyszukiwania ..........................................................................................427 Funkcje konwersji ................................................................................................................................428
Drzewo informacji katalogu oraz konteksty nazewnictwa .........................................................429 Schemat Active Directory ................................................................................................................429 Klasy obiektów .....................................................................................................................................430 Klasy atrybutów ...................................................................................................................................433
Obiekty domeny ................................................................................................................................437 Ogólne atrybuty obiektów domeny ..................................................................................................438 Grupy .....................................................................................................................................................445 Jednostki organizacyjne ......................................................................................................................447
Spis treści 13
Konkretne przykłady wyszukiwania ..............................................................................................448 Schemat .................................................................................................................................................448 Mechanizm ANR .................................................................................................................................450 Użytkownicy .........................................................................................................................................451 Grupy .....................................................................................................................................................453
Podsumowanie ..................................................................................................................................456
18 Zapisywanie w Active Directory .....................................................................................457 Przygotowanie ...................................................................................................................................457 Prawa dostępu ......................................................................................................................................457 Rejestrowanie błędów .........................................................................................................................459 Skrypty pomocnicze ............................................................................................................................461
Zapis atrybutów ................................................................................................................................464 Dodawanie atrybutów .........................................................................................................................464 Usuwanie atrybutów ...........................................................................................................................465 Modyfikowanie atrybutów .................................................................................................................467 Kodowanie i zestawy znaków ............................................................................................................468
Praktyczne przykłady zmiany atrybutów ......................................................................................469 Odblokowanie konta ...........................................................................................................................469 Aktywowanie i dezaktywowanie konta ............................................................................................470 Członkostwo w grupie ........................................................................................................................470 Wymuszenie zmiany hasła .................................................................................................................471 Zmiana hasła ........................................................................................................................................471
Zapisywanie obiektów ......................................................................................................................472 Tworzenie nowych obiektów .............................................................................................................473 Usuwanie obiektów .............................................................................................................................474 Przenoszenie obiektów .......................................................................................................................475
Przykłady praktyczne .......................................................................................................................477 Tworzenie nowej grupy ......................................................................................................................477 Tworzenie nowego użytkownika .......................................................................................................478 Usuwanie użytkownika lub grupy .....................................................................................................480
Podsumowanie ..................................................................................................................................480
Część IV. Serwer Exchange 19 Uruchamianie serwera Exchange ...................................................................................483 Konfiguracja wymaganych usług i funkcji ....................................................................................483 Ogólne wymagania ..............................................................................................................................484 Konfigurowanie IIS .............................................................................................................................484 Konfigurowanie funkcji ......................................................................................................................485 Konfigurowanie portów współdzielonych .......................................................................................485 Instalowanie konwertera Office ........................................................................................................485 Konfigurowanie DNS ..........................................................................................................................486
14 Spis treści
Instalowanie serwera Exchange ......................................................................................................486 Konfiguracja po instalacji ................................................................................................................488 Rejestrowanie Exchange .....................................................................................................................488 Konfigurowanie certyfikatu serwera Exchange ..............................................................................488
Tworzenie skrzynki pocztowej .......................................................................................................492 Podsumowanie ..................................................................................................................................494
20 Usługi sieciowe Exchange ..............................................................................................495 Wymagane rozszerzenia PHP .........................................................................................................495 Usługa Autodiscover ........................................................................................................................496 W jaki sposób Autodiscover wyszukuje dane konfiguracyjne ......................................................496 Dane konfiguracyjne ...........................................................................................................................497 Pobieranie danych konfiguracyjnych ...............................................................................................498 Analiza danych konfiguracyjnych .....................................................................................................500 Alternatywne metody dla zapytań URL ...........................................................................................501
SOAP i WSDL ...................................................................................................................................502 Struktura WSDL ..................................................................................................................................502 EWS, WSDL i PHP ..............................................................................................................................503
Komunikaty SOAP ...........................................................................................................................504 Klasa ExchangeSoapClient .................................................................................................................505 Użycie klasy ExchangeSoapClient .....................................................................................................506
Informacja na temat kolejnych rozdziałów ...................................................................................509 Krótsze komunikaty SOAP ................................................................................................................509 Krótsze listingi PHP ............................................................................................................................509 Obiektowa alternatywa dla parametrów ..........................................................................................509
Podsumowanie ..................................................................................................................................510
21 Podstawowe usługi sieciowe poczty elektronicznej .....................................................511 Struktura, identyfikatory i widoki ..................................................................................................511 Identyfikatory i etykiety folderów .....................................................................................................512 Przeglądanie elementów .....................................................................................................................512 Wybrane właściwości elementów .....................................................................................................513 Nazwy właściwości ..............................................................................................................................513
Wyszukiwanie folderów (FindFolder) ...........................................................................................515 Wybrane właściwości ..........................................................................................................................515 Żądanie ..................................................................................................................................................515 Odpowiedź ............................................................................................................................................516
Wyświetlanie listy wiadomości (FindItem) ..................................................................................517 Ograniczanie liczby wyników (stronicowanie) ...............................................................................517 Sortowanie ............................................................................................................................................519 PHP i grupy zastępujące .....................................................................................................................519 Żądanie ..................................................................................................................................................520 Odpowiedź ............................................................................................................................................521
Spis treści 15
Wyświetlanie wiadomości (GetItem) ............................................................................................523 Włączanie trybu Exchange 2010 w nagłówku SOAP .....................................................................524 Definiowanie i filtrowanie zawartości wiadomości ........................................................................525
Żądanie oryginalnej treści MIME ...................................................................................................525 Żądanie ..................................................................................................................................................526 Odpowiedź ............................................................................................................................................526 Przykład ................................................................................................................................................528 Załączniki wiadomości (GetAttachment) ........................................................................................529
Wysyłanie wiadomości (CreateItem) ............................................................................................532 Błędy SOAP powodowane przez odwołania i akcesory .................................................................532 Żądanie ..................................................................................................................................................533 Odpowiedź ............................................................................................................................................536
Usuwanie wiadomości (DeleteItem) ..............................................................................................537 Komunikaty XML ................................................................................................................................537 PHP ........................................................................................................................................................538
Podsumowanie ..................................................................................................................................538
22 Kontakty i wyszukiwanie ................................................................................................539 Właściwości kontaktów ...................................................................................................................539 Standardowe właściwości ...................................................................................................................540 Właściwości nazwy ..............................................................................................................................541 Właściwości adresu e-mail .................................................................................................................542 Właściwości adresu .............................................................................................................................543
Modyfikowanie kontaktu (UpdateItem) .......................................................................................543 Żądanie ..................................................................................................................................................544 Żądanie XML ........................................................................................................................................544 Tworzenie żądania za pomocą PHP .................................................................................................545 Odpowiedź ............................................................................................................................................547
Wyszukiwanie określonych właściwości .......................................................................................547 Wyrażenia .............................................................................................................................................547 Wyrażenia logiczne .............................................................................................................................548 Wyrażenia porównujące .....................................................................................................................548 Dodatkowe wyrażenia .........................................................................................................................548 Przygotowanie: modyfikowanie schematu ......................................................................................549
Definiowanie wyszukiwania w żądaniu .........................................................................................550 Kompletny przykład PHP ..................................................................................................................551 Formularz wyszukiwania ....................................................................................................................551 Tworzenie parametrów wyszukiwania .............................................................................................553 Wyszukiwanie kontaktów ..................................................................................................................555
Podsumowanie ..................................................................................................................................556
16 Spis treści
23 Kalendarz i personifikacja ...............................................................................................557 Pozycje kalendarza ...........................................................................................................................557 Standardowe właściwości ...................................................................................................................558 Spotkania ..............................................................................................................................................559 Powtarzane terminy ............................................................................................................................559 Czas i strefy czasowe ...........................................................................................................................560
Tworzenie zwykłych pozycji kalendarza .......................................................................................561 Komunikat żądania .............................................................................................................................561 Komunikat odpowiedzi ......................................................................................................................561 Utworzona pozycja ..............................................................................................................................562
Spotkania ...........................................................................................................................................563 Tworzenie spotkania ...........................................................................................................................563 Tworzenie zaproszenia na spotkanie ................................................................................................568 Odpowiedź na zaproszenie na spotkanie .........................................................................................569 Anulowanie spotkania ........................................................................................................................575
Konflikty terminów ..........................................................................................................................577 Komunikat żądania .............................................................................................................................577 Komunikat odpowiedzi ......................................................................................................................578
Przeszukiwanie kalendarza ..............................................................................................................579 Komunikat żądania .............................................................................................................................579 Komunikat odpowiedzi ......................................................................................................................579 Kompletny przykład PHP ..................................................................................................................580
Personifikacja ....................................................................................................................................582 Nadawanie uprawnień personifikacji ...............................................................................................583 Personifikacja w operacjach EWS .....................................................................................................584
Dodatkowe kroki ..............................................................................................................................586 Podsumowanie ..................................................................................................................................587
Dodatki A Przykładowe skrypty i dane ............................................................................................591 Klasa HTMLPage ..............................................................................................................................591 Szablon HTML ..................................................................................................................................594 Klasa DatabaseConnection ..............................................................................................................595 Przykładowa baza danych: AdventureWorksLT2008 .................................................................596
Skorowidz ........................................................................................................................599
Wprowadzenie PHP odmienił świat. Żaden inny język programowania nie wpłynął tak istotnie na rozwój aplikacji internetowych ani nie przyspieszył go tak znacząco. Od lat PHP odgrywa przewodnią rolę jako technologia tworzenia różnorodnych rozwiązań — od najprostszych stron internetowych aż po aplikacje biznesowe sterujące największymi witrynami internetowymi o globalnym zasięgu. W międzyczasie Microsoft dzięki swojemu flagowemu produktowi, jakim jest system operacyjny Windows, spowodował, że komputery trafiły pod strzechy. Windows wraz z dodatkowymi produktami, jakimi są Internet Information Services (IIS) dla Windows Server, Microsoft SQL Server, Microsoft Active Directory i Microsoft Exchange Server, stanowi obecnie zaawansowaną i wydajną platformę dla różnego rodzaju organizacji i firm. Microsoft jest świadom ogromnego potencjału, z jakim wiąże się obsługa języka PHP we własnych produktach, i dlatego zdecydował się oficjalnie uwzględniać PHP w strategii dalszego rozwoju implementowanych przez siebie rozwiązań. Działanie to ma na celu przede wszystkim zwiększenie interoperacyjności platformy Windows. Dzięki ostatnim sukcesom zespołu odpowiedzialnego za rozwój Windows pod kątem obsługi PHP, w skład którego wchodzą między innymi Pierre Joye, Rusłan Jakuszew i inni, IIS i PHP współpracują teraz ze sobą znacznie szybciej, bardziej stabilnie, bezpieczniej i zdecydowanie łatwiej tą współpracą zarządzać. Dotychczasowe efekty tych prac, a są nimi między innymi FastCGI, WinCache, PHP Manager, nowe sterowniki dla SQL Servera, integracja z Microsoft Web Platform Installer (Web PI), a także dodatkowe narzędzia programistyczne dla Windows Azure, Virtual Earth, Webslices, Sliverlight i SQL Servera (a nie jest to jeszcze pełna lista), powodują, że programowanie w PHP w środowisku Windows sprawia o wiele większą przyjemność i jest zdecydowanie bardziej skuteczne. W połączeniu ze stale rozszerzaną interoperacyjnością produktów firmy Microsoft PHP już teraz jest narzędziem, za pomocą którego można zrealizować praktycznie dowolne zadanie realizowane w środowiskach korporacyjnych. Zadaniem takim może być choćby integracja z Exchange Serverem za pośrednictwem udostępnianych przez niego usług sieciowych SOAP, zarządzanie użytkownikami w Active Directory za pośrednictwem Lightweight Directory Access Protocol (LDAP) czy wykorzystanie danych uwierzytelniających systemu Windows do uwierzytelniania użytkowników. Dodatkowo w MSDN oraz TechNet Microsoft udostępnia bogatą dokumentację programistyczną, która odpowiada niemal na wszystkie pytania i wątpliwości. Z kolei najważniejsi programiści PHP pracujący nad rozwojem integracji w produktach Microsoftu na bieżąco dzielą się swoimi spostrzeżeniami, poradami i trikami na prowadzonych przez siebie blogach.
18 Wprowadzenie
Jeśli dotąd — tak jak ja — programowałeś w PHP w połączeniu z serwerami Apache i MySQL, zapewne docenisz mnogość funkcji, stabilność, wydajność i zintegrowane mechanizmy bezpieczeństwa obecne na platformie Microsoftu. W książce pokażę, w jaki sposób efektywnie i bezpiecznie uruchamiać aplikacje zaimplementowane w PHP z wykorzystaniem IIS i SQL Servera, a także jak korzystać z danych na temat użytkowników, przechowywanych w Active Directory, oraz z kalendarzy i poczty elektronicznej obsługiwanej przez Exchange Server.
Dla kogo jest ta książka? Celem niniejszej książki jest przybliżenie programistom PHP technologii internetowych i bazodanowych udostępnianych przez Microsoft. Książka jest przeznaczona w szczególności dla programistów, którzy implementują aplikacje zintegrowane z Microsoft Active Directory oraz Microsoft Exchange Server. Po przeczytaniu książki będziesz w pełni rozumiał sposób współpracy PHP z IIS i na tej podstawie bez trudu będziesz mógł konfigurować środowisko tak, aby uzyskać możliwie optymalną wydajność i bezpieczeństwo. Dowiesz się, jak należy integrować się z SQL Serverem, który model uwierzytelniania będzie najlepszy w danych okolicznościach, jak przeprowadzać wyszukiwanie pełnotekstowe, a także w jaki sposób wykonywać procedury składowane. Będziesz też potrafił korzystać z Active Directory i zarządzać użytkownikami i grupami użytkowników, jak również na podstawie tych danych przeprowadzać uwierzytelnianie. Ponadto opanujesz sposoby integracji z usługami Exchange Web Services (EWS), aby za ich pośrednictwem czytać i tworzyć wiadomości poczty elektronicznej, planować spotkania i zarządzać kalendarzem.
Założenia W książce zakładam, że masz już doświadczenie w tworzeniu aplikacji w PHP oraz korzystaniu z relacyjnych baz danych (na przykład z wykorzystaniem Apache i MySQL). Powinieneś orientować się w podstawowych aspektach funkcjonowania sieci WWW, takich jak cykl żądania i odpowiedzi protokołu HTTP, a także znać podstawowe założenia i elementy modelu relacyjnych baz danych, takie jak tabele i wiersze; niezbędna jest ponadto podstawowa znajomość języka SQL. Oprócz tego spodziewam się, że przynajmniej w zarysie znasz język XML, ponieważ właśnie w XML-u zdefiniowane są pliki konfiguracyjne i usługi sieciowe SOAP Exchange Servera. Wprawdzie w książce znajduje się opis czynności, jakie należy wykonać, aby skonfigurować i uruchomić IIS, SQL Server, Active Directory i Exchange Server, a także działań potrzebnych do uruchomienia prezentowanych przykładów, jednak książka nie zawiera kompletnego opisu wspomnianych produktów. Powinieneś więc orientować się, do czego służą wspomniane narzędzia i w jaki sposób działają.
Wprowadzenie 19
Dla kogo nie jest ta książka? Nie każda książka jest dla wszystkich. Jeśli dotąd nie miałeś styczności z PHP albo systemami obsługi baz danych, zapewne będziesz miał trudności z prawidłowym zrozumieniem poruszanych zagadnień. Jeżeli natomiast poszukujesz kompletnego opisu Active Directory lub Exchange Servera, na pewno przeżyjesz rozczarowanie, bo na tego typu opisy po prostu nie ma miejsca w tej książce.
Co zawiera książka? Książka stanowi wprowadzenie do programowania z wykorzystaniem IIS, SQL Servera, Active Directory oraz Exchange Servera. W każdej części książki wyjaśnię, jak należy skonfigurować docelowe środowisko programistyczne, jak przedstawia się jego podstawowa architektura, jakie wewnętrzne mechanizmy rządzą tym środowiskiem oraz w jaki sposób implementuje się podstawowe rozwiązania w języku PHP. Każde zagadnienie jest ilustrowane przykładowymi konfiguracjami i listingami kodów źródłowych, dzięki czemu łatwiej będzie zrozumieć omawiane zagadnienie oraz osiągnąć założone cele. Książka powstała po to, aby ułatwić rozpoczęcie programowania z wykorzystaniem wspomnianych narzędzi, a także aby przygotować czytelnika do dalszego poznawania ekosystemu produktów Microsoftu. Książkę podzielono na cztery części, z których każda poświęcona jest innej technologii. Zależnie od zainteresowań i własnych dotychczasowych doświadczeń możesz od razu przejść do interesującej Cię części. Są to:
Część I „Internet Information Services (IIS)” — w części tej pokazuję, jak można zintegrować PHP z IIS oraz w jaki sposób IIS przetwarza żądanie. Dowiesz się z niej, jak należy skonfigurować IIS oraz jak ten serwer działa. Ta część książki przyda się zwłaszcza tym czytelnikom, którzy dotychczas korzystali z innych serwerów WWW, a teraz zdecydowali się zacząć korzystać z IIS. W kolejnych rozdziałach zawartych w tej części pokażę, jak zabezpieczać aplikacje PHP przed atakami, w jaki sposób korzystać z pamięci podręcznej, aby znacząco zwiększyć wydajność działania aplikacji, a także jak za pomocą URL Rewrite tworzyć adresy URL przyjazne dla użytkowników.
Część II „SQL Server” — opisuję tu, jak w programach zaimplementowanych w PHP korzystać z SQL Servera, albo — bardziej precyzyjnie — z systemu obsługi baz danych SQL Server. Dowiesz się, jak tworzy się bazy danych i tabele oraz jak należy zarządzać prawami dostępu. Ponieważ w SQL Serverze używa się odmiany języka SQL o nazwie Transact-SQL (T-SQL), w części tej przedstawię również składnię i polecenia tego języka. W dalszej kolejności przedstawię natywny sterownik PHP do obsługi SQL Servera, a także wykonywanie przy jego użyciu różnorodnych zadań, od odczytywania wyników prostych zapytań SELECT SQL-a aż po wykonywanie procedur składowanych oraz przekształcanie typów danych między SQL Serverem a PHP. W tej części książki poznasz obiekty danych PHP Data Objects (PDO) i sposób komunikowania się za ich pośrednictwem z SQL Serverem, a także
20 Wprowadzenie
zgłębisz różnice istniejące między PDO i natywnym sterownikiem. Na koniec pokażę, w jaki sposób przygotowuje się bazy danych do przeprowadzania operacji wyszukiwania pełnotekstowego, którą to operację współczesne aplikacje internetowe wykonują nad wyraz często.
Część III „Active Directory” — najpierw przedstawię w tej części książki najważniejsze pojęcia związane z Active Directory, takie jak domeny i lasy. W dalszej kolejności szczegółowo opiszę hierarchiczną strukturę danych Active Directory, zaprezentuję najważniejsze obiekty i atrybuty oraz zilustruję ich działanie na przykładzie zaimplementowanej w PHP przeglądarki LDAP. W kolejnych rozdziałach tej części pokażę, jak przy użyciu LDAP wyszukiwać i uwierzytelniać użytkowników i inne najważniejsze obiekty, a także w jaki sposób zmieniać atrybuty użytkowników, zarządzać ich członkostwem w grupach, tworzyć nowych użytkowników i resetować ich hasła.
Część IV „Exchange Server” — głównym tematem tej części książki jest integracja z serwerem Exchange za pośrednictwem usług sieciowych SOAP. Poszczególne rozdziały tej części dotyczą oddzielnych zagadnień, do których należą wysyłanie i odczytywanie wiadomości poczty elektronicznej, wyszukiwanie danych kontaktowych w książce adresowej, tworzenie wpisów w kalendarzu, a także akceptowanie i odrzucanie zaproszeń na spotkania. W każdym rozdziale przedstawię również dodatkowe opcje i metody interfejsu. W części tej przedstawię wiele przydatnych trików, dzięki którym łatwiej będzie zintegrować ze sobą PHP i Exchange oraz uniknąć wielu trudności, na które natykają się zwłaszcza początkujący.
Konwencje zastosowane w książce Informacje są prezentowane w książce z wykorzystaniem ściśle określonych konwencji, dzięki którym prezentowane treści powinny być bardziej czytelne i łatwiej przyswajalne.
Każde ćwiczenie składa się z listy zadań prezentowanych w postaci ponumerowanych czynności (1, 2 i tak dalej), które należy zrealizować, aby wykonać ćwiczenie.
Elementy zawarte w ramkach i z własnymi tytułami, na przykład „Uwaga”, prezentują dodatkowe informacje oraz alternatywne metody skutecznego wykonania jakiejś czynności.
Tekst, który należy wpisać samodzielnie (z wyjątkiem bloków kodu źródłowego), jest prezentowany pogrubioną czcionką.
Znak plusa (+) między nazwami dwóch klawiszy oznacza, że klawisze te trzeba nacisnąć jednocześnie. Na przykład sformułowanie „naciśnij Alt+Tab” oznacza, najpierw powinieneś nacisnąć klawisz Alt, a następnie, pozostawiając ten klawisz wciśnięty, nacisnąć klawisz Tab.
Pionowy separator między dwoma lub więcej poleceniami menu (na przykład Plik/Zamknij) oznacza, że w menu należy najpierw wybrać pierwsze polecenie, potem drugie i tak dalej.
Wprowadzenie 21
Wymagania systemowe Aby samodzielnie wykonać ćwiczenia opisywane w książce, potrzebny będzie następujący sprzęt i oprogramowanie:
Windows 7 lub Windows Server 2008 R2. Aby skorzystać z Exchange Servera, potrzebna będzie 64-bitowa wersja Windows Servera 2008 R2.
SQL Server 2008 R2 (w wersji Express Edition lub wyższej) wraz z SQL Server Management Studio (również w wersji Express Edition lub wyższej).
Exchange Server 2010 (albo 2010 SP1).
Komputer z odpowiednio szybkim procesorem (zalecam procesor 2GHz). Dla Exchange Servera potrzebny jest serwer 64-bitowy.
2 GB pamięci RAM, aby uruchomić IIS, SQL Server i Active Directory w środowisku programistycznym. Dla Exchange Servera potrzebne będą dodatkowe 4 GB pamięci RAM.
3,5 GB wolnej przestrzeni na dysku twardym.
Połączenie z internetem, potrzebne do pobrania oprogramowania i plików z przykładami.
Do zainstalowania i skonfigurowania serwerów potrzebne będą prawa lokalnego administratora. Do obsługi Active Directory potrzebne będą również uprawnienia administratora domeny.
Przykładowy kod źródłowy Większość rozdziałów tej książki zawiera ćwiczenia, dzięki którym będziesz mógł interaktywnie śledzić działanie rozwiązań prezentowanych w tekście. Wszystkie przykładowe projekty — zarówno w postaci początkowej, jak i końcowej — można pobrać ze strony pod adresem ftp://ftp.helion.pl/przyklady/inphpw.zip.
Instalacja przykładowych kodów źródłowych Aby zainstalować przykładowe kody źródłowe na własnym komputerze i zyskać możliwość wykonania na ich podstawie ćwiczeń opisywanych w książce, należy wykonać następujące czynności: 1. Rozpakować plik inphpw.zip pobrany z witryny internetowej książki (w razie potrzeby
można utworzyć katalog przeznaczony dla tych przykładów). 2. Przeczytać wyświetloną umowę licencyjną. Jeżeli zgodzisz się z warunkami licencji,
wybierz odpowiednią opcję i naciśnij przycisk Dalej. UWAGA Jeżeli treść umowy licencyjnej nie zostanie wyświetlona, będzie można ją znaleźć na tej samej stronie internetowej, z której pobrany został plik z przykładami inphpw.zip.
22 Wprowadzenie
Korzystanie z przykładowych kodów źródłowych Po rozpakowaniu archiwum przykładowych kodów źródłowych na dysku pojawią się dwa następujące foldery:
listingi — folder ten zawiera listingi wszystkich kodów źródłowych w podziale na rozdziały, w postaci, w jakiej występują w książce. Listingi są kodowane w formacie UTF-8, bez oznaczenia kolejności bajtów (ang. byte-order mark — BOM) na początku. Rozszerzenie pliku wskazuje jednocześnie rodzaj jego zawartości:
*.php — skrypt języka PHP lub fragment takiego skryptu.
*.sql — skrypt języka T-SQL.
*.xml — konfiguracja IIS lub komunikat EWS SOAP.
EWS — w folderze znajdują się zmodyfikowane definicje WSDL usług sieciowych Exchange Web Services 2010 SP1. Modyfikacje te są niezbędne, aby umożliwić współpracę między PHP a Exchange Serverem i zostaną opisane w rozdziałach od 19. do 23.
Zasadniczo przykładowe kody źródłowe powinno się uruchamiać w niezmienionej postaci; w niektórych przypadkach konieczne może być jednak odpowiednie dostosowanie własnego środowiska programistycznego. Jeśli w książce będą prezentowane kolejne etapy tworzenia skryptu PHP (dotyczy to zwłaszcza przeglądarki LDAP, którą zaimplementujemy w rozdziale 17. „Wyszukiwanie w Active Directory”), wówczas poszczególne pliki z przykładami będą zawierać opisywane zmiany. Należy pamiętać, że pliki PHP są przywoływane w innych skryptach bez wskazywania rozdziału i numeru listingu (dokładnie tak, jak widać to w tekście książki). Dlatego trzeba albo odpowiednio zmienić nazwy dołączanych plików, albo zmienić instrukcje include/require. Co więcej, niektóre przykłady bazują na listingach z dodatku A „Przykładowe skrypty i dane”, które muszą znajdować się na ścieżce dołączania. Katalog ten należy zatem umieścić na ścieżce dołączania PHP albo skopiować odpowiednie pliki do tego katalogu, w którym znajduje się uruchamiany skrypt.
Podziękowania Aby napisać książkę, autorzy potrzebują przyjaznego i motywującego ich otoczenia. Dlatego chciałbym podziękować pracownikom wydawnictwa O’Reilly Media: Russellowi Jonesowi, Holly Bauer i Christie Rears, a także Dianne Russell z Octal Publishing, za ich nieocenioną pomoc i umiejętność pracy w grupie. Brigitte Possin i Angela Walwick perfekcyjnie przełożyły tekst książki z języka niemieckiego na angielski. Christian Wenz odpowiadał za redakcję techniczną, zaś Lars Denneko i Daniel Chapman byli technicznymi korektorami angielskiej wersji książki. Manfred Steyer przekonał mnie, że napisanie tej książki ma sens, a Agnes Krispel, Julia Egger i moje koleżanki i koledzy z FH CAMPUS 02 stworzyli mi przyjazne, inspirujące środowisko pracy. Podziękowania należą się również moim nauczycielom i mentorom, którzy towarzyszyli mi w tej podróży życia, jaką było pisanie książki, moim długoletnim przyjaciołom Doris „Donnerdackel” Leipold i Antonowi Huberowi oraz mojej rodzinie, bez której nie potrafię sobie wyobrazić żadnego etapu życia. Tato, ta książka jest dla Ciebie. Graz, wrzesień 2011 roku. — Arno Hollosi
Cześć I
Internet Information Services (IIS) W tej części: Rozdział 1. „Konfiguracja środowiska roboczego” ..............................................................25 Rozdział 2. „Architektura IIS” ..............................................................................................41 Rozdział 3. „Konfigurowanie serwera IIS”...........................................................................63 Rozdział 4. „Konfigurowanie PHP”.......................................................................................83 Rozdział 5. „Bezpieczeństwo”............................................................................................107 Rozdział 6. „Pamięć podręczna” ........................................................................................137 Rozdział 7. „Przepisywanie adresów URL”........................................................................157 Rozdział 8. „Komunikaty o błędach i przeszukiwanie błędów” .........................................203
Rozdział 1.
Konfiguracja środowiska roboczego W tym rozdziale: Uruchamianie IIS .................................................................................................................26 Uruchamianie PHP ..............................................................................................................28 Konfigurowanie PHP w IIS ..................................................................................................30 Konfigurowanie przy użyciu Instalatora platformy sieci Web ............................................33 Kopia zapasowa konfiguracji ..............................................................................................35 Pierwsza przykładowa aplikacja ........................................................................................36 Zdalny dostęp ......................................................................................................................38 Podsumowanie ....................................................................................................................39
W tym rozdziale pokażę, jak należy zestawić środowisko robocze, na które będą się składać PHP oraz serwer WWW Internetowe usługi informacyjne (Internet Information Services — IIS). Na początek zainstalujemy tylko niezbędne komponenty środowiska, aby zminimalizować wykorzystanie zasobów oraz ograniczyć możliwość ataków z zewnątrz. Przykłady opisywane w tej książce uwzględniają komponenty w wersjach aktualnych na moment powstawania książki (czyli reprezentują stan na październik 2011 roku). Zatem wykorzystywane komponenty środowiska to PHP w wersji 5.3.10 oraz IIS 7 (wersja 7.5). Systemem operacyjnym (OS) jest Windows Server 2008 R2 SP1 oraz Windows 7 Ultimate SP1. Prezentowane opisy powinny jednak (z ewentualnymi drobnymi zmianami) być zgodne również z innymi wersjami systemu operacyjnego Windows. Stosunkowo często spotykany jest wciąż IIS 6, jednak nie biorę go w tej książce pod uwagę. IIS 6 i IIS 7 różnią się od siebie zasadniczo. IIS 7 posiada wiele nowych funkcji istotnych zwłaszcza dla programistów PHP, które nie są obecne w IIS 6. Ponadto sposób konfiguracji obydwóch wersji różni się niemal w każdym aspekcie, dlatego opisy dotyczące IIS 7 nie mają zastosowania w IIS 6.
26 CZĘŚĆ I Internet Information Services (IIS)
W kolejnych punktach tego rozdziału najpierw opiszę sposób uruchamiania IIS 7, następnie PHP, po czym przejdę do instalowania PHP na serwerze IIS. Przedstawiona zostanie instalacja najpierw z wykorzystaniem narzędzi zarządzania systemem Windows, a następnie z poziomu wiersza poleceń. Ta druga metoda zainteresuje zapewne przede wszystkim zaawansowanych użytkowników. Na koniec pokażę, jak przeprowadza się instalację z wykorzystaniem Instalatora platformy sieci Web (Microsoft Web Platform Installer), który automatyzuje wiele etapów konfiguracji wykonywanych dotychczas ręcznie.
Uruchamianie IIS Bieżąca wersja IIS posiada architekturę modułową, dzięki czemu użytkownik ma możliwość wyboru nawet mniej znaczących funkcji i dostosowywania w ten sposób serwera do różnorodnych potrzeb. Wystarczy zainstalować tylko te moduły, które są potrzebne w danych okolicznościach. Możesz więc wybrać tylko te elementy IIS, które będą zaspokajać jedynie ściśle określone potrzeby i w ten sposób nie będą zużywać więcej zasobów, niż jest to konieczne. Dodatkowo tak duża elastyczność w konfigurowaniu serwera zmniejsza jego podatność na ataki z zewnątrz, a więc poprawia bezpieczeństwo całego środowiska roboczego. Serwer IIS można zainstalować na kilka różnych sposobów. W poniższych punktach opisano sposób instalowania serwera przy użyciu Server Managera oraz z poziomu wiersza poleceń. IIS można też zainstalować w wierszu poleceń systemu Windows Server 2008 R2 w wydaniu Core. Opisywana poniżej procedura instalacji ogranicza się wyłącznie do dodania usługi Common Gateway Interface (CGI), niezbędnej do uruchomienia PHP w IIS. Nic nie stoi na przeszkodzie, by samodzielnie zainstalować także inne potrzebne usługi. W następnych rozdziałach wskażę, jakie jeszcze dodatkowe funkcje będą nam niezbędne do prawidłowego funkcjonowania środowiska.
Instalowanie IIS przy użyciu Menedżera serwera Jeżeli do instalacji IIS używasz Menedżera serwera, wykonaj czynności opisane poniżej. Dzięki temu uruchomiony zostanie kreator, który ułatwi realizację kolejnych etapów instalacji serwera. 1. Uruchom Menedżera serwera. W tym celu kliknij przycisk Start i wybierz polecenie
Wszystkie programy/Narzędzia administracyjne/Menedżer serwera. 2. Wybierz polecenie Role/Dodaj role.
Otworzy się Kreator dodawania ról. Kliknij przycisk Dalej, aby zatwierdzić stronę Zanim rozpoczniesz. 3. Na stronie Role serwera wybierz Serwer sieci Web (IIS) i kliknij przycisk Dalej. 4. Kliknij Dalej, aby zatwierdzić stronę Serwer sieci Web (IIS). 5. Na stronie Wybieranie usług ról wybierz opcję Serwer sieci Web (IIS). W sekcji Projektowanie
aplikacji zaznacz pole wyboru CGI (rysunek 1.1), a następnie kliknij przycisk Dalej.
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 27
RYSUNEK 1.1. Dodanie roli usługi CGI na serwerze IIS
6. Kliknij przycisk Zainstaluj, aby zatwierdzić wybrane ustawienia i rozpocząć instalację. 7. Gdy instalacja dobiegnie końca, kliknij przycisk Zamknij, aby zakończyć działanie kreatora.
W ten sposób zainstalowałeś IIS. Nie musisz restartować systemu Windows. Aby sprawdzić, czy IIS został zainstalowany poprawnie, uruchom przeglądarkę internetową i w pasku adresu wpisz http://localhost/. W odpowiedzi przeglądarka powinna wyświetlić domyślną stronę internetową z tekstem powitania.
Instalowanie IIS z poziomu wiersza poleceń Aby zainstalować serwer IIS z poziomu wiersza poleceń, trzeba użyć narzędzia pkgmgr.exe. Jest to nowe narzędzie wiersza poleceń udostępnione w Windows Serverze 2008, które służy do zarządzania opcjonalnymi funkcjami systemu operacyjnego. Narzędzie pkgmgr.exe zastąpiło dotychczasowe narzędzie sysocmgr.exe. WAŻNE Aby wykonać opisaną procedurę, trzeba posiadać uprawnienia administratora. Domyślnie w Windows Serverze 2008 wymagane uprawnienia posiada jedynie zintegrowane konto administratora. Pozostałe konta takich uprawnień nie mają, nawet jeśli należą do grupy administratora.
28 CZĘŚĆ I Internet Information Services (IIS) 1. Otwórz okno wiersza poleceń z uprawnieniami administratora.
Wiersz poleceń można znaleźć w menu Start — wystarczy kliknąć polecenie Wszystkie programy/Akcesoria/Wiersz polecenia. To samo narzędzie można też uruchomić w menu Start przez wpisanie polecenia cmd w polu tekstowym Wyszukaj programy i pliki. 2. W oknie wiersza poleceń wpisz poniższe polecenie, które spowoduje zainstalowanie roli
IIS Server i usługi CGI: pkgmgr /iu:IIS-WebServerRole;IIS-CGI
3. Upewnij się, że instalacja została wykonana bez błędów — wpisz polecenie: echo %errorlevel%
W ten sposób zainstalowałeś serwer IIS z poziomu wiersza poleceń. Aby sprawdzić, czy instalacja serwera się powiodła, otwórz przeglądarkę internetową i wpisz w niej adres http://localhost/. W przeglądarce powinna pojawić się strona internetowa z tekstem powitania.
Uruchamianie PHP Po zainstalowaniu serwera IIS możesz już zainstalować PHP i skonfigurować go do pracy na serwerze IIS. Również tym razem opiszę dwie metody postępowania: przy użyciu Menedżera internetowych usług informacyjnych oraz z poziomu wiersza poleceń. Jednak wiersza poleceń powinni używać tylko zaawansowani użytkownicy. Standardowo metoda ta jest przeznaczona do użycia w sytuacji, gdy nie ma graficznego interfejsu użytkownika (jak w Windows Server 2008 R2 w wydaniu Core) albo gdy dąży się do zautomatyzowania procesu instalacji przy użyciu odpowiedniego skryptu.
Instalowanie PHP 1. W Internet Explorerze lub innej przeglądarce internetowej otwórz stronę pod adresem
http://windows.php.net/download/. 2. Pobierz aktualną wersję PHP z rodziny 5.3.x (w trakcie powstawania tej książki była to
wersja 5.3.10) w postaci pliku zip. Wybierz plik zip z sekcji VC9 x86 Non Thread Safe. 3. Utwórz folder C:\PHP i rozpakuj do niego zawartość pliku zip.
Tak naprawdę zawartość pliku zip możesz rozpakować w dowolnym folderze, jednak w książce używam wspomnianego folderu C:\PHP. Jeśli użyjesz tego samego folderu na swoim komputerze, łatwiej będzie Ci analizować przykłady prezentowane w książce. 4. Skopiuj plik C:\PHP\php.ini-development do pliku C:\PHP\php.ini. 5. Otwórz plik C:\PHP\php.ini w edytorze tekstu, na przykład w Notatniku. 6. Znajdź w tym pliku wiersz, w którym definiuje się ustawienie strefy czasowej date.timezone, a następnie przypisz tej opcji własną strefę czasową, na przykład date.timezone = "Europe/Warsaw". 7. Ustaw opcję cgi.force_redirect = 0.
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 29 UWAGA Konieczne będzie też ustawienie opcji fastcgi.impersonate = 1, jednak na razie możesz ją
pominąć. Opcja ta kontroluje, na którym koncie IIS wykonywany jest kod PHP. Więcej informacji na ten temat znajdziesz w rozdziale 5. „Bezpieczeństwo”, w punkcie „Tożsamość i prawa dostępu”.
8. Aby sprawdzić, czy instalacja zakończyła się powodzeniem, otwórz okno wiersza poleceń, przejdź do folderu C:\PHP i wykonaj polecenie php –c C:\PHP –info. W odpowiedzi PHP
powinien wyświetlić listę wszystkich ustawień i danych konfiguracyjnych w sposób widoczny na rysunku 1.2.
RYSUNEK 1.2. Dane zwracane po poprawnym zainstalowaniu języka PHP
WAŻNE Jeżeli w odpowiedzi wyświetlony zostanie komunikat błędu o nieprawidłowej konfiguracji side-by-side, będzie to oznaczać, że w systemie operacyjnym nie ma bibliotek fazy wykonania Visual C++, które odpowiadają wersji PHP. W takim przypadku należy z sieci MSDN pobrać pakiet Microsoft Visual C++ 2008 SP1 Redistributable Package (x86) (odpowiednie łącze znajduje się z lewej strony na witrynie pobierania PHP), po czym zainstalować ten pakiet w systemie.
Dostępne moduły PHP Instalacja PHP została już zakończona. Prekompilowane pliki instalacyjne PHP pochodzące ze strony http://windows.php.net/ zawierają wszystkie domyślne moduły języka, a także niektóre rozszerzenia opcjonalne. Po zainstalowaniu PHP można sprawdzić listę skompilowanych modułów — w tym celu w wierszu poleceń w folderze C:\PHP należy wpisać polecenie php –m. Dodatkowe moduły, które będą dynamicznie ładowane w momencie uruchamiania PHP, znajdują się w folderze C:\PHP\ext. Aby moduły te rzeczywiście były ładowane, należy zdefiniować odpowiednią konfigurację w pliku php.ini i nakazać PHP ładowanie i aktywowanie odpowiednich modułów. UWAGA Za każdym razem, gdy do uruchomienia opisywanych przykładów konieczne będzie skonfigurowanie któregoś z dynamicznych modułów, będę o tym wyraźnie informował.
30 CZĘŚĆ I Internet Information Services (IIS)
Konfigurowanie PHP w IIS Skoro PHP został już zainstalowany na komputerze, trzeba teraz skonfigurować IIS w taki sposób, aby serwer używał tego języka do przetwarzania wywoływanych stron PHP. W tym celu w IIS należy skonfigurować PHP jako uchwyt (ang. handler). Dzięki modułowej strukturze serwera IIS można mu wskazywać różne programy (uchwyty) do przetwarzania różnego rodzaju danych. Podstawowa instalacja IIS zawiera trzy uchwyty do obsługi metod protokołu HTTP, uchwyt OPTIONS i TRACE, a także uchwyt StaticFile, którego jedynym zadaniem jest zwrócenie wywołanego, istniejącego lokalnie pliku bez zmieniania go. UWAGA Uchwyty to zwykłe łącza w łańcuchu poleceń serwera IIS służących do przetwarzania przychodzących żądań HTTP. Więcej informacji na temat pełnego łańcucha poleceń przedstawię w rozdziale 2. „Architektura IIS”.
Domyślnie IIS będzie zwracał wywoływane pliki z rozszerzeniem .php za pomocą najprostszego uchwytu StaticFile. Kiedy jednak PHP skonfiguruje się jako uchwyt, wówczas pliki z rozszerzeniem .php nie będą już zwracane bezpośrednio i w niezmienionej postaci, lecz najpierw zostaną wykonane przez interpreter języka PHP, a do przeglądarki zwrócony zostanie dopiero wynik tego wykonania. Na razie ograniczymy się do skonfigurowania IIS w minimalnym zakresie, niezbędnym do wykonywania programów w języku PHP. W rozdziale 3. „Konfigurowanie serwera IIS” opiszę bardziej szczegółowo inne aspekty konfiguracji, w szczególności związane z wydajnością i bezpieczeństwem.
Konfigurowanie PHP przy użyciu Menedżera internetowych usług informacyjnych Aby skonfigurować PHP za pomocą Menedżera internetowych usług informacyjnych, należy wykonać następujące czynności: 1. Uruchom Menedżera internetowych usług informacyjnych.
Można do tego celu wykorzystać aplikację Menedżer serwera i wybrać polecenie Menedżer serwera/Role/Serwer WWW (IIS)/Menedżer internetowych usług informacyjnych (IIS). Można także skorzystać z menu Start systemu Windows i w polu tekstowym Wyszukaj programy i pliki wpisać polecenie inetmgr. 2. Na serwerze otwórz narzędzie Mapowania obsługi, widoczne na rysunku 1.3. 3. W kolumnie po prawej stronie wybierz polecenie Dodaj mapowanie modułu. 4. Ustaw wartości zgodnie z rysunkiem 1.4.
Ścieżka żądania powinna zawierać wszystkie pliki z rozszerzeniem wskazującym na język PHP (*.php). Jako moduł należy wskazać FastCgiModule, zaś jako plik wykonywalny — plik php-cgi.exe. Nazwę można zdefiniować w dowolny sposób.
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 31
RYSUNEK 1.3. Wybór funkcji odwzorowań uchwytów w Menedżerze internetowych usług informacyjnych
RYSUNEK 1.4. Przypisania modułu PHP w IIS
5. Kliknij przycisk Ograniczenia żądań. 6. Na zakładce Mapowanie zaznacz opcję Wybieraj żądanie tylko, jeśli żądanie jest mapowane na:
i wybierz opcję Plik. 7. Na zakładce Zlecenia możesz opcjonalnie ograniczyć zakres obsługiwanych metod HTTP (na przykład tylko do metod HEAD, GET i POST).
32 CZĘŚĆ I Internet Information Services (IIS) 8. Naciśnij przycisk OK, aby zamknąć okno dialogowe Ograniczenia żądań. 9. Naciśnij przycisk OK, aby zatwierdzić dokonane zmiany. 10. Naciśnij przycisk Tak, aby zatwierdzić zdefiniowane odwzorowywania modułu.
W ten sposób w IIS włączona zostanie opcja wykonywania PHP jako aplikacji FastCGI. 11. W głównym folderze serwera WWW (C:\inetpub\wwwroot\) utwórz plik phpinfo.php
i wpisz do niego następujący kod:
12. Uruchom przeglądarkę internetową i wywołaj w niej adres http://localhost/phpinfo.php.
Zwrócona w odpowiedzi strona internetowa będzie zawierać dane pochodzące z funkcji phpinfo(), opisujące aktualne ustawienia języka PHP, co widać na rysunku 1.5.
RYSUNEK 1.5. Wynik wykonania funkcji phpinfo() po prawidłowym uruchomieniu języka PHP
WAŻNE Jeżeli zamiast strony zwróconej przez phpinfo() w przeglądarce pojawi się komunikat o błędzie serwera o kodzie 500 (wewnętrzny błąd serwera), należy wyszukać informację o tym błędzie zgodnie z treścią rozdziału 8. „Komunikaty o błędach i wyszukiwanie błędów”.
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 33
Konfigurowanie PHP w wierszu poleceń Aby skonfigurować PHP z poziomu wiersza poleceń, trzeba skorzystać z programu appcmd zlokalizowanego w folderze C:\Windows\System32\inetsrv. Program ten jest nowością opracowaną dla IIS 7. Domyślnie wskazany folder nie jest objęty ścieżką wyszukiwania systemu Windows, dlatego aby go uruchomić, trzeba przejść do tego folderu, a potem otworzyć okno wiersza poleceń bądź też w wierszu poleceń wpisać pełną ścieżkę dostępu do appcmd. Można też dodać tę ścieżkę do zmiennej środowiskowej PATH systemu Windows. Poniżej znajduje się procedura, jaką należy wykonać, aby skonfigurować PHP w wierszu poleceń: 1. Otwórz okno wiersza poleceń z uprawnieniami administratora. 2. Skonfiguruj pulę aplikacji FastCGI — w tym celu wpisz następujące polecenie: appcmd set config /section:system.webServer/fastCGI /+[fullPath='C:\PHP\php-cgi.exe']
3. Aby skonfigurować przypisanie uchwytu, wykonaj następujące polecenie: appcmd set config /section:system.webServer/handlers /+[name='PHP_via_FastCGI', modules= ´'FastCgiModule',scriptProcessor='C:\PHP\php-cgi.exe', verb='*',path='*.php',resourceType='File']
WAŻNE Ze względu na ograniczoną ilość miejsca powyższe polecenie rozciąga się na kilka wierszy. Jednak w trakcie jego wpisywania w wierszu poleceń należy zawrzeć wszystkie parametry konfiguracyjne w jednym wierszu.
4. W głównym folderze serwera WWW (C:\inetpub\wwwroot\) utwórz plik phpinfo.php
i wpisz do niego następujący kod:
5. Uruchom przeglądarkę internetową i wywołaj w niej adres http://localhost/phpinfo.php.
W przeglądarce powinna pojawić się strona internetowa z aktualnymi ustawieniami PHP zwróconymi przez funkcję phpinfo().
Konfigurowanie przy użyciu Instalatora platformy sieci Web Prostą w użyciu alternatywą dla opisanych przed chwilą metod instalacji i konfiguracji środowiska roboczego złożonego z PHP i IIS jest wykorzystanie Instalatora platformy sieci Web (Web PI). Web PI automatycznie wykonuje znaczną część czynności, które w opisanych dotychczas metodach trzeba wykonać ręcznie. Natomiast po zainstalowaniu Windows Web App Gallery Web PI będzie w stanie dodatkowo przeprowadzić automatyczną instalację szeregu innych aplikacji, takich jak oprogramowanie do prowadzenia blogów WordPress czy system zarządzania treścią Joomla!. Web PI sprawdzi się więc doskonale, gdy szybko i bezproblemowo będziesz chciał uruchomić PHP w systemie Windows. W następnym punkcie opiszę, w jaki sposób przeprowadzić instalację w systemie Windows 7 Ultimate SP1. Web PI można użyć jednak również w systemach Windows Vista, Windows XP SP2+, Windows Server 2003 SP1+ oraz Windows Server 2008. We wszystkich wspomnianych systemach opisywane przeze mnie czynności wykonuje się w podobny, prosty sposób.
34 CZĘŚĆ I Internet Information Services (IIS)
Uruchamianie Web PI Platforma Web PI sama w sobie jest programem, który najpierw trzeba zainstalować. W tym celu należy wykonać następujące czynności: 1. Wejdź na stronę internetową pod adresem http://www.microsoft.com/web/downloads/
platform.aspx. 2. Pobierz Web PI i zapisz plik instalacyjny wpilauncher_3_10.exe na dysku lokalnym.
W książce używam Web PI w wersji 3.0. 3. Uruchom plik instalacyjny wpilauncher_3_10.exe.
Jeżeli nie jesteś zalogowany jako administrator, w oknie dialogowym Kontrola konta użytkownika naciśnij przycisk Tak, aby zezwolić na przeprowadzenie instalacji. 4. Po zainstalowaniu instalatora na ekranie pojawi się okno początkowe Web PI.
Uruchamianie IIS i PHP Gdy Web PI został już zainstalowany, można uruchomić serwer WWW. W tym celu należy wykonać następujące czynności: 1. Uruchom Web PI. 2. W górnej części okna kliknij opcję Produkty. Następnie przyciskami Dodaj dodaj opcje Zalecana
konfiguracja usług IIS 7, Usługi IIS: CGI oraz PHP Manager For IIS, jak na rysunku 1.6.
RYSUNEK 1.6. Wybór odpowiednich opcji serwera WWW w instalatorze Web PI
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 35 3. Naciśnij przycisk Zainstaluj. 4. W wyświetlonym oknie dialogowym Web PI naciśnij przycisk Akceptuję.
W tym momencie Web PI rozpocznie pobieranie i instalowanie wszystkich wybranych (i wymaganych) komponentów. Proces ten może trwać nawet kilka minut. 5. Gdy instalacja dobiegnie końca, naciśnij przycisk Zakończ. 6. Naciśnij przycisk Zakończ, aby zamknąć Web PI. 7. Uruchom przeglądarkę internetową i w pasku adresu wpisz http://localhost/.
W przeglądarce powinna pojawić się strona powitalna serwera IIS. UWAGA Firma Microsoft udostępnia także pełne środowisko programistycznie aplikacji internetowych o nazwie WebMatrix. Narzędzie samo w sobie jest bardzo przyjemne w obsłudze, a także proste w instalacji i uruchamianiu, lecz możliwości jego konfiguracji są dość ograniczone. Dlatego nie używam go w tej książce do implementacji i uruchamiania omawianych przykładów.
Sprawdzanie konfiguracji PHP Podobnie jak przy okazji innych metod instalacji należy się upewnić, że instalacja PHP została zakończona pomyślnie. W tym celu należy wykonać następujące czynności: 1. W głównym folderze serwera WWW (C:\inetpub\wwwroot\) utwórz plik phpinfo.php
i wpisz do niego następujący kod:
UWAGA Jeżeli nie posiadasz uprawnień wymaganych do utworzenia pliku w głównym folderze serwera WWW, otwórz Eksplorator Windows, wybierz folder C:\inetpub\wwwroot\, po czym w menu kontekstowym wybierz polecenie Właściwości/Zabezpieczenia/Edytuj. W wyświetlonym oknie dialogowym będziesz mógł wówczas zdefiniować dla swojego konta niezbędne uprawnienia. 2. Uruchom przeglądarkę internetową i wywołaj w niej adres http://localhost/phpinfo.php.
W przeglądarce powinna pojawić się strona internetowa z aktualnymi ustawieniami PHP zwróconymi przez funkcję phpinfo().
Kopia zapasowa konfiguracji Po pomyślnym zainstalowaniu IIS i PHP bezwzględnie należy sporządzić zapasową kopię danych konfiguracyjnych serwera WWW. Dane konfiguracyjne IIS przechowywane są w folderze C:\Windows\System32\inetsrv\config, w trzech plikach: applicationHost.config, administration.config oraz redirection.config.
36 CZĘŚĆ I Internet Information Services (IIS)
Cały folder z konfiguracją można skopiować ręcznie. Alternatywą jest użycie narzędzia wiersza poleceń appcmd. Za pomocą tego narzędzia można stworzyć zapasową kopię wszystkich istotnych plików konfiguracyjnych. W tym celu należy wykonać polecenie appcmd add backup "MojaKopia". Polecenie to utworzy kopię zapasową bieżącej konfiguracji i umieści ją w folderze C:\Windows\System32\inetsrv\backup\MojaKopia. UWAGA W systemie Windows 7 program appcmd należy uruchomić w oknie wiersza poleceń z prawami administratora. W tym celu trzeba prawym przyciskiem myszy kliknąć polecenie Start/Wszystkie programy/ Akcesoria/Wiersz polecenia, a następnie w menu kontekstowym wybrać polecenie Uruchom jako administrator.
Kopię zapasową konfiguracji należy wykonywać po każdej zmianie konfiguracji serwera, szczególnie jeśli instalowane były nowe moduły lub komponenty. W ten sposób w razie potrzeby zawsze będziesz mógł wrócić do poprzedniej konfiguracji środowiska.
Pierwsza przykładowa aplikacja Po zakończeniu instalacji oraz konfiguracji IIS i PHP zgodnie z opisem z wcześniejszych punktów możemy zaimplementować i uruchomić pierwszą aplikację w PHP. Zanim przejdę do bardziej zaawansowanych opcji konfiguracyjnych, które będą przedmiotem kolejnych rozdziałów, wykorzystam naszą podstawową konfigurację zdefiniowaną we wcześniejszych punktach, aby uruchomić pierwszą przykładową aplikację. Celem tego ćwiczenia jest pokazanie, że nawet w takiej podstawowej konfiguracji można korzystać z funkcji PHP takich jak formularze i sesje. W ramach przykładu zaimplementuję aplikację w PHP, w której użytkownik będzie odgadywać losową liczbę z przedziału od 1 do 100. Na rysunku 1.7 widnieje ekran początkowy aplikacji PHP, zaś jej kod źródłowy znajduje się na listingu 1.1. Gdy rozpoczyna się sesja i nie jest jeszcze ustawiona żadna liczba losowa, aplikacja taką liczbę wygeneruje i zapisze w zmiennej sesji $_SESSION['number']. Kiedy użytkownik wpisze jakąś liczbę (zmienna $_POST['guessed']), program porówna ją z liczbą losową wygenerowaną na początku jego działania i wyświetli odpowiedni komunikat z wynikiem tego porównania. Gra kończy się, gdy użytkownik odgadnie losową liczbę. W takim przypadku program wywołuje funkcję startGame() i rozpoczyna nową grę na tych samych zasadach. LISTING 1.1. Przykładowa aplikacja w PHP, w której odgaduje się liczbę z przedziału od 1 do 100
Zgadywanie liczb
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 37 echo "
Czy odgadniesz liczbę? Liczba należy do przedziału od 1 do 100.
"; } /* Pierwsze wywołanie? -> Rozpoczęcie gry */ if (!isset($_SESSION['number'])) { startGame(); } /* Zgadniesz? */ elseif (isset($_POST['guessed']) && is_numeric($_POST['guessed'])) { if ($_SESSION['number'] == $_POST['guessed']) { echo "
Doskonale! Odgadłeś prawidłową liczbę.
", "
Chcesz zagrać jeszcze raz?
"; startGame(); } elseif ($ SESSION['number'] < $ POST['guessed']) { echo "
Niestety, pomyliłeś się! Prawidłowa liczba jest mniejsza.
", "Spróbuj ponownie.
"; } else { echo "
Niestety, pomyliłeś się! Prawidłowa liczba jest większa.
", "Spróbuj ponownie.
"; } } /* Liczba nieprawidłowa lub brak liczby */ else { echo "
Proszę, podaj liczbę.", "Liczba, którą należy odgadnąć, należy do przedziału od 1 do 100.
"; } ?>
RYSUNEK 1.7. Strona początkowa przykładowej aplikacji w PHP — gry, która polega na odgadnięciu liczby z przedziału
od 1 do 100
38 CZĘŚĆ I Internet Information Services (IIS)
Zdalny dostęp Domyślnie zarówno w Windows Serverze 2008 R2, jak i w Windows 7 włączona jest zapora sieciowa. Zapora sieciowa systemu Windows pełni niezwykle istotną funkcję: chroni komputer przed nieuprawnionym dostępem, blokuje dostęp lub pozwala na dostęp z zewnątrz do usług działających na komputerze — zależnie od zdefiniowanych reguł bezpieczeństwa. Można na przykład zezwolić użytkownikom z zewnątrz na łączenie się z serwerem IIS i odwrotnie — można taki dostęp zablokować. Odpowiednie ustawienia definiuje się właśnie na poziomie zapory sieciowej Windows. Zdalny dostęp na pewno trzeba umożliwić, gdy na danym komputerze udostępnia się jakąś aplikację, natomiast zwykle blokuje się dostęp z zewnątrz do własnego środowiska roboczego. Zapora sieciowa systemu Windows zawiera zestaw predefiniowanych reguł przeznaczonych dla serwera IIS. Zdalny dostęp można kontrolować przez wykonanie następujących czynności (przebiegają one tak samo w Windows 7, jak i w Windows Serverze 2008 R2). 1. Otwórz okno ustawień zapory systemu Windows poleceniem Start/Panel sterowania/System
i zabezpieczenia, po czym wybierz polecenie Zapora systemu Windows/Zezwalaj programowi na dostęp przez Zaporę systemu Windows. 2. Jeżeli przycisk Zmień ustawienia jest aktywny, naciśnij go. Jeżeli natomiast nie jest on
dostępny, będziesz musiał uzyskać wymagane uprawnienia, aby zmienić ustawienia zapory. 3. Aby włączyć lub wyłączyć dostęp do IIS z zewnątrz, zaznacz opcję Usługi sieci World Wide
Web (HTTP) widoczną na rysunku 1.8 lub usuń jej zaznaczenie.
RYSUNEK 1.8. Włączenie zdalnego dostępu do IIS w systemie Windows 7
ROZDZIAŁ 1. Konfiguracja środowiska roboczego 39
Gdy włącza się możliwość zdalnego dostępu, trzeba także zdecydować, czy dostęp taki mają mieć wyłącznie komputery należące do tej samej domeny, dostęp powinien być możliwy jedynie z sieci prywatnej, czy też IIS powinien być ogólnie dostępny (kolumna Publiczne). Aby to ostatnie ustawienie zadziałało, sieci muszą być przypisane do odpowiedniego profilu. 4. Zatwierdź dokonane zmiany przez naciśnięcie przycisku OK.
Podsumowanie Po skonfigurowaniu środowiska roboczego można zacząć przygodę z PHP i IIS. Opisane w tym rozdziale metody instalacji dotyczą wyłącznie podstawowych, domyślnych komponentów środowiska. IIS zawiera wiele dodatkowych modułów i funkcji, z których część zostanie przedstawiona w dalszych rozdziałach książki. Spośród trzech możliwych sposobów uruchamiania PHP i IIS wykorzystanie Instalatora platformy sieci Web jest metodą najprostszą, ponieważ niemal w całości program ten automatyzuje proces instalacji niezbędnych komponentów. Web PI doskonale nadaje się zwłaszcza do szybkiego uruchamiania środowiska programistycznego, z którego można od razu zacząć korzystać. Pozostałe dwie opisane metody instalacji i konfiguracji wymagają zdecydowanie większego zaangażowania użytkownika, lecz jednocześnie zyskuje się dzięki temu zdecydowanie większy wpływ na przebieg i zakres instalacji. Zanim przedstawię bardziej zaawansowane opcje konfiguracji oraz dodatkowe moduły, najpierw w rozdziale 2. przedstawię architekturę serwera IIS oraz omówię sposób wewnętrznego przetwarzania żądań protokołu HTTP.
40 CZĘŚĆ I Internet Information Services (IIS)
Rozdział 2.
Architektura IIS W tym rozdziale: Witryny ................................................................................................................................42 Aplikacje ..............................................................................................................................48 Katalogi wirtualne ...............................................................................................................51 Przetwarzanie żądań HTTP .................................................................................................53 Moduły .................................................................................................................................55 Pule aplikacji .......................................................................................................................56 FastCGI ................................................................................................................................59 Podsumowanie ....................................................................................................................61
Opublikowanie przez Microsoft serwera Internet Information Services (IIS) w wersji 7 było równoznaczne ze znaczącym ulepszeniem modułowej architektury tego serwera oraz jego bezpieczeństwa w wielu różnych obszarach. Jeżeli dotychczas korzystałeś z serwerów WWW innych producentów, bardzo istotne jest, abyś poznał sposób przetwarzania żądań przez IIS oraz przypisywania tym żądaniom odpowiedniej zawartości. Podobnie jak w przypadku innych serwerów WWW na pojedynczej instancji serwera IIS można udostępniać więcej niż jedną witrynę internetową. IIS składa się z trzech podstawowych elementów, które z jednej strony usprawniają jego działanie i ułatwiają utrzymanie, zaś z drugiej — zapewniają warstwową, rozdrobnioną budowę, która wydatnie poprawia bezpieczeństwo pracy serwera. Tymi trzema podstawowymi elementami są witryna (ang. site), aplikacja (ang. application) i katalog wirtualny (ang. virtual directory). Opis wspomnianych podstawowych elementów serwera, zawarty w kolejnych punktach rozdziału, jest jednocześnie opisem pełnego cyklu wykonania żądania http, puli aplikacji i powiązania FastCGI. Łącznie wszystkie te informacje składają się na szczegółowy opis sposobu działania serwera IIS, dzięki któremu nauczysz się, jak należy planować i tworzyć aplikacje PHP działające na serwerze IIS.
42 CZĘŚĆ I Internet Information Services (IIS)
Witryny W IIS 7 witryna to obszar serwera WWW, który posiada własne aplikacje oraz katalogi wirtualne, a także własne powiązania. Na witrynach można uruchamiać niezależne strony internetowe, którym można na przykład przypisywać różne nazwy domenowe, adresy IP albo porty — a wszystko na pojedynczej instancji serwera IIS. Inaczej mówiąc, witryna to narzędzie, które służy do „wirtualnego hostingu” stron internetowych. UWAGA Administratorzy serwerów Apache powinni wiedzieć, że witryny IIS odpowiadają dyrektywie
konfiguracyjnej
. Jednak projektanci IIS poszli jeszcze krok dalej, ponieważ na poziomie danej witryny można zmieniać nawet podstawowe ustawienia konfiguracyjne serwera WWW (na przykład dostępne moduły). Więcej informacji na temat sposobu konfigurowania serwera IIS przedstawię w rozdziale 3. „Konfigurowanie serwera IIS”.
Uruchamianie nowej witryny Nową witrynę można uruchomić z poziomu aplikacji Menedżer internetowych usług informacyjnych lub w wierszu poleceń za pomocą narzędzia appcmd. Uruchamianie nowej witryny w Menedżerze IIS Aby uruchomić nową witrynę w skonfigurowanym wcześniej środowisku roboczym, należy wykonać następujące czynności: 1. Otworzyć Menedżera IIS. 2. Z lewej strony, w panelu Połączenia, kliknąć myszą pozycję Witryny, a następnie w panelu
Akcje (z prawej strony okna menedżera) kliknąć polecenie Dodaj witrynę sieci Web. Wyświetlone zostanie okno dialogowe Dodawanie witryny sieci Web, widoczne na rysunku 2.1.
RYSUNEK 2.1. Okno dialogowe Dodawanie witryny sieci Web z wypełnionymi wartościami
ROZDZIAŁ 2. Architektura IIS 43 3. W polu tekstowym Nazwa witryny wpisz nazwę witryny, którą chcesz uruchomić.
Nazwa witryny nie jest tożsama z nazwą domeny, a więc witrynę można nazwać dowolnie. Powinno się jej jednak nadać nazwę opisową — taką, której przeznaczenie będzie można później bez trudu zidentyfikować. 4. Naciśnij przycisk Połącz jako.
W wyświetlonym oknie dialogowym można skonfigurować konto użytkownika, przy użyciu którego witryna będzie uzyskiwać dostęp do plików. Szczegółowe informacje na temat ścieżki logowania przedstawię w rozdziale 5. „Bezpieczeństwo”. Jeżeli zdecydujesz się odstąpić od ustawień domyślnych i na przykład użyjesz specjalnie utworzonego w tym celu konta użytkownika, powinieneś zawsze sprawdzić poprawność konfiguracji przez naciśnięcie przycisku Testuj ustawienia. W ten sposób dowiesz się, czy wskazany użytkownik ma dostęp do folderu głównego. 5. W polu tekstowym Ścieżka fizyczna wpisz ścieżkę dostępu do folderu, w którym ma
znajdować się tworzona witryna. Wskazany folder będzie głównym folderem witryny. W przykładzie jako główny folder witryny wskazałem C:\inetpub\witrynademophp. 6. Wpisz dane powiązania.
Jeśli uruchamiasz witrynę, która ma być dostępna za pośrednictwem protokołu HTTP na domyślnym porcie 80, na liście rozwijanej Typ wybierz pozycję http, a następnie w polu tekstowym Port wpisz 80. Jeżeli serwer WWW nie posiada więcej niż jednego adresu IP albo jeśli nie chcesz przypisywać witrynie konkretnego adresu IP, w polu Adres IP pozostaw wartość Wszystkie nieprzypisane. 7. W polu tekstowym Nazwa hosta wpisz nazwę domeny dla witryny. Możesz to pole
pozostawić również puste — wtedy witryna będzie przyjmować żądania skierowane do wszystkich nazw komputerów (hostów). Musisz jednak zapewnić, aby dla danego powiązania zdefiniowanego przez Typ, Adres IP i Port określona była nie więcej niż jedna witryna bez podanej nazwy hosta (czyli witryna domyślna). 8. Zaznacz pole wyboru Uruchom witrynę sieci Web natychmiast i naciśnij przycisk OK,
aby zamknąć okno dialogowe. W ten sposób stworzyłeś nową witrynę. Na rysunku 2.2 widać, że nowo utworzoną witrynę można znaleźć na liście witryn wyświetlanej po przejściu do panelu Połączenia i wybraniu polecenia Nazwa serwera/Witryny. Na liście znajdują się najważniejsze informacje na temat powiązania, folderu głównego oraz stanu poszczególnych witryn funkcjonujących na serwerze WWW. Uruchamianie witryny z poziomu wiersza poleceń Nową witrynę można też uruchomić z poziomu wiersza poleceń przy użyciu programu appcmd. Polecenie to wymaga podania parametrów określających nazwę witryny, powiązania oraz ścieżkę dostępu do folderu, jeżeli główna aplikacja witryny ma zostać wygenerowana automatycznie. Zaleca się, by główną aplikację tworzyć w tym samym momencie.
44 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 2.2. Lista witryn z informacjami na temat ich stanu, powiązań i ścieżek
Powiązanie można zdefiniować na dwa sposoby:
Analogicznie do adresu URL, przy użyciu składni protokół://nazwa_domeny:numer_portu (na przykład http://www.witrynademophp.site:80).
Jako powiązanie, przy użyciu składni protokół/adres_IP:numer_portu:nazwa_domeny (na przykład http/*:80:www.witrynademophp.site).
Aby utworzyć Witrynę demo PHP zgodnie z opisem z punktu „Uruchamianie nowej witryny w Menedżerze IIS”, należy wykonać następujące polecenie: appcmd add site /name:"Witryna Demo PHP" /bindings:http/*:80:www.witrynademophp.site / ´physicalPath:"C:\inetpub\witrynademophp"
UWAGA Gdy nową witrynę tworzy się w wierszu poleceń, wówczas w odróżnieniu od analogicznej czynności wykonywanej w Menedżerze IIS nie jest automatycznie tworzona pula aplikacji dla witryny. O tym, jak tworzy się pulę aplikacji i przypisuje ją witrynie, napiszę w punkcie „Pule aplikacji” w dalszej części tego rozdziału.
Sprawdzenie działania nowej witryny Zanim ustanowi się połączenie z nową witryną, trzeba najpierw zapewnić, aby użyta nazwa domeny prawidłowo wskazywała ze środowiska roboczego na serwer WWW. W tym celu w edytorze tekstu należy otworzyć plik C:\Windows\System32\drivers\etc\hosts i zdefiniować
ROZDZIAŁ 2. Architektura IIS 45
w nim odpowiednie przypisanie. Na przykład jeśli wpisałeś nazwę domeny w postaci www.witrynademophp.site i wywołujesz witrynę na lokalnym serwerze WWW, w pliku hosts powinieneś wpisać poniższy wiersz i zapisać dokonane zmiany: 127.0.0.1 www.witrynademophp.site
OSTRZEŻENIE Jeżeli od razu wywołasz witrynę http://www.witrynademophp.site/, otrzymasz błąd protokołu HTTP 403.14 — Forbidden. Przyczyną błędu jest to, że we wskazanym folderze głównym nie istnieją żadne dane, a domyślna konfiguracja witryny nie zezwala na zwracanie listy dostępnych folderów. Więcej informacji na temat wskazywania dokumentu domyślnego oraz zezwalania na zwracanie listy folderów przedstawię w rozdziale 4. „Konfigurowanie PHP”.
Działanie nowej witryny można sprawdzić na dwa sposoby:
Aby sprawdzić, czy dostępne są strony HTML, elementy graficzne i sama witryna, skopiuj pliki iisstart.html i welcome.png, które znajdują się w folderze C:\inetpub\wwwroot, do folderu głównego nowej witryny (C:\inetpub\witrynademophp). Następnie w przeglądarce wpisz adres http://www.witrynademophp.site/. W przeglądarce powinna się wówczas pojawić powitalna strona serwera IIS.
Aby sprawdzić działanie PHP, w głównym folderze witryny (C:\inetpub\witrynademophp) utwórz plik welcome.php i wstaw w nim kod źródłowy przedstawiony na listingu 2.1.
LISTING 2.1. Kod źródłowy pliku welcome.php Witaj Witaj!
Oto informacje o tobie: Serwer: $_SERVER[SERVER_NAME]"; echo "- Port: $ SERVER[SERVER PORT]
"; echo "- Adres: $_SERVER[LOCAL_ADDR]
"; echo "- Protokół: $_SERVER[SERVER_PROTOCOL]
"; echo "- HTTPS: $_SERVER[HTTPS]
"; ?>
W przeglądarce wpisz adres http://www.witrynademophp.site/welcome.php — w odpowiedzi powinna zostać wyświetlona strona WWW podobna do przedstawionej na rysunku 2.3. UWAGA Na serwerze IIS adres IP tego serwera odczytuje się przy użyciu predefiniowanej zmiennej PHP o nazwie $_SERVER['LOCAL_ADDR'], a nie przy użyciu częściej spotykanej zmiennej $_SERVER['SERVER_ADDR']. Ponadto jeśli żądanie do serwera IIS jest wykonywane przy użyciu protokołu HTTP, a nie HTTPS, wówczas zmienna $_SERVER['HTTPS'] nie jest pusta, lecz ma wartość off.
46 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 2.3. Informacje zwracane przez welcome.php
Definiowanie dodatkowych powiązań Dla witryny można zdefiniować dowolną liczbę powiązań. Przydaje się to na przykład wówczas, gdy witryna ma być dostępna zarówno w domenie o nazwie www.przyklad.com, jak również w domenie przyklad.com (bez przedrostka www). Jednak w momencie definiowania witryny zdefiniować można tylko jedno powiązanie. Dodawanie powiązań przy użyciu Menedżera IIS Aby zdefiniować dodatkowe powiązania, można użyć Menedżera IIS. W tym celu wykonaj następujące czynności: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz witrynę, którą chcesz skonfigurować. 3. W panelu Akcje wybierz polecenie Edytuj witrynę/Powiązania.
Na ekranie pojawi się okno dialogowe Powiązania witryny. 4. Kliknij przycisk Dodaj, aby otworzyć okno dialogowe Dodawanie powiązania witryny. 5. Wpisz dane powiązań, które chcesz zdefiniować. Na przykład:
Typ: http
Adres IP: Wszystkie nieprzypisane
Port: 80
Nazwa hosta: witrynademophp.site
6. Naciśnij przycisk OK, aby zatwierdzić wprowadzone zmiany.
Jeśli teraz naciśniesz przycisk Przeglądaj, otworzy się okno przeglądarki z odpowiadającym adresem URL.
ROZDZIAŁ 2. Architektura IIS 47 OSTRZEŻENIE Jeżeli chcesz użyć nowych nazw domenowych, zastosuj wpis z serwera DNS, aby zyskać pewność, że odpowiadający adres IP wskazuje właściwy serwer WWW. Alternatywnie odpowiednie powiązanie można zdefiniować w pliku C:\Windows\System32\drivers\etc\hosts w środowisku roboczym, zgodnie z opisem zawartym w punkcie „Sprawdzenie działania nowej witryny” we wcześniejszej części tego rozdziału.
7. Aby zdefiniować kolejne powiązania, wykonaj ponownie czynności, począwszy od kroku
numer 4 powyżej. Aby zakończyć dodawanie powiązań, naciśnij przycisk Zamknij, aby zamknąć okno dialogowe. Na rysunku 2.4 przedstawiono dwa nowe powiązania dodane do przykładowej witryny dla domeny witrynademophp.site na portach 80 i 1234.
RYSUNEK 2.4. Lista powiązań zdefiniowanych dla witryny
Jeśli teraz spróbujesz wywołać stronę welcome.php (z listingu 2.1) przy użyciu któregoś z nowych powiązań, przekonasz się, że wartości zmiennych PHP odzwierciedlają zdefiniowane parametry tych powiązań. Dodawanie powiązań w wierszu poleceń Powiązania zdefiniowane dla witryny można zmieniać w wierszu poleceń — służy do tego narzędzie appcmd. Nie ma żadnego oddzielnego polecenia przeznaczonego do dodawania lub usuwania powiązań. Aby wprowadzić zmiany w powiązaniach, należy wskazać wszystkie powiązania, które mają być zdefiniowane dla witryny. Na przykład aby dodać trzy powiązania przedstawione w poprzednim przykładzie, należy wykonać następujące polecenie appcmd: appcmd set site "Witryna demo PHP" /bindings:http/*:80:www.witrynademophp.site,http/*:80: ´witrynademophp.site,http/*:1234:witrynademophp.site
Zarządzanie witryną WWW IIS pozwala na uruchamianie i zatrzymywanie poszczególnych witryn w fazie wykonania. Funkcja ta jest przeznaczona wyłącznie do tymczasowego wyłączania witryny na czas realizacji zadań utrzymaniowych. Dzięki temu nie trzeba wyłączać całego serwera WWW.
48 CZĘŚĆ I Internet Information Services (IIS)
Uruchamianie i zatrzymywanie witryny WWW w Menedżerze IIS Polecenia, które uruchamiają i zatrzymują witryny, znajdują się w Menedżerze IIS. Gdy w panelu Połączenia wskaże się odpowiednią witrynę, wówczas w sekcji Zarządzaj witryną sieci Web panelu Akcje pojawią się następujące opcje:
Rozpocznij — uruchamia witrynę, która wcześniej została wyłączona.
Zatrzymaj — zatrzymuje działającą witrynę, przez co przestaje ona być dostępna dla żądań.
Uruchom ponownie — zatrzymuje działającą witrynę, po czym ją ponownie uruchamia. Witryna jest przez jakiś czas niedostępna. Czynność ta powoduje załadowanie na nowo wszystkich danych konfiguracyjnych witryny.
Uruchamianie i zatrzymywanie witryny WWW w wierszu poleceń W wierszu poleceń można uruchamiać i zatrzymywać witryny WWW, a także wyświetlać ich listę. W tym celu najpierw trzeba otworzyć okno wiersza poleceń z odpowiednimi uprawnieniami. Aby uzyskać listę wszystkich dostępnych witryn, należy wykonać następujące polecenie: appcmd list sites
Zwrócone dane wynikowe będą zawierać nazwę witryny, jej wewnętrzny identyfikator, powiązania witryny oraz jej bieżący stan. Na przykład dla zdefiniowanej wcześniej witryny Witryna demo PHP polecenie zwróci następujące informacje: SITE "Default Web Site" (id:1,bindings:http/*:80:,state:Started) SITE "Witryna demo PHP" (id:2,bindings:http/*:80:www.witrynademophp.site,http/*:80: ´witrynademophp.site, http/*:1234:witrynademophp.site,state:Started)
Aby zatrzymać działanie witryny, należy wykonać następujące polecenie: appcmd stop site "Nazwa witryny"
Z kolei aby witrynę uruchomić, trzeba wykonać następujące polecenie: appcmd start site "Nazwa witryny"
Narzędzie appcmd nie udostępnia opcji, która odpowiadałaby poleceniu Uruchom ponownie Menedżera IIS. Aby zrestartować witrynę przy użyciu appcmd, trzeba po prostu ją zatrzymać, a potem na nowo uruchomić.
Aplikacje W IIS aplikacjami są kolekcje zgrupowanych ze sobą plików. Zazwyczaj aplikacje zawierają pliki wykonywalne oraz skrypty. Z każdą aplikacją skojarzony jest katalog wirtualny — tak zwany katalog główny (ang. root directory). Do każdej witryny przypisana jest co najmniej jedna aplikacja — tak zwana aplikacja główna (ang. root application).
ROZDZIAŁ 2. Architektura IIS 49
Aplikacje grupuje się w tak zwane pule aplikacji (ang. application pools). Dzięki temu IIS utrzymuje podział między poszczególnymi środowiskami wykonania. Środowiska są od siebie odizolowane, co pozytywnie wpływa zarówno na bezpieczeństwo, jak i dostępność serwera WWW i aplikacji. Jeżeli aplikacje są prawidłowo zaimplementowane i skonfigurowane, można je z łatwością przenosić z jednego serwera WWW na inny. Serwer IIS pozwala na to, aby w poszczególnych aplikacjach stosować różne konfiguracje PHP, tak na poziomie serwera WWW, jak i na poziomie poszczególnych witryn. Więcej informacji na ten temat przedstawię w rozdziale 3.
Ścieżki i foldery Jak wspomniałem przed chwilą, każda aplikacja posiada co najmniej jeden wirtualny katalog główny. Ścieżka dostępu do katalogu głównego jest elementem adresu URL aplikacji. Nową aplikację można utworzyć na dowolnej spośród kilku warstw:
Witryna — każda witryna posiada co najmniej jedną aplikację główną, która jest generowana automatycznie. Do witryny można oczywiście dodawać kolejne aplikacje.
Folder albo katalog wirtualny — aplikację można również umieścić w katalogu lub folderze wirtualnym. W takim przypadku ścieżka dostępu do aplikacji składa się ze ścieżki dostępu do folderu lub katalogu wirtualnego oraz ścieżki do aplikacji. Jednak fizyczna ścieżka dostępu do aplikacji (czyli przypisany folder) może być niezależna od folderu lub katalogu wirtualnego.
Aplikacja — aplikacje można zagnieżdżać. Ścieżki adresów URL oraz ścieżki fizyczne powstają wówczas na takich samych zasadach jak w przypadku folderów lub katalogów wirtualnych.
Przykłady widoczne w tabeli 2.1 ilustrują połączenia między ścieżkami i folderami. Ścieżką dostępu przykładowej aplikacji jest mojaaplikacja, zaś folderem głównym (ścieżką fizyczną) jest C:\mojaaplikacja. W folderze głównym aplikacji znajduje się plik info.html. Ścieżka fizyczna pliku info.html jest niezależna od folderu elementu nadrzędnego. TABELA 2.1. Przykładowe połączenia między ścieżkami aplikacji i folderami
Element
Ścieżka
Folder
Ścieżka do info.html
Ścieżka fizyczna
Witryna
/
C:\inetpub\ wwwroot
/mojaaplikacja/info.html
C:\mojaaplikacja\info.html
Folder
/galeria
C:\inetpub\ wwwroot\galeria
/galeria/mojaaplikacja/info.html
C:\mojaaplikacja\info.html
Katalog wirtualny
/aplikacje/galeria
C:\aplikacja-galeria
/aplikacje/galeria/mojaaplikacja/ info.html
C:\mojaaplikacja\info.html
Aplikacja
/aplikacjephp
C:\aplikacjephp
/aplikacjephp/mojaaplikacja/ info.html
C:\mojaaplikacja\info.html
50 CZĘŚĆ I Internet Information Services (IIS)
Definiowanie nowej aplikacji Nową aplikację można zdefiniować w Menedżerze IIS albo z poziomu wiersza poleceń. Definiowanie aplikacji w Menedżerze IIS Aby zdefiniować nową aplikację w Menedżerze IIS, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia kliknij prawym przyciskiem myszy witrynę, folder, katalog wirtualny
lub istniejącą aplikację, do której chcesz dodać nową aplikację, a następnie w menu podręcznym wybierz polecenie Dodaj aplikację. Na ekranie pojawi się okno dialogowe Dodawanie aplikacji, widoczne na rysunku 2.5.
RYSUNEK 2.5. Okno dialogowe Dodawanie aplikacji
3. W polu tekstowym Alias wpisz ścieżkę dostępu do aplikacji.
Ścieżka podana w tym polu tekstowym stanie się elementem adresu URL. 4. Domyślną pulą aplikacji widoczną w polu Pula aplikacji jest pula elementu nadrzędnego.
Aby wskazać inną pulę aplikacji, naciśnij przycisk Wybierz. W wyświetlonym oknie dialogowym, na liście rozwijanej Pula aplikacji, wybierz pożądaną aplikację, a następnie naciśnij przycisk OK, aby zatwierdzić wybór. 5. Wpisz pożądaną ścieżkę fizyczną do aplikacji. 6. Naciśnij przycisk OK, aby zatwierdzić zmiany.
W ten sposób utworzyłeś nową aplikację i wiesz już także, jak można jej przypisać istniejącą pulę aplikacji. Definiowanie aplikacji w wierszu poleceń Poleceniem appcmd add app można tworzyć aplikacje z poziomu wiersza poleceń i dodawać do nich pule aplikacji. Najważniejszą różnicą między tworzeniem aplikacji w wierszu poleceń a tą samą czynnością wykonywaną w Menedżerze IIS jest to, że w wierszu poleceń trzeba wskazać
ROZDZIAŁ 2. Architektura IIS 51
ścieżkę aplikacji wraz ze ścieżkami wszystkich jej elementów nadrzędnych. Na przykład aby stworzyć aplikację mojaaplikacja w katalogu wirtualnym galeria, który znajduje się bezpośrednio pod katalogiem głównym witryny, w poleceniu appcmd trzeba wskazać ścieżkę /galeria/mojaaplikacja. Aby zdefiniować aplikację o takich samych parametrach jak aplikacja utworzona w poprzednim punkcie w Menedżerze IIS, należałoby wykonać następujące polecenie: appcmd add app /site.name:"Default Web Site" /path:/mojaaplikacja /physicalPath:"C:\inetpub\ ´aplikacjaphp"
Poleceniem appcmd można też zmienić pulę aplikacji. Również w takim przypadku konieczne jest wskazanie nazwy witryny wraz ze ścieżką. Na przykład aby dla aplikacji, którą przed chwilą stworzyłeś, zmienić pulę aplikacji na pulę Witryna demo PHP, należałoby wykonać następujące polecenie: appcmd set app "Default Web Site/mojaaplikacja" /applicationPool:"Witryna demo PHP"
Zmiana ustawień aplikacji Aby zmienić ustawienia istniejącej aplikacji, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wskaż aplikację, której ustawienia chcesz zmienić. 3. W panelu Akcje wybierz polecenie Ustawienia podstawowe.
W odpowiedzi wyświetlone zostanie okno dialogowe Edytowanie witryny. 4. Zmień dane zgodnie z opisem przedstawionym w poprzednim punkcie
„Definiowanie nowej aplikacji”. Ustawienia aplikacji można zmienić także poleceniem appcmd set app wykonanym w wierszu poleceń. Na podstawie poleceń widocznych poniżej można się dowiedzieć, jakie ustawienia można zmieniać: appcmd set app /? appcmd set app "Pełna ścieżka do aplikacji" /?
UWAGA Sposób, w jaki zmienia się pulę aplikacji, opisałem w punkcie „Definiowanie aplikacji w wierszu poleceń” nieco wcześniej w tym rozdziale.
Katalogi wirtualne Katalog wirtualny to skojarzenie ścieżki z wybranym folderem. Dzięki temu widoczna na zewnątrz struktura witryny internetowej może pozostać niezależna od rzeczywistej struktury katalogów na serwerze WWW.
52 CZĘŚĆ I Internet Information Services (IIS)
Jeśli chodzi o hierarchię konfiguracji, to elementem nadrzędnym względem katalogów wirtualnych mogą być wyłącznie aplikacje. Jednak ponieważ ścieżki można przypisywać w sposób dość dowolny, katalogi wirtualne mogą występować na dowolnym poziomie hierarchii ścieżek, w tym również jako elementy potomne witryn, folderów albo innych katalogów wirtualnych. Jeżeli konfiguracja wykonywana jest w Menedżerze IIS, narzędzie to samo będzie odpowiednio przekształcać ścieżki. Jeżeli natomiast będziesz używać polecenia appcmd, o odpowiednie przekształcenia ścieżek będziesz musiał zadbać samodzielnie.
Definiowanie katalogu wirtualnego w Menedżerze IIS Aby utworzyć katalog wirtualny w Menedżerze IIS, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS kliknij prawym przyciskiem myszy ten element,
dla którego chcesz stworzyć katalog wirtualny (na przykład witrynę). Następnie w menu podręcznym wybierz polecenie Dodaj katalog wirtualny. Wyświetlone zostanie okno dialogowe Dodawanie katalogu wirtualnego. 2. W polu tekstowym Alias wpisz ścieżkę do katalogu.
Ścieżka, którą wpiszesz w tym polu, stanie się elementem adresu URL. 3. Wpisz pożądaną ścieżkę fizyczną do katalogu. 4. Naciśnij przycisk OK, aby zatwierdzić zmiany.
Aby uzyskać listę wszystkich katalogów wirtualnych dla witryny, wybierz tę witrynę w panelu Połączenia, a następnie w panelu Akcje kliknij polecenie Wyświetl katalogi wirtualne. Na ekranie z listą katalogów wirtualnych można także dodawać nowe katalogi.
Definiowanie katalogu wirtualnego w wierszu poleceń Aby utworzyć katalog wirtualny w wierszu poleceń, trzeba użyć znanego nam już polecenia appcmd. Jak wspomniałem już wcześniej, w treści polecenia trzeba wskazać ścieżki odnoszące się do aplikacji nadrzędnej. Aby zdefiniować nowy katalog wirtualny, wykonaj następujące polecenie: appcmd add vdir /app.name:"Witryna demo PHP/" /path:/daniel /physicalPath:c:\inetpub\user\daniel
W tabeli 2.2 znajdują się trzy przykłady, które pokazują, jak IIS tworzy ścieżki do katalogów wirtualnych. W pierwszym przykładzie katalog wirtualny znajduje się bezpośrednio pod główną aplikacją witryny. Elementem nadrzędnym w drugim przykładzie także jest aplikacja główna, jednak sam katalog wirtualny został zdefiniowany jeden poziom niżej. W tym przykładzie folder user mógłby istnieć już wcześniej, choć nie jest to konieczne. Poza tym folder /user może być jednocześnie innym katalogiem wirtualnym. W trzecim przykładzie /user jest samodzielną aplikacją i dlatego ma inną ścieżkę. Jeżeli chcesz utworzyć katalog wirtualny w aplikacji, musisz podać ścieżkę względną w stosunku do tej aplikacji.
ROZDZIAŁ 2. Architektura IIS 53 TABELA 2.2. Przykładowe ścieżki dla katalogów wirtualnych
Ścieżka aplikacji
Względna ścieżka do katalogu
Adres URL katalogu
Witryna demo PHP/
/daniel
http://witrynademophp.site/daniel
Witryna demo PHP/
/user/daniel
http://witrynademophp.site/user/daniel
Witryna demo PHP/user/
/daniel
http://witrynademophp.site/user/daniel
UWAGA Za pomocą polecenia appcmd list vdir można wyświetlić listę wszystkich katalogów wirtualnych zdefiniowanych na serwerze.
Przetwarzanie żądań HTTP Serwer IIS w wersji 7 został gruntownie zmodernizowany. Najważniejszą zmianą jest poprawa modułowej budowy serwera, dzięki czemu zasoby są teraz wykorzystywane bardziej oszczędnie, wydajność serwera jest wyższa, użytkownik ma zdecydowanie większe możliwości w zakresie dostosowywania instalacji IIS do wymagań swoich aplikacji, a także, co nie mniej ważne, zdecydowanie zmniejszyło się pole do wykonywania potencjalnych ataków, dzięki czemu serwer jest znacznie bezpieczniejszy. W kolejnych punktach pokażę, w jaki sposób serwer IIS przetwarza żądania HTTP. Gdy zrozumiesz już sekwencję czynności zmierzających do przetworzenia żądania, znacznie łatwiej będzie Ci konfigurować IIS i identyfikować błędy konfiguracji oraz problemy w działaniu serwera. Opis zawarty w kolejnych punktach bynajmniej nie wyczerpuje tematu, lecz skupia się jedynie na tych zagadnieniach, które są istotne z punktu widzenia programistów PHP. IIS pozwala na osadzanie modułów i komponentów, które muszą być zaimplementowane jako zarządzane moduły .NET (na przykład przeznaczone do użycia wraz z ASP.NET) bądź też napisane w języku C++. Tworzenie w PHP modułów zarządzanych, które można by osadzać na serwerze IIS, nie jest obecnie możliwe.
Ogólny opis przetwarzania żądań HTTP Na rysunku 2.6 znajduje się schemat procesu przetwarzania żądania HTTP. Proces ten składa się z następujący etapów: 1. Klient, zazwyczaj przeglądarka internetowa, generuje żądanie HTTP i wysyła je do serwera. 2. Stos protokołu HTTP http.sys przyjmuje żądanie. Stos protokołu jest częścią podsystemu
sieci systemu operacyjnego i działa w trybie jądra, czyli odpowiada za natychmiastowe przetwarzanie, zwłaszcza tych żądań, które znajdują się w pamięci podręcznej. Stos protokołu HTTP przekazuje żądanie do usługi Windows Process Activation Service (WAS), która sprawdza konfigurację witryny WWW.
54 CZĘŚĆ I Internet Information Services (IIS) 3. WAS odczytuje dane konfiguracyjne witryny WWW z pliku konfiguracyjnego
applicationHost.config, który znajduje się w pamięci. Dane te trafiają do usługi WWW Publishing Service. Dane konfiguracyjne zawierają na przykład informacje na temat tego, której puli aplikacji należy użyć. 4. WWW Publishing Service przygotowuje stos protokołu HTTP na odpowiedź z puli
aplikacji. 5. WAS uruchamia proces aplikacji (w3wp.exe) dla wybranej puli aplikacji i przekazuje
do niego dane pochodzące z żądania. 6. Proces aplikacji obsługuje żądanie. Jeżeli żądanie odnosi się do skryptu PHP, wówczas
w ramach tego kroku wykonany zostaje program wykonywalny PHP. Wynik tego przetwarzania zostaje zwrócony do stosu protokołu HTTP. 7. Stos protokołu HTTP zwraca pełne, przetworzone wyniki do klienta internetowego jako
odpowiedź na żądanie HTTP przesłane w kroku numer 1. Czynność ta kończy proces przetwarzania żądania.
RYSUNEK 2.6. Proces przetwarzania żądania http
Przebieg procesu aplikacji W procesie aplikacji żądanie HTTP zostaje poddane szeregowi kolejnych czynności, zgodnie ze schematem widocznym na rysunku 2.7. Poszczególne etapy tego procesu oraz zdarzenia są obsługiwane przez moduły zintegrowane w systemie. W ramach przykładu na rysunku 2.7 przedstawiono moduły odpowiedzialne za anonimowe uwierzytelnienie, obsługę pliku statycznego oraz dokument domyślny. Inne moduły odpowiadają na przykład za obsługę dziennika zdarzeń albo za odpytywanie i uaktualnianie pamięci podręcznej.
ROZDZIAŁ 2. Architektura IIS 55
RYSUNEK 2.7. Przetwarzanie żądania w procesie aplikacji
Gdy wywołuje się moduł zarządzany (zwykle zaimplementowany w technologii .NET, na przykład w ASP.NET), wówczas moduł zarządzający odpowiada za wszystkie niezbędne czynności związane z utworzeniem instancji modułu zarządzanego i zarządzaniem nim. Zdarzenia istotne dla programistów PHP to przypisanie uchwytu (ang. handler assignment) oraz wykonanie uchwytu (ang. handler execution). Serwer IIS wybiera uchwyt odpowiedni dla przetwarzanego żądania zgodnie z bieżącą konfiguracją. Na przykład żądanie pliku graficznego lub zwykłego pliku HTML zostanie przekazane do modułu odpowiedzialnego za obsługę treści statycznych (StaticFile). Z kolei żądanie adresowane do wykonywalnego programu PHP zostanie przekazane do modułu FastCGI, który następnie uruchomi interpreter języka PHP. Dane wynikowe (czyli wynik wykonania programu PHP) zostaną zwrócone do procesu aplikacji, po czym wykonane zostaną pozostałe etapy procesu przetwarzania.
Moduły Ze względu na modułową budowę serwera IIS można go precyzyjnie dostosowywać do wymagań tworzonej aplikacji. Jak napisałem już w poprzednim punkcie, proces aplikacji, który odpowiada za obsługę żądania skierowanego do aplikacji, sam składa się z dość znacznej liczby etapów. Aby uzyskać listę dostępnych modułów, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz odpowiedni serwer.
Wyświetlona zostanie strona Dom serwera. 3. Na stronie Dom serwera wybierz polecenie Moduły.
56 CZĘŚĆ I Internet Information Services (IIS) 4. Jeżeli konfigurowałeś własne środowisko robocze zgodnie z opisem, który przedstawiłem
w rozdziale 1. „Konfiguracja środowiska roboczego”, lista dostępnych modułów powinna odpowiadać liście przedstawionej w tabeli 2.3. TABELA 2.3. Wewnętrzne moduły systemu operacyjnego, instalowane domyślnie
Nazwa modułu
Opis modułu
AnonymousAuthenticationModule
Generuje odpowiedni obiekt HttpUser przeznaczony do anonimowego uwierzytelnienia.
CgiModule
Implementuje Common Gateway Interface (CGI).
CustomErrorModule
Zezwala na korzystanie z własnych komunikatów o błędach oraz szczegółowych komunikatów o błędach IIS 7.
DefaultDocumentModule
Przekierowuje żądania HTTP zakończone znakiem ukośnika ("/") do dokumentu domyślnego zgodnego z bieżącą konfiguracją.
DirectoryListingModule
Pozwala na wyświetlanie i przeszukiwanie folderów.
FastCgiModule
Udostępnia moduł FastCGI wykorzystywany przez PHP.
HttpCacheModule
Zapisuje odpowiedź HTTP w pamięci podręcznej. Implementuje logikę trybu jądra z http.sys.
HttpLoggingModule
Obsługuje domyślny mechanizm zapisywania w dzienniku zdarzeń informacji o żądaniach za pośrednictwem http.sys.
ProtocolSupportModule
Pozwala wykorzystywać własny nagłówek odpowiedzi HTTP oraz nagłówek przekierowania, metody TRACE i OPTIONS protokołu HTTP oraz konfigurację HTTP Keep Alive.
RequestFilteringModule
Moduł zabezpieczeń, który filtruje podejrzane żądania.
StaticCompressionModule
Kompresuje treści statyczne, aby zmniejszyć ilość przesyłanych danych.
StaticFileModule
Wysyła treści statyczne wraz z odpowiednim typem danych MIME — na przykład pliki HTML, CSS lub pliki graficzne.
Pule aplikacji Żądania są przetwarzane w aplikacjach, które są grupowane w pule aplikacji, zgodnie z opisem z poprzedniego rozdziału. IIS zarządza pulami aplikacji, uruchamia nowe procesy aplikacji w przypadku, gdy wrasta liczba otrzymywanych żądań, a także kończy wykonywanie procesów aplikacji, gdy liczba tych żądań spada i należy zmniejszyć ilość wykorzystywanych zasobów.
Tworzenie pul aplikacji w Menedżerze IIS Podana poniżej procedura opisuje, jak tworzy się nową pulę aplikacji: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz pozycję Pule aplikacji. 3. W panelu Akcje kliknij polecenie Dodaje pulę aplikacji.
ROZDZIAŁ 2. Architektura IIS 57 4. W polu tekstowym Nazwa w oknie dialogowym, które pojawi się na ekranie, wpisz nazwę
nowej puli aplikacji. Microsoft zaleca, aby dla ustawień Zarządzany tryb potokowy oraz Wersja architektury .NET Framework zaakceptować wartości domyślne (w przypadku zarządzanego trybu potokowego wartością domyślną jest Zintegrowany). 5. Naciśnij przycisk OK.
W ten sposób tworzy się nową pulę aplikacji, której można używać do tworzenia nowych aplikacji.
Tworzenie pul aplikacji w wierszu poleceń Aby utworzyć nową pulę aplikacji w wierszu poleceń, należy użyć polecenia appcmd add apppool i podać w nim nazwę puli, jak w poniższym poleceniu przykładowym: appcmd add apppool /name:"AplikacjaPhp"
Aby uzyskać listę wszystkich istniejących pul aplikacji, wykonaj następujące polecenie: appcmd list apppool
Z kolei aby wyświetlić obowiązujące właściwości konfiguracyjne wybranej puli aplikacji, wykonaj jedno z dwóch poniższych poleceń: appcmd list apppool /config "AplikacjaPhp" appcmd list apppool /text:* "AplikacjaPhp"
Tożsamość puli aplikacji Pule aplikacji odgrywają także istotną rolę w obszarze bezpieczeństwa, ponieważ chronią procesy aplikacji przed procesami z innych pul aplikacji. Dzięki temu aplikacje są od siebie całkowicie rozdzielone również na poziomie procesów. Dla każdej puli aplikacji IIS tworzy wirtualne konto z unikatowym identyfikatorem bezpieczeństwa (ang. unique security identifier — SID). Takie konto wirtualne nie jest tym samym co konto użytkownika, dlatego nie występuje na liście lokalnych użytkowników. Z drugiej jednak strony konto wirtualne posiada nazwę puli aplikacji. Na przykład kontem wirtualnym dla domyślnej puli aplikacji jest IIS AppPool\DefaultAppPool. Dla aplikacji, które będziesz tworzył, obecność takiej architektury oznacza, że procesy aplikacji (w tym również procesy FastCGI PHP) działają w kontekście tożsamości puli aplikacji. Dzięki temu każdemu kontu niezależnie można przypisywać uprawnienia dostępu do plików — będzie to kolejny element separacji programów PHP (i innych) od siebie, tym razem na poziomie dostępu do danych.
58 CZĘŚĆ I Internet Information Services (IIS)
Wskazywanie tożsamości puli aplikacji w Menedżerze IIS IIS pozwala na wskazanie tożsamości, na której ma być uruchamiana wskazana pula aplikacji. Aby wskazać tożsamość (użytkownika) w Menedżerze IIS, wykonaj następujące czynności: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz pozycję Pule aplikacji. 3. Wybierz pulę aplikacji, którą chcesz skonfigurować w środowisku roboczym, a następnie
w panelu Akcje wybierz pozycję Ustawienia zaawansowane. Wyświetlone zostanie okno dialogowe Ustawienia zaawansowane, widoczne na rysunku 2.8.
RYSUNEK 2.8. Wskazywanie tożsamości puli aplikacji
4. W sekcji Model procesu kliknij przycisk […] z prawej strony właściwości Tożsamość.
Wyświetlone zostanie kolejne okno dialogowe Tożsamość puli aplikacji. 5. W oknie dialogowym można wskazać Konto wbudowane (z listy rozwijanej)
albo Konto niestandardowe.
Jeśli zdecydujesz się na Konto wbudowane, powinieneś użyć opcji ApplicationPoolIdentity, ponieważ dzięki temu każda pula aplikacji automatycznie będzie używać innej tożsamości.
ROZDZIAŁ 2. Architektura IIS 59
Aby wskazać Konto niestandardowe, kliknij przycisk Ustaw, a następnie wpisz nazwę konta oraz hasło. Hasło zostanie automatycznie zaszyfrowane w ustawieniach konfiguracyjnych.
6. Dwa razy naciśnij przycisk OK, aby zamknąć okna dialogowe.
Wskazywanie tożsamości puli aplikacji w wierszu poleceń Aby wskazać tożsamość puli aplikacji w wierszu poleceń, wykonaj następujące polecenie: appcmd set apppool AplikacjaPhp /processModel.identityType:ApplicationPoolIdentity
Jako typ tożsamości (identityType) możesz wskazać ApplicationPoolIdentity, LocalSystem, LocalService, NetworkService lub SpecificUser. Aby wskazać konto niestandardowe, będziesz musiał dodatkowo podać nazwę użytkownika oraz jego hasło w następujący sposób: appcmd set apppool AplikacjaPhp /processModel.identityType:SpecificUser /processModel.userName:KontoUżytkownika /processModel.password:HasłoUżytkownika
Podane hasło zostanie automatycznie zaszyfrowane w ustawieniach konfiguracyjnych.
FastCGI Niezwykle ważną nowością w IIS 7 jest możliwość użycia FastCGI do przetwarzania żądań HTTP. FastCGI zapewnia zdecydowanie wyższą wydajność niż starsze CGI, wciąż często wykorzystywane do obsługi PHP. W porównaniu do powiązań PHP jako modułu ISAPI FastCGI charakteryzuje się wyższą stabilnością i bardziej elastycznymi możliwościami konfiguracji.
FastCGI a CGI CGI to standard, który pozwala na wiązanie dowolnego programu z serwerem WWW. Program uruchamiany przez CGI działa w postaci niezależnego procesu. Na rysunku 2.9 znajduje się schemat tego procesu, a jego etapy są następujące: 1. Klient internetowy generuje żądanie HTTP i wysyła je do serwera WWW (IIS).
RYSUNEK 2.9. Przetwarzanie żądania PHP przy użyciu CGI
60 CZĘŚĆ I Internet Information Services (IIS) 2. Serwer WWW przetwarza żądanie. Najpierw w postaci niezależnego procesu
uruchamiany jest interpreter PHP, do którego przekazane zostają dane żądania HTTP (zgodnie ze standardem CGI). 3. Program PHP oblicza wynik i zwraca odpowiedź za pośrednictwem CGI do serwera WWW.
Następnie program PHP oraz skojarzony z nim proces kończą działanie. 4. Serwer WWW zwraca do klienta internetowego odpowiedź pochodzącą z programu PHP.
Oczywistą wadą CGI jest to, że PHP musi być na nowo uruchamiany przy okazji obsługi każdego nowego żądania PHP. Taki sposób działania zwiększa zużycie zasobów i skutkuje zdecydowanym obniżeniem wydajności w porównaniu z wydajnością działania FastCGI. W przypadku FastCGI proces obsługi żądania przebiega w sposób przedstawiony na rysunku 2.10 i składa się z następujących czynności: 1. Klient internetowy generuje żądanie. 2. Serwer WWW przetwarza żądanie i przekazuje je do wolnego procesu PHP (czyli takiego,
który aktualnie nie wykonuje żadnych działań) należącego do puli aplikacji. 3. Program PHP oblicza wynik i zwraca odpowiedź do serwera WWW. Jednak w FastCGI
proces PHP nie zostaje w tym momencie zakończony — jest on jedynie zwalniany do przetwarzania kolejnych żądań. 4. Serwer WWW zwraca odpowiedź do klienta internetowego.
RYSUNEK 2.10. Proces przetwarzania żądania PHP przy użyciu FastCGI
Zdecydowanie wyższa wydajność działania FastCGI wynika z faktu, że IIS może wielokrotnie wykorzystywać ten sam proces PHP i unikać w ten sposób „zasobożernych” czynności uruchamiania i zakańczania procesu PHP, wykonywanych przez CGI. FastCGI posiada wszystkie zalety CGI, takie jak oddzielenie od siebie procesów serwera WWW i PHP. Ponadto FastCGI pozwala na korzystanie z wersji PHP bez bezpiecznych wątków, ponieważ każdy proces PHP wykonuje w danym momencie tylko jedno żądanie. PHP nie musi więc wykonywać dodatkowych, obciążających czynności kontrolnych niezbędnych do zapewnienia bezpieczeństwa wątków, co ma bardzo pozytywny wpływ na wydajność.
ROZDZIAŁ 2. Architektura IIS 61
FastCGI a ISAPI Zanim w IIS udostępniono FastCGI, jedyną alternatywą dla CGI było wiązanie PHP jako rozszerzenia ISAPI. PHP skonfigurowany jako rozszerzenie ISAPI działa bezpośrednio w ramach procesu aplikacji serwera WWW. To również zapobiega ciągłemu uruchamianiu i zatrzymywaniu PHP do obsługi każdego kolejnego żądania, dzięki czemu PHP działające jako rozszerzenie ISAPI zapewnia wysoki poziom wydajności działania i przepływu danych. Niestety, uruchamianie PHP w postaci rozszerzenia ISAPI niesie ze sobą także niedogodności, które wynikają z braku oddzielenia od serwera WWW. W takiej sytuacji zarówno PHP, jak i serwer WWW korzystają z tego samego konta użytkownika i z tych samych praw dostępu. Oddzielenie obydwóch komponentów od siebie, aby zwiększyć poziom bezpieczeństwa, jest niestety niemożliwe. Co więcej, w takiej architekturze można napotkać problemy ze stabilnością — wszak IIS może przekazać do rozszerzenia ISAPI kilka żądań jednocześnie, które powinny zostać obsłużone przez ten jeden proces równolegle. Jednak niektóre rozszerzenia PHP nie zapewniają bezpieczeństwa wątków, które jest niezbędne, aby można było równolegle przetwarzać żądania. UWAGA Opisana powyżej niedogodność jest jednym z powodów, dla których PHP od wersji 5.3 nie obsługuje już wiązania jako rozszerzenia ISAPI. Obecnie PHP jest wiązane wyłącznie jako FastCGI.
Podsumowanie W tym rozdziale przedstawiłem ogólny opis architektury i funkcji serwera IIS. Poruszyłem zagadnienia dotyczące witryn, aplikacji i katalogów wirtualnych, przedstawiłem proces przetwarzania żądania HTTP, a także powody, dla których IIS używa pul aplikacji odwzorowanych na konkretne aplikacje. Wraz z opisem FastCGI i jego zalet wszystkie te informacje stanowią podstawę do kontynuacji naszych rozważań na temat możliwości konfiguracyjnych PHP i IIS w następnych dwóch rozdziałach.
62 CZĘŚĆ I Internet Information Services (IIS)
Rozdział 3.
Konfigurowanie serwera IIS W tym rozdziale: Pliki konfiguracyjne .............................................................................................................64 Struktura konfiguracji .........................................................................................................65 Schemat i configSections ...................................................................................................69 Konfigurowanie ścieżek za pomocą elementów location ..................................................69 Witryny, aplikacje i katalogi ...............................................................................................71 Blokowanie konfiguracji .....................................................................................................75 Podsumowanie ....................................................................................................................82
Sposób konfigurowania serwera Internetowe Usługi Informacyjne w wersji 7 został całkowicie przemodelowany. Zamiast jednej scentralizowanej konfiguracji w IIS 7 konfiguracja jest rozrzucana w kilku plikach, zależnie od struktury witryn internetowych i aplikacji. Nowością jest także zastosowanie rozpowszechnionego już języka XML jako formatu plików konfiguracyjnych. W tym rozdziale przedstawię sposoby konfigurowania serwera IIS. Opis ten będzie dość szczegółowy, jednak aby zawrzeć wszystkie informacje na ten temat, konieczne byłoby poświęcenie im oddzielnej książki. W zamian skupię się na ogólnej strukturze konfiguracyjnej IIS 7 — w szczególności na konfigurowaniu podstawowych komponentów serwera (takich jak witryny, aplikacje i katalogi wirtualne), które znajdują się w centrum zainteresowania programistów PHP. W rozdziale opiszę także opcje konfiguracji niektórych ścieżek dostępu, definiowane przy użyciu elementów location. Na koniec pokażę, w jaki sposób można blokować wybrane elementy konfiguracji, a w konsekwencji delegować możliwość administrowania niektórymi elementami serwera IIS. Możliwość blokowania wybranych fragmentów konfiguracji jest szczególnie istotna dla firm, które udostępniają serwery WWW, ponieważ dzięki temu mogą one przydzielić swoim klientom ograniczone prawa administracyjne i w ten sposób umożliwić im samodzielne administrowanie ich własnymi aplikacjami.
64 CZĘŚĆ I Internet Information Services (IIS)
Pliki konfiguracyjne IIS zapisuje ustawienia konfiguracyjne w zwykłych plikach tekstowych. Dzięki temu łatwiej jest te pliki kopiować, tworzyć ich kopie zapasowe i edytować. W skrócie — do administrowania serwerem można używać standardowych narzędzi używanych na co dzień. Odczytywać i edytować konfigurację serwera IIS można na kilka sposobów:
Ręcznie, za pomocą edytora tekstu.
Przy użyciu interfejsów programowania aplikacji (API) w kodzie programów natywnych i zarządzanych.
Za pomocą dedykowanych narzędzi, takich jak Windows PowerShell czy polecenia appcmd.
Za pośrednictwem graficznego interfejsu użytkownika, na przykład w Menedżerze IIS.
IIS śledzi wszelkie zmiany dokonane w plikach konfiguracyjnych, dzięki czemu wszelkie zmiany konfiguracji zostają uwzględnione natychmiast, bez konieczności restartu komputera ani ponownego uruchamiania serwera. W porównaniu z wcześniejszymi wersjami serwera IIS jest to bardzo istotna zmiana. Jedynym źródłem ustawień konfiguracyjnych są pliki konfiguracyjne, a nie ich zawartość przechowywana w pamięci.
Konfiguracja globalna Ustawienia konfiguracyjne serwera IIS są rozsiane w kilku plikach. Takie podejście wynika z charakterystyki samego systemu, a jednocześnie jest źródłem kilku niezaprzeczalnych zalet. Pliki konfiguracyjne tworzą pewną hierarchię. Na górze znajdują się ustawienia konfiguracyjne obowiązujące na całym serwerze. IIS rozpoznaje dwa (lub trzy) globalne pliki konfiguracyjne:
applicationHost.config zawiera ustawienia konfiguracyjne serwera IIS (i znajduje się w folderze C:\Windows\System32\inetsrv).
machine.config zawiera ustawienia konfiguracyjne platform .NET Framework i ASP.NET (i znajduje się w folderze C:\Windows\Microsoft.NET\Framework\[numer wersji]\CONFIG).
Główny plik konfiguracyjny web.config znajduje się w tym samym folderze i zawiera ustawienia dodatkowe.
Ustawienia konfiguracyjne zostały rozdzielone między wspomnianymi plikami dlatego, że IIS i Microsoft .NET są dwiema oddzielnymi technologiami, o innych cyklach rozwoju.
Konfiguracja rozproszona Oprócz globalnych plików konfiguracyjnych na serwerze znajdują się też rozproszone pliki konfiguracyjne web.config. Rozproszone pliki konfiguracyjne definiują fizyczny układ witryn internetowych, aplikacji, katalogów wirtualnych oraz fizycznych folderów.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 65
Pliki konfiguracyjne tworzą hierarchię, zgodnie z rysunkiem 3.1. Na górze tej hierarchii znajduje się plik machine.config oraz główny plik web.config. Na następnym poziomie znajduje się applicationHost.config. Ustawienia zdefiniowane w kolejnych plikach w hierarchii pokrywają lub rozszerzają ustawienia zdefiniowane w plikach z wyższych poziomów.
RYSUNEK 3.1. Hierarchia plików konfiguracyjnych
Konfiguracja globalna jest potem rozszerzana przez rozproszone ustawienia konfiguracyjne zdefiniowane w plikach web.config. Ustawienia rozproszone dotyczą tylko witryn, katalogów i folderów (a także ich elementów podrzędnych), w których dany web.config się znajduje. Ustawienia konfiguracyjne, które znajdują się niżej w hierarchii, również w tym przypadku nadpisują lub rozszerzają te ustawienia, które znajdują się na wyższym poziomie hierarchii. UWAGA Administratorzy serwerów Apache powinni traktować pliki web.config jako odpowiedniki plików .htaccess, natomiast applicationHost.config jako plik konfiguracyjny, który odpowiada plikowi httpd.conf.
Dzięki tak określonej strukturze konfiguracji dla poszczególnych aplikacji PHP można definiować szczegółowe ustawienia w oddzielnych plikach web.config, zgodne z wymaganiami tych aplikacji. Dzięki temu instalowanie, przenoszenie i kopiowanie aplikacji PHP stało się zdecydowanie prostsze i bardziej wygodne niż we wcześniejszych wersjach serwera IIS.
Struktura konfiguracji Ustawienia konfiguracyjne serwera IIS są pogrupowane w sekcjach. Ustawienia, które są ze sobą powiązane logicznie, są definiowane i przechowywane w jednej sekcji. Typowym elementem grupującym ustawienia konfiguracyjne jest moduł — każdy moduł posiada własną sekcję konfiguracji. Sekcje są niezależne, zasadniczo nie odwołują się do siebie i nie można ich zagnieżdżać.
66 CZĘŚĆ I Internet Information Services (IIS)
Sekcje i grupy sekcji Sekcje łączą się w grupy sekcji. Jedynym przeznaczeniem grup sekcji jest nadanie ustawieniom konfiguracyjnym odpowiedniej struktury. Grupy sekcji nie posiadają własnych właściwości ani ustawień. Ponieważ grupy sekcji można zagnieżdżać, tworzy się w ten sposób hierarchię konfiguracji. Na listingu 3.1 znajduje się przykład hierarchicznej struktury grup sekcji oraz samych sekcji. LISTING 3.1. Grupy sekcji i sekcje w pliku konfiguracyjnym
Elementy i listy konfiguracji Sekcje zawierają właściwe ustawienia konfiguracyjne zawarte w elementach i atrybutach. Właściwości są zapisywane w atrybutach, zaś elementy służą do grupowania. Jeżeli w danej właściwości trzeba skonfigurować więcej niż jedną pozycję, wówczas używa się kolekcji ustawień konfiguracyjnych. Przykładem takiej kolekcji ustawień konfiguracyjnych jest element system.webServer/tracing/traceProviderDefinitions/areas widoczny na listingu 3.1. Kolekcje ustawień konfiguracyjnych składają się z trzech następujących elementów:
dodaje pozycję konfiguracji. Każda pozycja zawiera atrybut określający nazwę (name) oraz, opcjonalnie, dodatkowe atrybuty określające wartości (na przykład value).
służy do usuwania pozycji konfiguracji. W ten sposób można odpowiednio dostosowywać konfigurację dla określonych obszarów serwera.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 67
usuwa wszystkie wcześniej zdefiniowane ustawienia. Instrukcja ta zapewnia, że
następujące po niej definicje lokalne są jedynymi ważnymi definicjami dla danej pozycji konfiguracji.
Przenoszenie i dołączanie sekcji Aby zachować przejrzystość, sekcje i grupy sekcji można przenosić do różnych plików. Na przykład dzięki temu plik applicationHost.config można rozdzielić na kilka oddzielnych plików, pomocnych w trakcie czynności administracyjnych. IIS automatycznie identyfikuje zmiany, które zaszły w plikach zewnętrznych. Nie trzeba zatem restartować serwera. Aby dołączyć dane pliki konfiguracyjne, trzeba zdefiniować atrybut configSource. Sposób, w jaki dokonuje się tej operacji, przedstawia listing 3.2. Zwróć uwagę, że w dołączanym pliku konfiguracyjnym głównym elementem konfiguracji musi być element configuration. LISTING 3.2. Dołączanie zewnętrznego pliku konfiguracyjnego applicationHost.config defaultDoc.config
Edytor konfiguracji Menedżer IIS udostępnia edytor konfiguracji, który służy do edycji podstawowych ustawień konfiguracyjnych serwera IIS. Trzeba jednak wiedzieć, który element konfiguracji ma podlegać edycji. Na przykład aby skonfigurować dokument domyślny (zgodnie z listingiem 3.2), wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz odpowiedni element. 2. Otwórz Edytor konfiguracji, dwukrotnie klikając go myszą. 3. Na liście rozwijanej Sekcja wybierz element konfiguracyjny, który chcesz edytować. 4. Na liście rozwijanej Od wskaż plik konfiguracyjny, którego chcesz użyć.
Na tym etapie możesz definiować i edytować elementy location (więcej napiszę o nich w punkcie „Konfigurowanie ścieżek za pomocą elementów location” w dalszej części tego rozdziału).
68 CZĘŚĆ I Internet Information Services (IIS) 5. W obszarze przestrzeni roboczej wyświetlone zostaną właściwości elementu. Możesz je
zmienić przez wpisywanie pozycji w przeznaczonych do tego polach tekstowych. 6. Kolekcje możesz edytować po naciśnięciu przycisku z prawej strony, widocznego na rysunku 3.2.
RYSUNEK 3.2. Edytor konfiguracji dostępny w Menedżerze IIS
Nowe pozycje można dodawać poleceniem Kolekcja/Dodaj, zaś właściwości już istniejących pozycji możesz edytować w panelu Właściwości. Po wykonaniu tych czynności zamknij okno dialogowe przyciskiem zamykania okna w prawym górnym rogu. 7. W panelu Akcje wybierz polecenie Zastosuj, aby wdrożyć dokonane zmiany. 8. W panelu Akcje kliknij polecenie Wyszukaj konfigurację, aby przeglądać i przeszukiwać
bieżącą konfigurację.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 69
Schemat i configSections Zawartość pliku XML z ustawieniami konfiguracyjnymi bazuje na schemacie, który znajduje się w folderze C:\Windows\System32\inetsrv\config\schema. Schemat ten definiuje składnię sekcji, elementów i atrybutów ustawień konfiguracyjnych. Dodatkowo schemat wskazuje domyślne wartości atrybutów, co jest o tyle wygodne, że nie musisz definiować wszystkich właściwości w pliku konfiguracyjnym — wystarczy bowiem, że zdefiniujesz tylko te właściwości, których wartości powinny być inne niż domyślne. Dzięki temu łatwiej jest analizować zawartość plików konfiguracyjnych. Plik applicationHost.config zawiera specjalną sekcję, która służy jako punkt rejestrowania innych sekcji i grup sekcji. Tą specjalną sekcją jest configSections. W sekcji configSections rejestruje się inne sekcje i grupy sekcji ustawień konfiguracyjnych serwera IIS w sposób pokazany na listingu 3.3. LISTING 3.3. Fragment sekcji configSections
Każdy moduł IIS posiada własny schemat konfiguracji oraz wpis w sekcji configSections. Za pomocą tego mechanizmu można także rozszerzać konfigurację serwera IIS o kolejne ustawienia i pozycje konfiguracji. W odniesieniu do aplikacji PHP, które będziesz implementował samodzielnie, ten mechanizm konfiguracyjny nie będzie mechanizmem pierwszego wyboru, jeśli porówna się go choćby ze zwykłymi plikami .ini. Przyczyną jest fakt, że aby uzyskać dostęp do aktualnie obowiązującej konfiguracji dla danej ścieżki, trzeba użyć Windows Management Instrumentation (WMI) albo narzędzi wiersza poleceń, takich jak appcmd.
Konfigurowanie ścieżek za pomocą elementów location Ustawienia konfiguracyjne serwera IIS są rozproszone w oddzielnych plikach: konfiguracja, która obowiązuje globalnie, znajduje się w pliku machine.config (oraz w globalnym pliku web.config), a także w pliku applicationHost.config. Z kolei konfiguracja lokalna, dla określonych ścieżek, znajduje się w plikach web.config umieszczonych w folderach przypisanych witrynom i aplikacjom.
70 CZĘŚĆ I Internet Information Services (IIS)
Takie rozproszenie ustawień konfiguracyjnych między lokalnymi plikami web.config na pewno ułatwia instalowanie aplikacji, jednak nie można z niego korzystać w niektórych sytuacjach. Przykładem takiej sytuacji są dwa katalogi wirtualne, które muszą mieć odmienną konfigurację, lecz obydwa wskazują na ten sam folder fizyczny, albo gdy ze względów bezpieczeństwa administrator woli przechowywać całą aplikację w jednym pliku. We wspomnianych przypadkach można użyć instrukcji location, za pomocą której daną konfigurację ogranicza się do określonej ścieżki (ścieżki URL, a nie fizycznej). Element location definiuje się przy użyciu atrybutu ścieżki path:
— ścieżka bieżąca.
— ścieżka aplikacji aplikacjaphp
witryny Witryna demo PHP.
— w odróżnieniu od plików web.config ścieżka location może wskazywać konkretne pliki — na przykład
index.php, jak w tym przykładzie. Jeżeli elementu location nie zdefiniowano w pliku applicationHost.config, lecz w pliku web.config, wówczas ścieżka ma charakter względny — inaczej mówiąc, ścieżka ta musi zaczynać się w lokalizacji pliku web.config. Nie można definiować ścieżek bezwzględnych. Przy użyciu location można modyfikować wyłącznie te ścieżki, które znajdują się niżej w hierarchii niż ścieżka location dla pliku web.config. W elemencie location używa się tych samych sekcji i grup sekcji jak w plikach konfiguracyjnych (spójrz na listing 3.4). W przykładzie włączona zostaje możliwość wyświetlania listy katalogów dla względnej ścieżki pobierania plików, która rozpoczyna się w bieżącej ścieżce pliku web.config zawierającego instrukcję location. Wprawdzie w normalnych okolicznościach pliki do pobrania znajdują się najczęściej w podfolderze folderu, w którym znajduje się web.config, jednak nie jest tak w każdym przypadku. Może to być bowiem ścieżka do katalogu wirtualnego, a to oznacza, że fizyczny folder z plikami do pobrania może znajdować się w zupełnie innej lokalizacji. LISTING 3.4. Instrukcja konfiguracyjna z elementem location
Konfiguracja w Menedżerze IIS Menedżer IIS pozwala edytować sekcje location wyłącznie w Edytorze konfiguracji. Inne narzędzia Menedżera IIS zapisują dane bezpośrednio do odpowiedniego pliku web.config. W pasku stanu, który znajduje się u dołu każdego otwartego okna, można sprawdzić, gdzie dane ustawienie konfiguracyjne zostanie zapisane.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 71
Poszczególne pliki konfiguruje się w sposób opisany poniżej (pozycja location jest zapisywana w pliku web.config folderu, w którym konfigurowany plik się znajduje). 1. W panelu Połączenia wybierz katalog, w którym znajduje się plik. 2. Naciśnij przycisk Widok zawartości, który znajduje się u dołu obszaru roboczego. 3. Wybierz plik, który chcesz skonfigurować, a następnie w panelu Akcje wybierz polecenie
Przełącz do widoku funkcji. Nastąpi powrót do widoku funkcji, tyle tylko że będą one dotyczyć tylko wybranego pliku. Świadczy o tym zawartość panelu Połączenia oraz informacja na pasku stanu otwartego narzędzia konfiguracyjnego.
Konfiguracja w wierszu poleceń Parametr /commit polecenia appcmd pozwala tworzyć i zmieniać elementy location. Parametr /commit może przyjmować następujące wartości:
site — generuje wpis w pliku web.config witryny WWW.
app — generuje wpis w folderze głównym aplikacji.
appHost — generuje wpis w pliku applicationHost.config.
<Ścieżka> — generuje wpis we wskazanej ścieżce.
Jeżeli założymy, że folder download jest podfolderem aplikacji aplikacjaphp, zawartość listingu 3.4 można wygenerować następującym poleceniem: appcmd set config "Default Web Site/aplikacjaphp/download" -section:system.webServer/directoryBrowse /enabled:true /commit:app
Witryny, aplikacje i katalogi Konfigurowanie witryn, aplikacji i katalogów to zasadnicza część administrowania serwerem IIS. W kolejnych punktach opiszę opcje, które mają największe znaczenie. Pełny opis opcji konfiguracyjnych znajduje się w dokumentacji serwera IIS. Witryny, aplikacje i katalogi wirtualne są zdefiniowane razem, w jednej sekcji. W odróżnieniu od innych ustawień, które dotyczą modułów i określonych funkcji, ustawienia witryn, aplikacji i katalogów wirtualnych muszą być zdefiniowane w pliku applicationHost.config, w grupie sekcji system.applicationHost, a nie w grupie sekcji system.webServer. W tabeli 3.1 wskazałem najważniejsze sekcje grupy system.applicationHost. Oprócz odbiorników i pul aplikacji w grupie tej definiuje się też witryny, które z kolei zawierają aplikacje i katalogi wirtualne.
72 CZĘŚĆ I Internet Information Services (IIS) TABELA 3.1. Niektóre sekcje, które wchodzą w skład grupy sekcji system.applicationHost
Sekcja (element)
Opis
applicationPools
Definiuje pule aplikacji.
listenerAdapters
Definiuje adaptery odbiorników, które dowiązują się do Windows Process Activation Service (WAS). Przykładem może być http.
log
Centralny parametr konfiguracyjny do tworzenia dzienników zdarzeń.
sites
Definiuje witryny, aplikacje i katalogi wirtualne.
webLimits
Definiuje ograniczenia w transferze danych i połączeniach TCP/IP.
Domyślnymi ustawieniami we wszystkich sekcjach konfiguracji w system.applicationHost jest to, że ustawienia konfiguracyjne mogą być definiowane wyłącznie w pliku applicationHost.config (allowDefinition=AppHostOnly) oraz że sekcje konfiguracji są zablokowane (overrideModeDefault=Deny). Listing 3.5 zawiera definicję konfiguracji, która definiuje dwie pule aplikacji oraz katalogi dla plików dzienników zdarzeń. LISTING 3.5. Konfiguracja w system.applicationHost [...]
Witryny Witryny definiuje się w sekcji sites. Elementy konfiguracji site przedstawiono w tabeli 3.2. Możesz definiować pojedyncze sekcje sites i ustawiać w nich domyślne ustawienia dla aplikacji i katalogów wirtualnych.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 73 TABELA 3.2. Elementy sekcji sites
Element
Opis
applicationDefaults
Definiuje domyślne wartości dla aplikacji, w tym pule aplikacji, które mają być używane, oraz aktywne dzienniki zdarzeń.
site
Definiuje pojedynczą witrynę (element można definiować więcej niż jeden raz).
siteDefaults
Definiuje domyślne wartości dla witryn — na przykład powiązania, właściwości dzienników zdarzeń albo czy witryny mają być uruchamiane automatycznie.
virtualDirectoryDefaults
Definiuje domyślne wartości dla katalogów wirtualnych — na przykład czy web.config mogą znajdować się w podfolderach.
Definiowanie pojedynczej witryny Witrynę WWW można zdefiniować przy użyciu elementu konfiguracji site. Jego elementy i atrybuty opisano w tabeli 3.3. Dla witryn konieczne jest zdefiniowanie powiązań i aplikacji. Na tym poziomie nie można zdefiniować katalogów wirtualnych, ponieważ katalogi te zawsze muszą być składnikiem aplikacji. Dla każdej witryny trzeba wskazać przynajmniej jedną aplikację: aplikację główną, której ścieżką jest "/". TABELA 3.3. Wybrane elementy i atrybuty elementu konfiguracji
Element
Atrybut
site
Opis Definiuje witrynę.
id
Unikatowy numer witryny (witryna domyślna nosi numer 1).
name
Nazwa witryny dla celów administracyjnych.
serverAutoStart
Wskazuje, czy witryna ma być uruchamiana automatycznie (true, false).
site/application
Definiuje aplikacje na witrynie (element można definiować wielokrotnie).
site/bindings
Definiuje powiązania witryny.
site/limits
Ogranicza przepustowość, a także liczbę i czas trwania połączeń.
Na listingu 3.6 znajduje się definicja witryny domyślnej bezpośrednio po pierwszym uruchomieniu serwera IIS. Witryna posiada aplikację główną ze ścieżką "/" oraz powiązanie protokołu HTTP z portem numer 80. LISTING 3.6. Konfiguracja domyślnej witryny WWW z aplikacją główną i powiązaniem
74 CZĘŚĆ I Internet Information Services (IIS)
Powiązania Witryna może posiadać więcej niż jedno powiązanie. Dla każdego powiązania trzeba zdefiniować protokół, nazwę komputera, adres IP oraz port. Właściwości konfiguracyjne są opisane w tabeli 3.4. TABELA 3.4. Element konfiguracji
Element
Atrybut
Opis
bindings
Zawiera listę wszystkich powiązań.
bindings/binding
Definiuje pojedyncze powiązanie. bindingInformation
Zawiera adres IP, port i nazwę komputera, oddzielone od siebie znakiem dwukropka, na przykład *:80:witrynademophp.site. Zamiast adresu IP można używać symbolu zastępczego. Nazwy komputera nie trzeba podawać (wówczas powiązanie będzie dotyczyć wszystkich komputerów).
protocol
Używany protokół, zazwyczaj http lub https.
bindings/clear
Kasuje wszystkie odziedziczone powiązania oraz powiązania domyślne.
Aplikacje Zadaniem aplikacji jest kojarzenie ścieżek wirtualnych (ścieżek URL) z pulami aplikacji. Każda witryna posiada przynajmniej jedną aplikację: aplikację główną, której ścieżką jest "/". Właściwości konfiguracyjne aplikacji podano w tabeli 3.5. Każda aplikacja posiada co najmniej jeden katalog wirtualny: katalog główny, który odwzorowuje ścieżkę wirtualną na ścieżkę fizyczną. Definiowane ścieżki mają charakter względny, co oznacza, że ścieżki dostępu do katalogów należy interpretować względem ścieżki dostępu do aplikacji. Dlatego ścieżką dostępu do katalogu głównego aplikacji zawsze jest "/". TABELA 3.5. Element konfiguracji
Element
Atrybut
application
Opis Definiuje aplikację.
applicationPool
Pula aplikacji, która ma być używana.
enabledProtocols
Dozwolone protokoły; zazwyczaj http.
path
Ścieżka dostępu do aplikacji.
application/virtualDirectory
Przypisany katalog wirtualny.
application/virtualDirectoryDefaults
Domyślne wartości dla katalogów wirtualnych aplikacji.
Wprawdzie aplikacje można logicznie zagnieżdżać, jednak w konfiguracji ich definicje występują obok siebie, co widać na listingu 3.7. Aplikacja /aplikacjaphp/wiki jest częścią aplikacji /aplikacjaphp, jednak w pliku konfiguracyjnym definicje obydwóch aplikacji znajdują się na tym samym poziomie. Pełna ścieżka wirtualna dla katalogu /data to /aplikacjaphp/wiki/data, ponieważ ścieżki są względne wobec aplikacji.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 75 LISTING 3.7. Konfiguracja aplikacji i ich katalogów wirtualnych
Katalogi wirtualne W tabeli 3.6 opisane są konfigurowalne właściwości katalogów wirtualnych. Konieczne jest zdefiniowanie zarówno ścieżki fizycznej, jak i wirtualnej, ponieważ podstawowym zadaniem katalogu wirtualnego jest kojarzenie obydwóch typów katalogów ze sobą. Jeżeli serwer WWW odczytuje zawartość katalogu przy użyciu specjalnego konta użytkownika, można także wskazać nazwę tego użytkownika i jego hasło. TABELA 3.6. Atrybuty elementu konfiguracji
Atrybuty
Opis
allowSubDirConfig
Wskazuje, czy w podfolderach należy uwzględniać pliki web.config (true, false).
logonMethod
Wskazuje, w jaki sposób IIS ma się uwierzytelniać przed katalogiem. Dostępne są następujące opcje: ClearText (wartość domyślna), Interactive, Batch i Network.
password
Opcjonalne hasło potrzebne dla celów uwierzytelnienia. Hasło to zawsze należy ustawiać w Menedżerze IIS lub programem appcmd.exe, ponieważ tylko to zagwarantuje, że hasło zostanie zaszyfrowane w momencie zapisywania go do pliku konfiguracyjnego.
path
Ścieżka URL katalogu wirtualnego, względna wobec elementów nadrzędnych.
physicalPath
Fizyczna ścieżka dostępu do przypisanego folderu.
userName
Opcjonalna nazwa użytkownika dla celów uwierzytelniania.
Blokowanie konfiguracji Ze względów bezpieczeństwa dobrym rozwiązaniem może być zapewnienie, aby niektórych ustawień konfiguracyjnych nie można było nadpisywać ani anulować w innych lokalizacjach. Dotyczy to zwłaszcza scentralizowanych konfiguracji pojedynczych modułów, na przykład modułu obsługi błędów, a także informacji o tym, które moduły mają być dostępne dla poszczególnych witryn WWW. IIS 7 udostępnia elastyczny mechanizm, który pozwala blokować różne ustawienia konfiguracyjne na różnych poziomach rozdrobnienia. Instalacja
76 CZĘŚĆ I Internet Information Services (IIS)
domyślna jest definiowana w taki sposób, że na niższych poziomach hierarchii można redefiniować tylko najbardziej ogólne ustawienia. Jest to więc kolejny przykład filozofii zapewnienia ciągłego bezpieczeństwa w IIS.
Blokowanie przy użyciu configSections Sekcja configSections służy jako rejestr innych sekcji oraz grup sekcji. W configSections można definiować, czy i jak definicje ustawień konfiguracyjnych mogą się zmieniać na niższych poziomach hierarchii. Można w niej stosować następujące atrybuty:
overrideModeDefault — definiuje domyślną wartość, która wskazuje, czy w danej sekcji lub grupie sekcji można zmieniać ustawienia konfiguracyjne. Wartość Allow zezwala na dokonywanie zmian w konfiguracji, zaś Deny zabrania wprowadzania zmian na niższych poziomach hierarchii ustawień konfiguracyjnych. Jeżeli atrybut nie zostanie zdefiniowany, domyślnie przyjęta zostanie dla niego wartość Allow.
allowDefinition — wskazuje, w którym miejscu hierarchii konfiguracji dozwolone jest
wprowadzanie zmian, o ile zmiana konfiguracji jest dozwolona. Jeżeli atrybut nie zostanie zdefiniowany, zmiany będą dozwolone wszędzie. Atrybutowi można przypisać następujące wartości:
MachineOnly — konfiguracja może być zdefiniowana wyłącznie w pliku machine.config.
MachineToRootWeb — konfiguracja może być zmieniana nie tylko w pliku wynikającym z MachineOnly, ale też w głównym pliku konfiguracyjnym web.config platformy .NET Framework (w tym samym folderze, w którym znajduje się machine.config).
AppHostOnly — konfiguracja może być definiowana wyłącznie w pliku applicationHost.config.
MachineToApplication — dodatkowo do MachineToRootWeb i AppHostOnly, konfiguracja może być zmieniana we wszystkich głównych folderach aplikacji IIS. Dotyczy to również zmian konfiguracji na poziomie witryny, ponieważ każdej witrynie WWW przypisana jest główna aplikacja.
Everywhere — konfiguracja może być zmieniana wszędzie, w tym również w katalogach
wirtualnych oraz we wszystkich folderach fizycznych.
Blokowanie i odblokowywanie przy użyciu location Ustawienia z sekcji configSections określają domyślne wartości, które wyznaczają możliwości zmieniania i blokowania konfiguracji. Dzięki elementowi location ustawienia te można definiować dla konkretnych ścieżek. Określanie uprawnień sekcji W elemencie location można zdefiniować atrybut overrideMode, aby za jego pomocą wskazać, czy konfiguracja jest zablokowana, czy też można ją zmieniać. Atrybut może mieć następujące wartości:
ROZDZIAŁ 3. Konfigurowanie serwera IIS 77
Allow — we wskazanych sekcjach dozwolone jest wprowadzanie zmian w konfiguracji.
Deny — wymienione sekcje są zablokowane, a więc zmiany w konfiguracji są w nich
zabronione.
Inherit — kolejne poziomy hierarchii w górę są analizowane po to, aby stwierdzić, czy zezwolono w nich na zmiany w konfiguracji. Ostatnią instancją jest wartość zdefiniowana w sekcji configSections. Jeśli nie zostanie zdefiniowany atrybut overrideMode, wówczas Inherit będzie traktowany jako wartość domyślna.
Na przykład ustawienia przedstawione na listingu 3.8 blokują możliwość zmiany konfiguracji modułu defaultDocument w sekcji configSections (overrideModeDefault="Deny") w pliku applicationHost.config. Ponieważ atrybut AllowDefinition nie został zdefiniowany, zmiany (jeśli byłyby dozwolone), można by wprowadzać w dowolnym miejscu — na przykład w pliku web.config aplikacji. W dalszej kolejności w grupie sekcji system.webServer definiowane są globalne ustawienia dla modułu defaultDocument. LISTING 3.8. Zmiana praw do definiowania konfiguracji dla określonej ścieżki applicationHost.config web.config w głównym folderze aplikacjaphp
Za pomocą elementu location można sprawić, aby zmiany w konfiguracji były dozwolone wyłącznie dla ścieżki aplikacji aplikacjaphp. Jak widać na listingu, bezpośrednio w location nie trzeba definiować żadnych nowych wartości. Odblokowanie możliwości wprowadzania zmian można osiągnąć bez żadnych dodatkowych definicji.
78 CZĘŚĆ I Internet Information Services (IIS)
Dzięki temu, że konfiguracja nie jest już zablokowana, nowe wartości konfiguracyjne dla modułu defaultDocument można zdefiniować w pliku web.config dla głównego folderu aplikacjaphp. Zadziała również rozwiązanie odwrotne, to znaczy jeśli sekcja konfiguracji nigdzie nie została zablokowana, a chciałbyś ją zablokować dla konkretnych ścieżek, możesz zablokować daną sekcję atrybutem overrideMode="Deny" w elemencie location. W takim przypadku powinieneś jednak w elemencie location określić również inne właściwości i ich wartości, ponieważ w przeciwnym wypadku zastosowane zostaną wartości domyślne.
Określanie praw dla pojedynczych ustawień Atrybut overrideMode pozwala blokować i odblokowywać całe sekcje. Czasami jednak warto jest zablokować lub umożliwić zmienianie tylko pojedynczych ustawień w ramach sekcji. Do tego celu IIS udostępnia pięć następujących atrybutów:
lockAttributes — blokuje wskazane atrybuty elementu.
lockAllAttributesExcept — blokuje wszystkie atrybuty elementu oprócz atrybutów
wskazanych.
lockElements — blokuje wskazane elementy potomne elementu, który zawiera definicję.
lockAllElementsExcept — blokuje wszystkie elementy potomne oprócz elementów
wskazanych.
lockItem — blokuje element, który należy do atrybutu (przydatne do konfigurowania kolekcji).
Wymienione powyżej atrybuty można definiować dla wszystkich sekcji bez względu na to, czy są one zlokalizowane w applicationHost.config, web.config, czy w sekcji location. Wszystkie te atrybuty, z wyjątkiem lockItem, mogą przyjmować wartości w postaci pojedynczych nazw lub listy nazw oddzielonych od siebie znakiem przecinka. Jedynie atrybut lockItem przyjmuje wyłącznie wartość true lub false. Przykład: atrybut lockAttributes Listing 3.9 pokazuje sposób blokowania pojedynczych atrybutów. Konfiguracja przedstawiona w przykładzie umożliwia włączanie i wyłączanie możliwości wyświetlania zawartości katalogu, natomiast blokuje już możliwość wyboru zakresu tej zawartości — może ona się składać wyłącznie z rozmiaru i rozszerzenia pliku, ale już nie z daty ostatniej zmiany pliku. LISTING 3.9. Blokowanie pojedynczych atrybutów przy użyciu lockAttributes
ROZDZIAŁ 3. Konfigurowanie serwera IIS 79
Przykład: atrybut lockElements Atrybut lockElements pozwala blokować elementy potomne w sposób przedstawiony na listingu 3.10. Jako dokument domyślny aplikacji aplikacjaphp konfiguracja wskazuje plik index.php. Elementy remove i clear, czyli potencjalne elementy potomne pliku, są zablokowane. To oznacza, że specyfikacja tych atrybutów jest zablokowana również w kolejnych konfiguracjach. W przykładzie z listingu 3.10 założona blokada pozostawia możliwość dopisywania kolejnych pozycji do listy konfiguracji, jednak nie pozwala usunąć z tej listy żadnego już istniejącego wpisu. LISTING 3.10. Blokowanie pojedynczych elementów potomnych przy użyciu lockElements
Przykład: atrybut lockItem Atrybut lockItem jest ściśle związany z atrybutem lockElements. Atrybut lockElements blokuje elementy potomne po elemencie bieżącym, natomiast lockItem blokuje sam element bieżący. Na listingu 3.11 zaprezentowałem działanie tego atrybutu w nieco innej konfiguracji. Ustawienia konfiguracyjne dla plików index.html i index.htm są zablokowane, przez co nie można ich usuwać ani zmieniać. Natomiast ustawienia konfiguracyjne dla pliku index.php mogą być usuwane w hierarchii konfiguracji. LISTING 3.11. Blokowanie pojedynczych elementów przy użyciu lockItem
Atrybut lockItem można zdefiniować dla dowolnego elementu, a nawet dla sekcji. Blokowanie i odblokowywanie przy użyciu appcmd Za pomocą polecenia appcmd także można blokować i odblokowywać konfigurację, lecz tylko na poziomie sekcji. Nie jest to natomiast możliwe względem pojedynczych elementów i atrybutów w ramach sekcji, które można na przykład edytować bezpośrednio w plikach konfiguracyjnych.
80 CZĘŚĆ I Internet Information Services (IIS)
Blokowanie i odblokowywanie przy użyciu appcmd wykonuje się za pomocą następujących poleceń: appcmd lock config "<ŚCIEŻKA>" –section: appcmd unlock config "<ŚCIEŻKA>" –section:
<ŚCIEŻKA> wyznacza bezwzględną ścieżkę URL witryny, aplikacji, katalogu wirtualnego lub folderu fizycznego, na przykład Witryna demo PHP/aplikacjaphp/wiki. Jeżeli ścieżka nie zostanie wskazana, operacja zostanie wykonana na globalnej konfiguracji serwera. Z kolei parametr reprezentuje nazwę sekcji, na przykład rewrite/rewriteMaps lub defaultDocument.
Niestety, nie istnieje polecenie, które zwróciłoby status danej sekcji (czyli czy jest ona zablokowana, czy nie) dla wskazanej ścieżki.
Blokowanie i odblokowywanie w Menedżerze IIS Sekcje (ale nie elementy ani atrybuty w ramach sekcji) można blokować i odblokowywać w Menedżerze IIS. W porównaniu z poleceniem appcmd Menedżer IIS nakłada jedno istotne ograniczenie: otóż pozwala on operować wyłącznie na sekcjach globalnych lub dotyczących witryny. Nie można natomiast definiować ścieżek do aplikacji ani katalogów. Blokowanie i odblokowywanie sekcji Aby zablokować lub odblokować sekcje, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz serwer WWW. 2. W sekcji Dom/Zarządzanie otwórz moduł Delegowanie funkcji. 3. W obszarze roboczym Delegowanie funkcji (który zostanie wyświetlony na ekranie)
wybierz odpowiednią funkcję na liście. 4. W panelu Akcje, w sekcji Ustaw delegowanie funkcji, możesz wybrać następujące czynności:
Odczyt/zapis — udostępnia funkcje (odpowiada odblokowaniu sekcji).
Tylko do odczytu — blokuje możliwość wprowadzania zmian w konfiguracji funkcji.
Bez delegowania — działa analogicznie do stanu Tylko do odczytu. Dodatkowo dzięki wykonaniu tej czynności funkcja przestanie być widoczna w Menedżerze IIS dla tych użytkowników, którzy nie mają praw administratora.
Resetuj do dziedziczonych — o tym, czy konfiguracja funkcji ma być zablokowana, czy odblokowana, decyduje konfiguracja zdefiniowana na wyższym poziomie hierarchii.
5. Czynność zostanie wykonana natychmiast. Możesz kontynuować definiowanie ustawień
dla kolejnych funkcji albo opuścić panel.
ROZDZIAŁ 3. Konfigurowanie serwera IIS 81
Blokowanie i odblokowywanie funkcji W tym samym obszarze roboczym możesz też zablokować i odblokować funkcje dla poszczególnych witryn: 1. W panelu Akcje kliknij polecenie Niestandardowe delegowanie witryny. 2. Wyświetlony zostanie obszar roboczy Niestandardowe delegowanie witryny,
widoczny na rysunku 3.3.
RYSUNEK 3.3. Okno dialogowe Niestandardowe delegowanie witryny
3. Na liście rozwijanej wybierz witrynę, którą chcesz skonfigurować. 4. Pojedyncze funkcje konfiguruje się dokładnie tak samo jak w przypadku konfiguracji
obowiązujących na serwerze. Konfiguracje dla konkretnej witryny można skasować w panelu Akcje — służy do tego polecenie Resetuj delegowanie. Wówczas witryna przejmie wszystkie ustawienia obowiązujące na poziomie serwera. Przycisk Kopiuj delegowanie pozwala przenosić konfigurację delegowania z bieżącej witryny do innych witryn. 5. W panelu Akcje kliknij polecenie Domyślne delegowanie, aby powrócić do konfiguracji
obowiązującej na poziomie serwera.
82 CZĘŚĆ I Internet Information Services (IIS)
Podsumowanie Możliwości konfiguracji serwera IIS zostały tak skrojone, aby spełniały różnorodne potrzeby administratorów. Bez względu na to, czy dany administrator woli korzystać z graficznego interfejsu użytkownika Menedżera IIS, wpisywać polecenia w wierszu poleceń, czy też edytować ustawienia bezpośrednio w plikach konfiguracyjnych, konfiguracja serwera IIS zawsze jest prezentowana i zmieniana na bieżąco. Dzięki rozproszonej konfiguracji w plikach web.config, przejętej z technologii ASP.NET, bardzo łatwo jest się zorientować w regułach konfiguracji również użytkownikom, którzy dotychczas pracowali w innych środowiskach, takich jak serwer Apache. Dzięki zastosowaniu języka XML struktura, cel i zakres poszczególnych ustawień są od razu zrozumiałe i użytkownik nie musi się niczego domyślać. Nawet dotąd nieznane sekcje konfiguracji można szybko przypisywać, co jest zasługą opisowych nazw elementów. Możliwość blokowania wybranych fragmentów konfiguracji sprawia, że w IIS mamy do czynienia z zupełnie nowymi mechanizmami delegowania zadań administracyjnych bez naruszania reguł bezpieczeństwa. W szczególności opcja blokowania konfiguracji pozwala na nadawanie jedynie minimalnego zakresu uprawnień, które są w danej sytuacji wymagane. Gdy poznasz możliwości konfigurowania języka PHP na serwerze IIS, które opiszę w następnym rozdziale, będziesz już znał wszystkie ustawienia i metody niezbędne do uruchomienia na serwerze wydajnych i bezpiecznych aplikacji PHP.
Rozdział 4.
Konfigurowanie PHP W tym rozdziale: Instalowanie PHP Managera ..............................................................................................83 Konfigurowanie PHP ...........................................................................................................85 Wskazywanie domyślnego dokumentu ..............................................................................91 Ograniczenia żądań .............................................................................................................93 Czasowe ograniczenia przetwarzania żądań ......................................................................96 Przechowywanie sesji i pliki tymczasowe .........................................................................98 Włączanie wyróżniania składni PHP ..................................................................................98 Ustawianie różnych wersji PHP ........................................................................................101 Ustawianie różnych konfiguracji PHP ..............................................................................105 Podsumowanie ..................................................................................................................106
W tym rozdziale skupię się na szczegółowym przedstawieniu sposobu konfigurowania PHP na serwerze Internetowe Usługi Informacyjne. Dowiesz się, jak definiuje się ograniczenia czasu przetwarzania żądań, jak wskazać index.php jako domyślny dokument w katalogu, a także w jaki sposób na tym samym serwerze ustawiać różne wersje języka PHP i różne jego konfiguracje. Do konfigurowania języka PHP służy nie tylko plik php.ini, lecz także rejestry systemu Windows, lokalne pliki .user.ini, a także narzędzie PHP Manager. Z kolei na serwerze IIS w wersji 7.5 FastCGI można skonfigurować w taki sposób, aby zmiany wprowadzane w pliku konfiguracyjnym php.ini były automatycznie rozpoznawane i stosowane. W następnym punkcie opiszę wszystkie wspomniane opcje.
Instalowanie PHP Managera PHP Manager dla serwera IIS to bardzo przydatne narzędzie, za pomocą którego łatwo i szybko można zmieniać ustawienia języka PHP. Jeżeli zainstalowałeś PHP z poziomu Instalatora platformy sieci Web (Web PI), PHP Manager jest już również dostępny. Aby zainstalować program ręcznie, wykonaj następujące czynności:
84 CZĘŚĆ I Internet Information Services (IIS) 1. Wejdź na stronę pod adresem http://phpmanager.codeplex.com/ i pobierz instalator PHP
Managera. Upewnij się, że pobierasz wersję odpowiednią dla środowiska, którego używasz (x64 lub x86). 2. Uruchom instalator i kliknij przycisk Dalej. 3. Wyraź zgodę na warunki licencji, po czym naciśnij przycisk Dalej, aby rozpocząć instalację. 4. Uruchom ponownie Menedżera IIS. 5. W panelu Połączenia wybierz serwer lub witrynę, a następnie dwukrotnie kliknij funkcję
PHP Manager. Na ekranie pojawi się ekran PHP Managera, widoczny na rysunku 4.1.
RYSUNEK 4.1. Ekran początkowy PHP Managera
PHP Manager zawsze zmienia ustawienia języka PHP bezpośrednio w pliku php.ini. Zmiany dotyczą zatem wszystkich witryn, na których używana jest dana wersja PHP. Ponadto PHP Manager automatycznie dodaje przypisania uchwytów oraz ustawienia domyślnych dokumentów na poziomie wybranym w panelu Połączenia Menedżera IIS. Zależnie od stosowanej konfiguracji być może w dalszej kolejności będziesz musiał ręcznie dostosować odpowiednie ustawienia.
ROZDZIAŁ 4. Konfigurowanie PHP 85 WAŻNE Gdy używa się PHP Managera, dodatkowe wersje PHP powinno się zawsze instalować funkcją Register New PHP Version. W miarę możliwości powinieneś zainstalować PHP Managera, zanim skonfigurujesz jakąkolwiek wersję PHP na serwerze IIS. W przeciwnym razie zależnie od zastosowanej konfiguracji PHP Manager może nie rozpoznać już istniejących i skonfigurowanych wersji języka PHP i (przynajmniej w wersji 1.1.2), a wtedy nie pozwoli na zarejestrowanie tej wersji języka.
Konfigurowanie PHP Ustawienia konfiguracyjne języka PHP można definiować w różnych miejscach i w różnych momentach. Możliwe jest nawet dostosowanie samego interpretera PHP w trakcie jego kompilacji. Przykładem takiego działania są wersje Suhosin Patch i Hardening Patch opracowane w ramach projektu Hardened PHP Project (http://www.hardened-php.net/). Konfigurację języka PHP można zmieniać także w fazie wykonania. Niektóre ustawienia fazy wykonania muszą być zdefiniowane (w pliku php.ini) już w momencie uruchamiania PHP; takie ustawienia obowiązują wówczas globalnie. Inne ustawienia można zmieniać w późniejszym czasie, na przykład w folderze, w którym znajduje się skrypt języka PHP, a nawet w samym skrypcie PHP (przy użyciu funkcji ini_set()). W tabeli 4.1 znajdują się informacje o czterech trybach wprowadzania zmian w ustawieniach języka PHP. TABELA 4.1. Tryby zmian ustawień PHP w fazie wykonania
Tryb zmian
php.ini
.user.ini
Rejestr Windows
Skrypt PHP
PHP_INI_ALL
Tak
Tak
Tak
Tak
PHP_INI_PERDIR
Tak
Tak
—
—
PHP_INI_USER
—
—
Tak
Tak
PHP_INI_SYSTEM
Tak
—
—
—
Zanim pokażę, jak zmienia się konfiguracje dla poszczególnych ścieżek w plikach php.ini i .user.ini oraz w rejestrze Windows, opiszę najpierw, w jaki sposób IIS automatycznie uwzględnia zmiany konfiguracji wprowadzone w php.ini.
Rozpoznawanie zmian w konfiguracji IIS automatycznie rozpoznaje i uwzględnia zmiany w konfiguracji serwera. Nie dotyczy to jednak konfiguracji języka PHP — aby zmiany konfiguracyjne rzeczywiście znalazły odzwierciedlenie w działaniu PHP, trzeba najpierw ponownie uruchomić skojarzone z nim pule aplikacji. Dopiero w wersji 7.5 serwera IIS (dla Windows 7 i Windows Server 2008 R2) udostępniono rozwiązanie, które rozpoznaje zmiany wprowadzone w pliku konfiguracyjnym php.ini (albo dowolnym innym wskazanym pliku) i restartuje procesy PHP.
86 CZĘŚĆ I Internet Information Services (IIS) OSTRZEŻENIE Zmiany wprowadzone w plikach będą rozpoznawane jedynie wówczas, gdy pozwoli
na to system plików. Jeżeli pliki konfiguracyjne będą się znajdować na dysku sieciowym, wówczas wprowadzane w nich zmiany nie będą automatycznie rozpoznawane.
Konfigurowanie przy użyciu Menedżera IIS Aby uruchomić funkcję monitorowania zmian w konfiguracji, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz serwer, a następnie dwukrotnie kliknij myszą
funkcję Ustawienia FastCGI, aby ją uruchomić. 2. Na liście aplikacji FastCGI wskaż pożądaną aplikację PHP, a następnie w panelu Akcje
naciśnij przycisk Edytuj. 3. W sekcji Ogólne właściwości Monitoruj zmiany pliku przypisz plik (na przykład C:\PHP\php.ini).
Dzięki temu jeżeli zawartość tego pliku się zmieni, procesy PHP zostaną ponownie uruchomione. Przykład widoczny jest na rysunku 4.2.
RYSUNEK 4.2. Wskazywanie pliku, który po wprowadzeniu zmian ma podlegać monitorowaniu
4. Naciśnij przycisk OK, aby zamknąć okno dialogowe.
Od tego momentu wszelkie zmiany wprowadzane w pliku konfiguracyjnym php.ini będą automatycznie uwzględniane.
ROZDZIAŁ 4. Konfigurowanie PHP 87
Konfigurowanie w wierszu poleceń Aby uruchomić monitorowanie zmian przy użyciu programu appcmd, wykonaj następujące polecenie: appcmd set config /section:system.webServer/fastCgi /[fullPath='%PHP%\php-cgi.exe'].monitorChangesTo:"C:\PHP\php.ini"
W parametrze fullPath ścieżkę %PHP% wskaż odpowiednio do aplikacji FastCGI, którą chcesz w ten sposób skonfigurować. Konfigurowanie przy użyciu PHP Managera Aby włączyć monitorowanie zmian przy użyciu PHP Managera, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz serwer, a następnie dwukrotnie kliknij myszą
funkcję PHP Manager, aby ją uruchomić. 2. W sekcji PHP Setup kliknij łącze View Recommendations. 3. Zaznacz pole wyboru monitorChangesTo, a następnie naciśnij przycisk OK. (Jeżeli opcja ta
będzie nieaktywna, będzie to znak, że funkcja monitorowania zmian jest już włączona).
Ustawienia konfiguracyjne dla ścieżek i komputerów w pliku php.ini W wersji PHP 5.3 udostępniono opcję, dzięki której w pliku php.ini można definiować ustawienia konfiguracyjne dotyczące konkretnej ścieżki fizycznej skryptu PHP albo konkretnego komputera. Konfiguracje takie definiuje się bardzo prosto: w pliku php.ini wystarczy zdefiniować sekcję dla określonej ścieżki albo komputera. Są to następujące sekcje:
[PATH=…] — wszystkie kolejne ustawienia konfiguracyjne będą dotyczyć wyłącznie wskazanej ścieżki. Ustawienia nie będą stosowane względem podfolderów.
[HOST=…] — wszystkie kolejne ustawienia konfiguracyjne będą dotyczyć wyłącznie
wskazanego komputera. PHP ustala nazwę komputera na podstawie wartości zmiennej SERVER_NAME. Na serwerze IIS nazwą komputera jest nazwa zawarta w adresie URL (co odróżnia IIS od serwera Apache). Dla wskazanego komputera lub ścieżki stosowane są wszystkie ustawienia konfiguracyjne, które są zdefiniowane od początku sekcji aż do wystąpienia kolejnej sekcji [HOST] lub [PATH]. Inne instrukcje sekcji, na przykład właściwe dla pliku php.ini, nie mają już wówczas zastosowania. Dlatego sekcje ustawień konfiguracyjnych dla ścieżek i komputerów powinny zawsze być umieszczane na końcu pliku. Na listingu 4.1 znajduje się przykładowa konfiguracja. Ustawienie [PATH] dotyczy wyłącznie wskazanego folderu, a nie jego podfolderów. Z kolei ustawienie [HOST] dotyczy wszystkich skryptów PHP niezależnych od ścieżki fizycznej, o ile tylko żądanie jest adresowane do komputera o odpowiedniej nazwie. Jeżeli jakieś ustawienie jest zdefiniowane zarówno dla ścieżki [PATH], jak i dla komputera [HOST], wówczas pierwszeństwo ma ustawienie dla ścieżki [PATH].
88 CZĘŚĆ I Internet Information Services (IIS) LISTING 4.1. Ustawienia dla ścieżek i dla komputera zdefiniowane w pliku php.ini [PATH=C:\inetpub\witrynademophp\wwwroot] open_basedir = "C:\inetpub\witrynademophp" [PATH=C:\inetpub\drugawitryna] short_open_tags = On [HOST=manfred.witrynademophp.site] memory_limit = 256M
IIS nie potrafi automatycznie rozpoznawać zmian w pliku php.ini (dopóki nie uruchomi się funkcji monitorowania zmian). Aby zastosować wprowadzone zmiany w konfiguracji, należy w tym przypadku ponownie uruchomić pulę aplikacji. PHP Manager nie obsługuje jeszcze konfiguracji dla konkretnych ścieżek i komputerów. Wszystkie ustawienia definiowane przy użyciu polecenia PHP Settings/Manage All Settings PHP Managera mają charakter globalny i nie wpływają na ustawienia zdefiniowane dla konkretnych ścieżek i komputerów.
Konfigurowanie w pliku .user.ini Począwszy od wersji 5.3, PHP można konfigurować w indywidualnych plikach konfiguracyjnych bezpośrednio w folderach, analogicznie do plików web.config serwera IIS. Warunkiem jest uruchomienie PHP jako FastCGI. Tak zdefiniowane ustawienia dotyczą wyłącznie folderu, w którym znajduje się plik konfiguracyjny .user.ini, a także wszystkich jego podfolderów. Pliki .user.ini mają taką samą strukturę jak standardowy plik php.ini. Ustawienia konfiguracyjne PHP można kopiować lub przenosić z witryny albo aplikacji do innej lokalizacji. Plik .user.ini zostanie wówczas skopiowany wraz z pozostałymi plikami. Dzięki temu skopiowane zostaną wszystkie ustawienia konfiguracyjne. WSKAZÓWKA Opcja konfiguracyjna user_ini.filename pozwala określić własną nazwę dla lokalnych plików konfiguracyjnych. Jest to szczególnie przydatne w systemach Windows, w których nazwy plików rozpoczynające się od znaku kropki nie są standardowym rozwiązaniem.
Ustawienia zdefiniowane w plikach .user.ini można później zmieniać w kodzie skryptu PHP za pomocą funkcji ini_set(). Jeżeli ustawienia konfiguracyjne zostaną zdefiniowane zarówno w rejestrze systemu Windows, jak i w pliku .user.ini, wówczas ustawienia z rejestru będą miały pierwszeństwo. Jednocześnie zmiany tych ustawień w skrypcie PHP albo pliku .user.ini nie będą brane pod uwagę. UWAGA Pliki .user.ini odpowiadają instrukcjom php_value i php_flag z plików .htaccess stosowanych na serwerach Apache.
ROZDZIAŁ 4. Konfigurowanie PHP 89
Należy również pamiętać o następujących kwestiach:
Ze względów wydajnościowych PHP zapisuje pliki .user.ini w pamięci podręcznej. Dlatego zmiany wprowadzone w tych plikach konfiguracyjnych nie są od razu odzwierciedlone w działaniu środowiska — następuje to dopiero po upływie czasu ważności bufora pamięci podręcznej (domyślnie jest to pięć minut, a ustawienie to można zmienić przez odpowiednie zdefiniowanie ustawienia konfiguracyjnego user_ini.cache_ttl). Aby zastosować wprowadzoną zmianę od razu, należy ponownie uruchomić odpowiadają pulę aplikacji serwera IIS.
Pliki .user.ini są wyszukiwane tylko do poziomu głównego folderu witryny (DOCUMENT_ROOT). W bieżącej wersji PHP oznacza to tyle, że pliki .user.ini wchodzące w skład aplikacji, które znajdują się poza głównym folderem witryny, dotyczą wyłącznie folderu, w którym dany plik konfiguracyjny się znajduje. Ustawienia zawarte w tych plikach nie obowiązują już dla podfolderów, co znacznie ogranicza możliwości ich zastosowania.
Konfigurowanie w rejestrze systemu Windows PHP potrafi odczytywać ustawienia konfiguracyjne z rejestru systemu Windows. Działanie takich ustawień można ograniczyć do ścieżek fizycznych. Właściwym kluczem rejestru jest HKEY_LOCAL_MACHINE\SOFTWARE\PHP\Per Directory Values. UWAGA W 64-bitowych systemach Windows kluczem rejestru może również być HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\PHP\Per Directory Values. Klucz Wow6432Node
jest przeznaczony dla 32-bitowych programów, które działają w 64-bitowym systemie Windows.
Kolejne klucze we wspomnianym kluczu rejestru wskazują ścieżki. Na przykład aby zdefiniować ustawienie przeznaczone wyłącznie dla ścieżki C:\inetpub\witrynademophp\apps\aplikacjaphp1, należy użyć klucza rejestru HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\witrynademophp\apps\aplikacjaphp1. Ustawienie konfiguracyjne PHP należy wskazać jako ciąg znaków w odpowiednim kluczu. Nazwa ustawienia musi odpowiadać nazwie analogicznego ustawienia definiowanego w pliku konfiguracyjnym php.ini. Jeżeli dane ustawienie zostanie zdefiniowane bezpośrednio na poziomie klucza Per Directory Values, wówczas będzie ono obowiązywać dla wszystkich ścieżek. Jeżeli dane ustawienie konfiguracyjne zostanie zdefiniowane w rejestrze systemu Windows, wówczas nie będzie można go zmienić w kodzie źródłowym skryptu przy użyciu funkcji ini_set(). Ustawienia zawarte w rejestrze są więc zabezpieczone przed zmianami. W niektórych okolicznościach może to być dokładnie to rozwiązanie, którego szukają programiści. Aby zdefiniować ustawienia konfiguracyjne w rejestrze systemu Windows, użyj narzędzia Edytor rejestru i wykonaj następujące czynności: 1. Uruchom narzędzie Edytor rejestru. W tym celu wybierz polecenie Start/Uruchom i wpisz nazwę programu regedit. 2. W lewym panelu Edytora rejestru wybierz odpowiedni klucz rejestru.
90 CZĘŚĆ I Internet Information Services (IIS) 3. Jeżeli klucz PHP jeszcze nie istnieje, utwórz go. Służy do tego polecenie Nowy/Klucz,
dostępne w menu podręcznym wyświetlonym po kliknięciu prawym przyciskiem myszy na kluczu rejestru rodzica. Te same czynności wykonaj dla klucza Per Directory Values oraz wszystkich pozostałych kluczy definiujących ścieżki fizyczne. 4. Aby zdefiniować ustawienie PHP, wybierz odpowiedni klucz, a następnie wybierz polecenie
menu Edycja/Nowy/Wartość ciągu. Alternatywnie możesz użyć tego samego polecenia, lecz w menu podręcznym, widocznym na rysunku 4.3.
RYSUNEK 4.3. Edytowanie ustawień PHP w Edytorze rejestru
5. Wybierz polecenie Plik, a następnie Wyjście, aby zamknąć Edytor rejestru. UWAGA Ustawienia w rejestrze systemu Windows odpowiadają instrukcjom php_admin_value i php_admin_flag z plików konfiguracyjnych .htaccess stosowanych na serwerach Apache.
Konfigurowanie aplikacji FastCGI Ponieważ PHP jest uruchamiane na serwerze IIS jako FastCGI, możesz korzystać z różnorodnych aplikacji FastCGI i odwzorowań uchwytów, aby zmieniać dowolne opcje konfiguracyjne na poziomie dowolnego folderu — nawet te opcje, które można definiować wyłącznie w pliku php.ini. W tym celu musisz stworzyć nową aplikację FastCGI, która będzie ładować plik z konfiguracją alternatywną podany jako parametr (parametr –c wiersza poleceń PHP). Więcej szczegółów na ten temat przedstawię w punkcie „Ustawianie różnych konfiguracji PHP” w dalszej części tego rozdziału.
ROZDZIAŁ 4. Konfigurowanie PHP 91 UWAGA PHP Manager nie obsługuje różnych aplikacji FastCGI, które bazują na tej samej wersji PHP. Tego typu konfiguracje trzeba definiować ręcznie.
Ponieważ ustawienia konfiguracyjne definiuje się bezpośrednio w pliku php.ini, zaś przypisania uchwytów można zmieniać na dowolnym poziomie (o ile tylko konfiguracja serwera IIS nie została zablokowana), możesz zmieniać dowolne ustawienia PHP w dowolnym miejscu na serwerze, witrynie lub w aplikacji. Ceną za tę wygodę jest jednak zwiększone zużycie zasobów (zwłaszcza pamięci), ponieważ dla każdej działającej aplikacji FastCGI uruchamianych jest kilka instancji interpretera PHP. Ponadto tego typu konfiguracje szybko przestaną być czytelne, ponieważ zmiany w konfiguracji PHP, które będą miały obowiązywać globalnie, trzeba będzie wprowadzać we wszystkich plikach php.ini. Tym niemniej możliwość dowolnego zmieniania wszystkich ustawień konfiguracyjnych (nawet jeśli ustawiony jest tryb zmian PHP_INI_SYSTEM) wynagradza wspomniane niedogodności, zwłaszcza w niektórych sytuacjach. To, które rozwiązanie będzie lepsze — konfigurowanie aplikacji FastCGI czy definiowanie konfiguracji dla konkretnych ścieżek w pliku php.ini — będzie zależeć od wymagań względem tworzonej aplikacji.
Wskazywanie domyślnego dokumentu Gdy wywołuje się konkretny folder, serwer IIS może zamiast zawartości tego folderu wyświetlić określony dokument. Tym dokumentem domyślnym może być zwykły plik HTML albo skrypt PHP. Jeżeli zainstalowałeś PHP z poziomu Instalatora platformy sieci Web (Web PI) albo zarejestrowałeś PHP w PHP Managerze, lista nazw dokumentów domyślnych zawiera już nazwę index.php. Jeżeli natomiast instalowałeś PHP w inny sposób, prawdopodobnie pliku index.php nie ma jeszcze na liście dokumentów domyślnych. Trzeba też podkreślić, że Instalator platformy sieci Web umieszcza index.php na końcu listy dokumentów domyślnych (podczas gdy PHP Manager umieszcza go na początku listy). Aby zwiększyć wydajność, możesz samodzielnie dostosować kolejność wyszukiwania przez IIS dokumentu domyślnego. Możesz też usunąć z listy te nazwy dokumentów, których nie używasz. UWAGA W domyślnej instalacji serwera IIS możesz zmieniać definicję dokumentów domyślnych na
dowolnym poziomie. Jeżeli natomiast serwer, którego używasz, posiada konfigurację inną niż domyślna, powinieneś najpierw uwzględnić wymogi obecnej konfiguracji serwera.
Ze względu na bezpieczeństwo serwera i jego wydajność najlepiej jest umieszczać na liście dokumentów domyślnych wyłącznie te dokumenty, które rzeczywiście są używane. Można też wskazywać różne dokumenty domyślne dla różnych aplikacji lub folderów.
92 CZĘŚĆ I Internet Information Services (IIS)
Wskazywanie dokumentu domyślnego w Menedżerze IIS Aby w Menedżerze IIS wskazać dokument domyślny dla katalogu, wykonaj następujące czynności: 1. Otwórz Menedżera IIS, a następnie w panelu Połączenia wybierz element, który chcesz
skonfigurować (witrynę, aplikację, katalog, podfolder). 2. W obszarze roboczym wybierz funkcję Dokument domyślny. 3. Aby dodać nowy dokument domyślny, w panelu Akcje kliknij polecenie Dodaj. 4. W polu tekstowym wpisz nazwę domyślnego dokumentu, a następnie naciśnij przycisk OK.
Jak widać na rysunku 4.4, ustawienia lokalne są widoczne na początku listy.
RYSUNEK 4.4. Obszar roboczy funkcji Dokument domyślny
5. Aby usunąć dokument domyślny, zaznacz ten dokument w obszarze roboczym, a następnie
w panelu Akcje kliknij polecenie Usuń. 6. Aby zmienić kolejność dokumentów domyślnych, zaznacz dokument, którego pozycję
na liście chcesz zmienić, a następnie w panelu Akcje kliknij polecenie Przenieś w górę lub Przenieś w dół. OSTRZEŻENIE Jeżeli zmienisz kolejność dokumentów domyślnych, wszystkie dokumenty na zmienianej liście staną się pozycjami lokalnymi i nie będą już dziedziczone.
Wskazywanie dokumentu domyślnego w wierszu poleceń Aby wskazać dokumenty domyślne w wierszu poleceń, użyj następujących poleceń:
Aby uzyskać listę wszystkich dokumentów domyślnych, wykonaj następujące polecenie: appcmd list config /section:defaultDocument <ŚCIEŻKA>
Aby dodać jeden dokument domyślny, wykonaj następujące polecenie: appcmd set config /section:defaultDocument <ŚCIEŻKA> /+files.[value='content.php']
Aby usunąć dokument domyślny, wykonaj następujące polecenie: appcmd set config /section:defaultDocument <ŚCIEŻKA> /-files.[value='iisstart.htm']
Aby usunąć wszystkie dokumenty domyślne, wykonaj następujące polecenie: appcmd set config /section:defaultDocument <ŚCIEŻKA> /~files
ROZDZIAŁ 4. Konfigurowanie PHP 93 UWAGA W powyższych przykładach parametr <ŚCIEŻKA> oznacza odpowiedni element, na przykład "Default Web Site/aplikacjaphp/chomik" (cudzysłowy są w tym przypadku niezbędne, ponieważ
w nazwie elementu występują znaki spacji). Aby zmienić ustawienia dokumentów domyślnych na poziomie serwera, pomiń parametr <ŚCIEŻKA>.
Wskazywanie dokumentu domyślnego bezpośrednio w konfiguracji Aby wskazać dokument domyślny w konfiguracji, czy to globalnie w applicationHost.config, czy też w rozproszonych plikach web.config, zdefiniuj odpowiedni wpis w sekcji konfiguracji system.webServer/defaultDocument. Przykładowy wpis znajduje się na listingu 4.2. LISTING 4.2. Definiowanie dokumentu domyślnego w konfiguracji XML
Jeżeli specyfikację przedstawioną na listingu 4.2 umieścisz w pliku web.config, wówczas te dokumenty domyślne, które zostały odziedziczone, nadal będą obowiązywać. Aby je usunąć, należy użyć elementu konfiguracyjnego . WSKAZÓWKA Aby zapewnić, że dany dokument domyślny znajduje się zawsze na początku listy,
niezależnie od tego, czy został już odziedziczony w hierarchii konfiguracji, czy nie, należy zastosować następującą konfigurację:
Usunięcie i dodanie wpisu spowoduje, że dany dokument domyślny będzie zawsze na pierwszym miejscu na liście.
Ograniczenia żądań Jeżeli PHP działa jako FastCGI, oznacza to, że ten sam proces PHP jest wykorzystywany wielokrotnie do obsługi wielu kolejnych żądań. Fakt, że PHP nie musi być ponownie uruchamiany w celu obsłużenia każdego kolejnego żądania, zdecydowanie zwiększa wydajność działania. Jednocześnie jednak takie podejście może zachwiać stabilnością całego układu, ponieważ jeżeli z powodu wystąpienia jakiegoś błędu PHP albo jego rozszerzenie nie zwolni
94 CZĘŚĆ I Internet Information Services (IIS)
wszystkich zasobów, zasoby te będą przez cały czas używane. Jeśli do takiej sytuacji dojdzie, serwer może ostatecznie stać się niedostępny, ponieważ PHP będzie używać wszystkich zasobów. Aby zabezpieczyć się przed wystąpieniem opisanej sytuacji, zarówno w FastCGI, jak i w samym PHP umożliwiono automatyczne zakończenie procesów po obsłużeniu wskazanej liczby żądań. W ten sposób zwalniane będą wszystkie wciąż używane zasoby. Zalecaną praktyką jest pozostawienie na serwerze IIS włączonego mechanizmu automatycznego zakańczania procesów, zwłaszcza jeśli chodzi o moduł FastCGI. Moduł ten posiada więcej informacji niż pojedynczy proces PHP, dlatego podejmuje bardziej trafne decyzje. Ponadto FastCGI nigdy nie rozróżnia, czy proces PHP został zakończony automatycznie, czy w wyniku wystąpienia błędu i przerwania pracy procesu PHP. Mechanizm ponownego uruchamiania procesów jest kontrolowany przez dwie zmienne: instanceMaxRequests po stronie FastCGI oraz PHP_FCGI_MAX_REQUESTS po stronie PHP.
Wspomniane zmienne należy zdefiniować w taki sposób, aby instanceMaxRequests miała wartość niższą niż PHP_FCGI_MAX_REQUESTS. Da to gwarancję, że FastCGI zainicjuje ponowne uruchomienie procesu.
Konfigurowanie w Menedżerze IIS Aby w Menedżerze IIS zdefiniować limit żądań, po którym powinno nastąpić ponowne uruchomienie procesu PHP, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wskaż serwer. 2. W obszarze roboczym wybierz funkcję Ustawienia FastCGI. 3. W obszarze Ustawienia FastCGI wskaż aplikację PHP, którą chcesz skonfigurować,
a następnie w panelu Akcje kliknij polecenie Edytuj. 4. W oknie dialogowym Edytuj aplikację FastCGI w polu tekstowym Maks. liczba żądań
wystąpienia wpisz maksymalną liczbę przetworzonych żądań, po której proces powinien zostać ponownie uruchomiony. Wartością zalecaną jest 10 tysięcy żądań. 5. W polu Zmienne środowiskowe naciśnij przycisk kolekcji.
Wyświetlone zostanie okno dialogowe Edytor kolekcji EnvironmentVariables. 6. Naciśnij przycisk Dodaj, a następnie w panelu Różne, w polu tekstowym Name, wpisz nazwę zmiennej PHP_FCGI_MAX_REQUESTS. Z kolei w polu tekstowym Value wpisz liczbę 10001, jak na
rysunku 4.5. 7. Naciśnij przycisk OK, aby zamknąć okno dialogowe.
Po zdefiniowaniu konfiguracji nie trzeba ponownie uruchamiać serwera ani puli aplikacji — IIS automatycznie uwzględni dokonane zmiany.
ROZDZIAŁ 4. Konfigurowanie PHP 95
RYSUNEK 4.5. Konfigurowanie zmiennej środowiskowej PHP_FCGI_MAX_REQUESTS
Konfigurowanie w wierszu poleceń Aby omawianą konfigurację zdefiniować w wierszu poleceń, użyj programu appcmd w następujący sposób: 1. Uruchom okno wiersza poleceń z uprawnieniami administratora. 2. Aby skonfigurować limit żądań FastCGI, wykonaj polecenie: appcmd set config /section:system.webServer/fastCgi /[fullPath='%PHP%\php-cgi.exe']. ´instanceMaxRequests:10000
3. Aby dodać limit PHP, wykonaj następujące polecenie: appcmd set config /section:system.webServer/fastCgi/+"[fullPath='%PHP%\php´environmentVariables.[name='PHP_FCGI_MAX_REQUESTS',value='10001']"
cgi.exe'].
UWAGA W definicji parametru fullPath wartość %PHP% symbolizuje aplikację FastCGI, którą chcesz skonfigurować.
Konfigurowanie bezpośrednio w pliku konfiguracyjnym Parametry można zdefiniować również bezpośrednio w pliku konfiguracyjnym applicationHost.config, w sekcji system.webServer/fastCGI. W tym celu należy wykonać czynności opisane poniżej, a przykładowa konfiguracja znajduje się na listingu 4.3.
W elemencie konfiguracji aplikacji atrybutowi instanceMaxRequests przypisz wartość, która będzie wyznaczać limit żądań FastCGI.
W kolekcji environmentVariables zdefiniuj zmienną środowiskową PHP.
96 CZĘŚĆ I Internet Information Services (IIS) LISTING 4.3. Ustawienie limitu żądań, po którym ma nastąpić ponowne uruchomienie procesu, w pliku applicationHost.config
Czasowe ograniczenia przetwarzania żądań Niektóre żądania mogą być przetwarzane szczególnie długo, zależnie od danych wejściowych i innych parametrów. Również błąd, który wystąpi w trakcie przetwarzania żądania, może uniemożliwić zakończenie działania programu PHP. Z myślą o takich sytuacjach możesz ograniczyć czas, przez który żądanie może być przetwarzane. W przypadku przetwarzania żądań przez skrypty PHP na serwerze IIS obowiązują trzy ograniczenia czasowe: ograniczenia PHP, ograniczenia FastCGI oraz ograniczenie na serwerze IIS. Ograniczenie na serwerze IIS (ConnectionTimeout) jest uwzględniane jedynie wtedy, gdy połączenie pozostaje nieaktywne przez określoną ilość czasu, lecz nie przeszkadza w przetwarzaniu wykonywanego skryptu PHP. Dlatego wykonywany skrypt PHP może być przedwcześnie zakończony jedynie w przypadku przekroczenia ograniczenia czasu przetwarzania żądania PHP lub ograniczenia czasu przetwarzania żądania FastCGI. W kolejnych punktach opiszę obydwa wspomniane ograniczenia.
Ograniczenia PHP Dla PHP można zdefiniować dwa ograniczenia:
max_execution_time — wskazuje maksymalny czas wykonywania skryptu wyrażony
w sekundach.
max_input_time — wskazuje wyrażony w sekundach maksymalny czas wczytywania i przetwarzania danych wejściowych (na przykład $_POST albo $_FILES). Ograniczenie to
jest szczególnie istotne, gdy przetwarza się duże pliki, a połączenie z siecią jest powolne. Obydwa ograniczenia można zdefiniować w konfiguracji PHP albo w PHP Managerze, który udostępnia przyjazny interfejs graficzny do definiowania tego typu konfiguracji (w tym celu trzeba wybrać polecenie PHP Manager/PHP Settings/Set Runtime Limits).
ROZDZIAŁ 4. Konfigurowanie PHP 97
Ograniczenia FastCGI FastCGI uwzględnia dwa ograniczenia: czas, przez który aplikacja PHP może przetwarzać żądanie, oraz czas oczekiwania przez żądanie na rozpoczęcie jego przetwarzania. To drugie ograniczenie jest istotne jedynie w momentach, gdy następuje okresowe zwiększenie obciążenia: jeżeli zwiększa się liczba żądań, wówczas zmniejsza się liczba procesów PHP, które mogą te żądania obsłużyć, przez co żądania są dodawane na listę żądań oczekujących i kolejno obsługiwane w miarę bieżących możliwości serwera. Jeżeli żądanie będzie zbyt długo czekać na przetworzenie, zostanie usunięte z listy żądań oczekujących, a do klienta, który to żądanie wysłał, zwrócony zostanie komunikat o błędzie. Konfigurowanie w Menedżerze IIS Aby skonfigurować ograniczenia czasowe w Menedżerze IIS, wykonaj następujące czynności: 1. W Menedżerze IIS otwórz funkcję Ustawienia FastCGI dla serwera, który chcesz
skonfigurować. 2. Na liście wybierz aplikację FastCGI, którą chcesz skonfigurować, a następnie w panelu Akcje
kliknij polecenie Edytuj. Wyświetlone zostanie okno dialogowe Edytuj aplikację FastCGI. 3. W sekcji Schemat modelu, w polu Limit czasu aktywności, możesz skonfigurować czas,
przez jaki skrypt PHP może być wykonywany. 4. W polu Limit czasu żądania możesz wskazać czas, przez jaki żądanie może pozostawać
w kolejce żądań do przetworzenia. 5. Naciśnij przycisk OK, aby zatwierdzić wprowadzone zmiany w konfiguracji.
Konfigurowanie w wierszu poleceń Ograniczenie czasu aktywności można zdefiniować w wierszu poleceń przy użyciu programu appcmd: appcmd set config /section:system.webServer/fastCgi /[fullPath='%PHP%\php-cgi.exe'].activityTimeout:90
Z kolei aby ustawić ograniczenie czasu oczekiwania na przetworzenie, wykonaj następujące polecenie: appcmd set config /section:system.webServer/fastCgi /[fullPath='%PHP%\php-cgi.exe'].requestTimeout:90
UWAGA Parametr %PHP% oznacza pełną ścieżkę do aplikacji PHP, którą chcesz skonfigurować.
98 CZĘŚĆ I Internet Information Services (IIS)
Przechowywanie sesji i pliki tymczasowe Domyślnie PHP zapisuje dane sesji (dostępne w zmiennej $_SESSION) oraz pliki tymczasowe w katalogu C:\Windows\Temp. Aby dowiedzieć się, w którym folderze PHP aktualnie przechowuje dane sesji, użyj funkcji session_save_path(). Natomiast katalog plików tymczasowych — na przykład tworzonych w trakcie przesyłania plików na serwer — można uzyskać za pomocą funkcji sys_get_temp_dir(). Obydwa foldery można zmienić. W tym celu wystarczy w pliku php.ini przypisać ustawieniom session.save_path oraz upload_tmp_dir odpowiednio folder na dane sesji oraz folder na pliki tymczasowe. Te same ustawienia można zdefiniować w PHP Managerze — służy do tego polecenie PHP Settings/Manage All Settings. W obydwóch przypadkach trzeba się upewnić, że PHP posiada odpowiednie uprawnienia do wskazywanych folderów. Aby zmienić uprawnienia do folderów, wykonaj następujące czynności: 1. Prawym przyciskiem myszy kliknij folder w Eksploratorze Windows, a następnie w menu
podręcznym wybierz polecenie Właściwości. 2. Przejdź do zakładki Zabezpieczenia i naciśnij przycisk Edytuj. 3. W oknie dialogowym Uprawnienia naciśnij przycisk Dodaj. 4. Jako nazwę obiektu wpisz IIS_IUSRS, a następnie naciśnij OK. UWAGA Jeżeli użytkownik nie zostanie rozpoznany, upewnij się, że w polu z tej lokalizacji znajduje się bieżący komputer, a nie domena. 5. W polu listy wybierz IIS_IUSRS, a następnie dodaj mu uprawnienie Modyfikacja. 6. Naciśnij przycisk OK, aby zamknąć okno dialogowe.
Aby wdrożyć w życie wprowadzone zmiany w konfiguracji, ponownie uruchom pulę aplikacji. Od teraz PHP zacznie używać wskazanych katalogów do przechowywania danych sesji oraz plików tymczasowych. W rozdziale 6. „Pamięć podręczna” dowiesz się, w jaki sposób korzystać z rozszerzenia PHP WinCache w roli bufora sesji.
Włączanie wyróżniania składni PHP PHP pozwala wyświetlać kod źródłowy skryptu napisanego w tym języku z pokolorowaną składnią. Efekt ten można osiągnąć na dwa sposoby: przez użycie uchwytu dla wszystkich plików z rozszerzeniem .phps albo za pomocą modułu URL Rewrite.
ROZDZIAŁ 4. Konfigurowanie PHP 99
Konfigurowanie wyróżniania składni PHP w Menedżerze IIS Aby w Menedżerze IIS skonfigurować uchwyt, który będzie obsługiwał wyróżnianie składni języka PHP, wykonaj następujące czynności: 1. Otwórz Menedżera IIS i w panelu Połączenia wybierz serwer. 2. W obszarze roboczym wybierz funkcję Mapowania obsługi. 3. W panelu Akcje kliknij polecenie Dodaj mapowanie modułu, aby zdefiniować przypisanie.
Wyświetlone zostanie okno dialogowe Dodaj mapowanie modułu, widoczne na rysunku 4.6.
RYSUNEK 4.6. Dodawanie przypisania modułu dla wyróżniania składni kodu źródłowego PHP
4. W kolejnych polach tekstowych wpisz następujące dane:
Ścieżka żądania: *.phps
Moduł: FastCgiModule
Wykonywalny (opcjonalnie): %PHP%\php-cgi.exe|-s Pamiętaj, aby parametr oddzielić od ścieżki programu znakiem potoku (|) — nie spacją!
Nazwa: Kod źródłowy PHP (albo inna, jaką sobie wybierzesz)
5. Naciśnij przycisk Ograniczenia żądań. 6. W zakładce Mapowanie zaznacz pole wyboru, a następnie wybierz opcję Plik. 7. Przejdź do zakładki Zlecenia, zaznacz opcję Jedno z następujących zleceń, a następnie w polu tekstowym wpisz GET, HEAD. 8. Naciśnij przycisk OK, aby zamknąć okno dialogowe Ograniczenia żądań. 9. Zatwierdź wprowadzone zmiany naciśnięciem przycisku OK. 10. W oknie dialogowym z pytaniem, czy chcesz utworzyć nową aplikację FastCGI,
naciśnij przycisk Tak.
100 CZĘŚĆ I Internet Information Services (IIS)
Od teraz za każdym razem, gdy wywołasz plik z rozszerzeniem .phps, kod źródłowy PHP zostanie automatycznie wyświetlony z pokolorowaną składnią, co widać na rysunku 4.7.
RYSUNEK 4.7. Pokolorowany kod źródłowy przykładowej aplikacji do zgadywania liczb, zaprezentowanej w rozdziale 1. „Konfiguracja środowiska roboczego”. Na rysunku kolory są reprezentowane przez różne odcienie szarości
OSTRZEŻENIE Potencjalni napastnicy mogą znaleźć w kodzie źródłowym ewentualne słabe strony aplikacji. Dlatego zawsze dwa razy się zastanów, zanim udostępnisz kod źródłowy wybranych plików, a także rozważ, które serwery ewentualnie mogą udostępniać pliki z kodem źródłowym.
Konfigurowanie w wierszu poleceń Wyróżnianie składni można także skonfigurować w wierszu poleceń przy użyciu programu appcmd: 1. Uruchom program Wiersz polecenia z uprawnieniami administratora. 2. Aby skonfigurować pulę aplikacji FastCGI, wykonaj następujące polecenie: appcmd set config /section:system.webServer/fastCGI /+["fullPath='%PHP%\php-cgi.exe',arguments='-s'"]
3. Aby skonfigurować mapowanie obsługi, wykonaj następujące polecenie: appcmd set config /section:system.webServer/handlers /+["name='PHP_Quellcode',modules='FastCgiModule', scriptProcessor='%PHP%\php-cgi.exe|-s',verb='GET,HEAD', path='*.phps',resourceType='File'"]
W poleceniu wskaż ścieżkę dostępu do php-cgi.exe, zgodnie z parametrami aplikacji PHP, którą chcesz skonfigurować.
ROZDZIAŁ 4. Konfigurowanie PHP 101
Ustawianie różnych wersji PHP Dzięki uruchamianiu PHP jako aplikacji FastCGI na jednym serwerze (a nawet na jednej witrynie, jeśli istnieje taka potrzeba) można używać różnych wersji języka PHP. Możliwość ta wynika z tego, że dla różnych ścieżek można przypisać różne uchwyty (mapowania obsługi). W kolejnych punktach pokażę, jak obok wersji PHP 5.3 zainstalować też wersję 5.2 języka. Tę samą procedurę można zastosować także w przypadku innych wersji PHP. Procedura ta składa się z czynności wykonywanych w trakcie ręcznej instalacji języka, ponieważ obecnie Instalator platformy sieci Web (Web PI) nie pozwala na zautomatyzowane instalowanie innych wersji PHP.
Instalowanie nowej wersji języka PHP Najpierw musisz zainstalować nową wersję PHP w następujący sposób: 1. Wejdź na stronę pod adresem http://windows.php.net/download/. 2. Pobierz aktualną wersję PHP 5.2.x (w trakcie powstawania tej książki była to wersja 5.2.17)
w postaci pliku archiwum zip. Wybierz wersję VC6 x86 Non Thread Safe. 3. Rozpakuj zawartość pliku zip do wybranego folderu. W dalszej części procedury będę
używał folderu C:\PHP_5_2. 4. Skopiuj plik C:\PHP_5_2\php.ini-recommended i zmień jego nazwę na C:\PHP_5_2\php.ini. 5. Otwórz plik C:\PHP_5_2\php.ini w edytorze tekstu, a następnie zdefiniuj w nim następujące
opcje konfiguracyjne: date.timezone = "Pacific/Auckland" cgi.force_redirect = 0
Instalowanie w PHP Managerze PHP Manager bardzo ułatwia konfigurowanie nowej wersji języka PHP: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz pożądany element. 3. W obszarze roboczym uruchom funkcję PHP Manager, a następnie wybierz polecenie
PHP Setup/Register New PHP Version. 4. W oknie dialogowym podaj ścieżkę dostępu do pliku wykonywalnego php-cgi.exe, po czym
naciśnij przycisk OK. I to wszystko. PHP Manager sam utworzy potrzebną aplikację FastCGI i skonfiguruje mapowania obsługi. Ponadto narzędzie ustawi nową wersję PHP jako wersję domyślną dla elementu, który wybrałeś w pierwszym kroku powyższej procedury. Potem będziesz mógł zmieniać wersje języka na dowolnym poziomie — w tym celu wystarczy wybrać odpowiedni element w panelu Połączenia, uruchomić PHP Managera i zmienić wersję poleceniem PHP Setup/Change PHP Version.
102 CZĘŚĆ I Internet Information Services (IIS)
Wprawdzie PHP Manager nie obsługuje różnych aplikacji FastCGI opartych na tej samej wersji PHP, jednak bardzo łatwo jest skonfigurować różne wersje języka i przypisać je witrynom, aplikacjom lub podfolderom. Wystarczy, żebyś pamiętał, że we wszystkich lokalizacjach, dla których obowiązuje ta sama wersja PHP, używana jest również ta sama konfiguracja języka.
Konfigurowanie przypisania uchwytu Jeżeli nie używasz PHP Managera, musisz samodzielnie skonfigurować przypisanie uchwytu. Konfigurację tę możesz zdefiniować na wybranym przez siebie poziomie (witryny, aplikacji, katalogu wirtualnego lub podfolderu). Konfigurowanie w Menedżerze IIS Aby zdefiniować przypisanie uchwytu w Menedżerze IIS, wykonaj następujące czynności: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz pożądany element. 3. W obszarze roboczym wybierz funkcję Mapowania obsługi. 4. Jeżeli obsługa rozszerzeń *.php już istnieje, usuń ją — w tym celu w panelu Akcje kliknij
polecenie Usuń. 5. W panelu Akcje kliknij polecenie Dodaj mapowanie modułu, aby zdefiniować nowe
przypisanie. 6. Dla nowego przypisania wpisz następujące parametry:
Ścieżka żądania: *.php
Moduł: FastCgiModule
Wykonywalny (opcjonalnie): C:\PHP_5_2\php-cgi.exe
Nazwa: PHP 5.2 przez FastCGI
7. Naciśnij przycisk Ograniczenia żądań, aby ograniczyć obsługę żądań zgodnie z potrzebami. 8. Naciśnij przycisk OK, aby zatwierdzić wprowadzone zmiany. 9. W oknie dialogowym z pytaniem, czy chcesz utworzyć nową aplikację FastCGI, naciśnij
przycisk Tak. Konfigurowanie w wierszu poleceń Aby zdefiniować mapowanie obsługi w wierszu poleceń, wykonaj następujące polecenie: appcmd set config /section:system.webServer/handlers <Ścieżka> /+[name='PHP_52_przez_FastCGI', modules='FastCgiModule',scriptProcessor='C:\PHP_5_2\php-cgi.exe', verb='*', path='*.php',resourceType='File']
UWAGA Parametr <Ścieżka> wskazuje (wirtualną) ścieżkę do elementu, który chcesz skonfigurować (na przykład Witryna demo PHP/php52).
ROZDZIAŁ 4. Konfigurowanie PHP 103
Konfigurowanie aplikacji FastCGI Na koniec musisz skonfigurować aplikację FastCGI — o ile nie używałeś PHP Managera. Ważne jest szczególnie skonfigurowanie ścieżki dostępu do pliku php.ini. PHP udostępnia różne możliwości wskazywania ścieżki dostępu. W przykładzie zastosuję do tego celu zmienną środowiskową PHPRC. Konfigurowanie w Menedżerze IIS Jeżeli zdefiniowałeś przypisanie uchwytu (mapowanie obsługi) w Menedżerze IIS, aplikacja FastCGI została już wygenerowana. Pozostaje więc tylko odpowiednio ustawić zmienną środowiskową: 1. Otwórz Menedżera IIS i wybierz funkcję Ustawienia FastCGI. 2. Wybierz odpowiednią aplikację FastCGI, a następnie w panelu Akcje kliknij polecenie
Edytuj. Otwarte zostanie okno dialogowe Edytuj aplikację FastCGI. 3. W oknie dialogowym kliknij Zmienne środowiskowe/Kolekcja. 4. Naciśnij przycisk Dodaj. W prawym panelu, w polu tekstowym Name, wpisz PHPRC,
natomiast w polu tekstowym Value wpisz bezwzględną ścieżkę fizyczną pliku php.ini (C:\PHP_5_2\php.ini). Na koniec naciśnij przycisk OK. 5. Naciśnij przycisk OK, aby zakończyć definiowanie konfiguracji.
Konfigurowanie w wierszu poleceń Aby skonfigurować aplikację FastCGI w wierszu poleceń, wykonaj następujące polecenia: 1. Aby zdefiniować aplikację: appcmd set config /section:system.webServer/fastCGI /+[fullPath='C:\PHP_5_2\php-cgi.exe']
2. Aby zdefiniować zmienną środowiskową PHPRC: appcmd set config /section:system.webServer/fastCgi /+"[fullPath='C:\PHP_5_2\php-cgi.exe'].environmentVariables. [name='PHPRC',value='C:\PHP_5_2\php-cgi.exe']"
Testowanie konfiguracji Aby przetestować poprawność zdefiniowanych ustawień, możesz we wskazanym katalogu utworzyć i wykonać plik z następującą zawartością:
Możesz też użyć programu przedstawionego na listingu 4.4.
104 CZĘŚĆ I Internet Information Services (IIS) LISTING 4.4. Skrypt info.php, który zwraca informacje na temat wersji PHP oraz ścieżki do pliku php.ini Wersje PHP - Wersja PHP:
- Ścieżka do php.ini:
- Fizyczna ścieżka skryptu:
Oprócz tego, że dwie różne wersje języka PHP mogą funkcjonować na jednym serwerze lub na jednej witrynie, to w dodatku ten sam skrypt zaimplementowany w PHP może być uruchamiany w dwóch różnych wersjach języka. Aby się o tym przekonać, trzeba umożliwić dostęp do skryptu, który będziesz chciał w ten sposób wykonać, przez dwie różne ścieżki URL, którym przypisane będą różne uchwyty. Czyni się to w następujący sposób: 1. Ustaw ścieżkę (aplikację, katalog wirtualny albo folder) dla pierwszego odwzorowania
uchwytu dla wersji 5.3 języka PHP (na przykład /php53). 2. Ustaw ścieżkę dla drugiego odwzorowania uchwytu, dla PHP w wersji 5.2 (na przykład /php52). 3. Ustaw katalog wirtualny zarówno w /php53, jak i w /php52, tak aby w obydwóch
przypadkach wskazywał on folder ze skryptami PHP, które chcesz wykonać. Na podstawie ścieżki IIS rozpozna, które odwzorowanie uchwytu ma zostać zastosowane, a w konsekwencji — którą wersję PHP należy wykonać. Jednak katalogi wirtualne wskazują na ten sam folder. Kod z listingu 5.4 ilustruje, jak można wykonać skrypt równolegle w dwóch wersjach środowiska. Wynik tego wykonania znajduje się na rysunku 4.8. LISTING 4.5. Równoległe wykonanie tego samego skryptu w dwóch różnych wersjach PHP Dwie wersje PHP na tym samym serwerze PHP 5.3
PHP 5.2
ROZDZIAŁ 4. Konfigurowanie PHP 105
RYSUNEK 4.8. Okno z wynikami równoległego wykonania skryptu w dwóch różnych wersjach PHP
Ustawianie różnych konfiguracji PHP Tak jak na jednym serwerze można uruchamiać różne wersje PHP, tak na jednej maszynie mogą działać różne konfiguracje tej samej wersji języka. Serwer IIS odróżnia aplikacje FastCGI przypisane uchwytom na podstawie dwóch właściwości: ścieżki do pliku wykonywalnego oraz przekazywanych parametrów. Jeżeli jak w tym przypadku mamy do czynienia z dwiema różnymi aplikacjami przetwarzanymi przez tę samą wersję PHP (ten sam plik wykonywalny), wówczas jedynym sposobem odróżnienia aplikacji FastCGI od siebie jest przekazanie do PHP różnych parametrów w wywołaniu tych aplikacji. Ponieważ chcemy użyć dwóch różnych konfiguracji języka, najlepiej jest użyć parametru –c, który służy do wskazywania ścieżki do pliku konfiguracyjnego php.ini. UWAGA Aby potraktować ścieżkę jako wyróżnik poszczególnych konfiguracji PHP, wykonaj czynności opisane w poprzednim punkcie „Ustawianie różnych wersji PHP”. 1. Utwórz alternatywną konfigurację php.ini. 2. Dla wybranego elementu konfiguracji (witryny, aplikacji itp.) usuń istniejące przypisanie
uchwytu *.php, jeżeli takie przypisanie istnieje. 3. Dodaj nowe przypisanie uchwytu dla wybranego elementu konfiguracyjnego.
Parametry oddziel od pliku wykonywalnego znakiem potoku (|), na przykład: C:\PHP\php-cgi.exe|-c C:\PHP\alternatywne-php.ini.
106 CZĘŚĆ I Internet Information Services (IIS) 4. Utwórz odpowiadającą aplikację FastCGI albo użyj Menedżera IIS, aby ją wygenerować. 5. Sprawdź poprawność działania konfiguracji na podstawie prostego skryptu PHP phpinfo(). UWAGA Obecnie PHP Manager nie obsługuje różnych konfiguracji dla tej samej wersji języka PHP. Dlatego oddzielną konfigurację trzeba zdefiniować ręcznie.
Podsumowanie PHP można konfigurować na serwerze IIS w bardzo elastyczny sposób. W szczególności możliwość definiowania konfiguracji dla konkretnych ścieżek i dla konkretnych komputerów ułatwia instalowanie różnych wersji aplikacji PHP na tym samym serwerze. Dzięki możliwości zainstalowania różnych wersji PHP na jednym serwerze, a nawet na jednej witrynie, można migrować środowisko do nowych wersji PHP stopniowo, aplikacja po aplikacji. Funkcja ta jest bardzo pomocna w przypadku, gdy mamy do czynienia z większą liczbą aplikacji, natomiast dzięki FastCGI łatwo tę funkcję wdrażać. W następnym rozdziale omówię zagadnienia bezpieczeństwa związane z konfiguracją PHP oraz sposób wykonywania kodu PHP na serwerze IIS.
Rozdział 5.
Bezpieczeństwo W tym rozdziale: Nadawanie struktury aplikacji ..........................................................................................107 Konfiguracja PHP ...............................................................................................................111 Uwierzytelnianie użytkownika ..........................................................................................114 Tożsamość i prawa dostępu .............................................................................................117 Reguły autoryzacji .............................................................................................................120 Filtrowanie żądań ..............................................................................................................122 Połączenia szyfrowane (HTTPS) .......................................................................................130 Podsumowanie ..................................................................................................................135
Dzięki modułowej budowie oraz filozofii zintegrowanego bezpieczeństwa Internetowe Usługi Informacyjne (IIS) w wersji 7 są bezpieczną platformą działania witryn internetowych. IIS udostępnia szereg funkcji, za pomocą których można zabezpieczyć aplikacje PHP. Jedną z najważniejszych spośród tych funkcji jest możliwość przypisywania każdej aplikacji oddzielnego konta użytkownika. Zyskuje się w ten sposób możliwość precyzyjnego zarządzania prawami dostępu na poziomie systemu plików, do czego służą listy kontroli dostępu (ang. access control list — ACL). Aby jednak z tej funkcji skorzystać, najpierw trzeba nadać aplikacji odpowiednią strukturę — dlatego ten właśnie temat omówię jako pierwszy. W dalszej części rozdziału znajdziesz wskazówki odnośnie do tego, jak zabezpieczać używane konfiguracje języka PHP. Szczegółowo omówię też zagadnienia tożsamości i praw dostępu dla procesów PHP. Natomiast na podstawie opisu funkcji uwierzytelniania, autoryzacji i filtrowania żądań oraz sposobu konfigurowania szyfrowanych połączeń z wykorzystaniem protokołu HTTPS zobaczysz, w jaki sposób można wykorzystać mechanizmy zabezpieczeń obecne na serwerze IIS dla potrzeb aplikacji PHP.
Nadawanie struktury aplikacji Dzięki temu, że IIS ma bardzo ziarnistą budowę, bezpieczeństwo aplikacji PHP można wyraźnie zwiększyć przez nadanie jej odpowiedniej struktury plików i folderów. Kluczowym elementem tego podejścia jest możliwość konfigurowania serwera IIS w taki sposób, aby PHP i inne programy działały wyłącznie w wyznaczonych dla nich katalogach.
108 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Aplikacja PHP zazwyczaj zawiera następujące elementy:
Skrypty PHP, które można wywoływać bezpośrednio w adresie URL.
Skrypty PHP, które są dołączane do innych skryptów, lecz same nie są bezpośrednio wywoływane — przykładem mogą być biblioteki zewnętrzne albo pliki dołączane.
Pliki danych — na przykład zdjęcia, grafiki, pliki kaskadowych arkuszy stylów CSS czy pliki dostępne do pobrania.
Publicznie dostępna do zapisu strefa przeznaczona do przechowywania danych.
Dostępna do zapisu strefa dla plików, które nie są dostępne za pośrednictwem adresu URL — na przykład plików konfiguracyjnych czy plików dziennika zdarzeń.
Strefa do przechowywania plików tymczasowych — na przykład plików aktualnie podlegających przetwarzaniu przez skrypt PHP.
Właściwości wszystkich wspomnianych obszarów można podzielić na trzy grupy:
Wykonywalne/Niewykonywalne (Czy skrypty PHP można wykonywać?)
Publiczne/Prywatne (Czy obszar jest dostępny za pośrednictwem adresu URL?)
Tylko do odczytu/Do odczytu i zapisu (Czy prawa dostępu pozwalają na edytowanie zawartości strefy?)
Zależnie od właściwości, jakie posiada dana strefa, w konfiguracji serwera IIS można nadać konkretne uprawnienia dostępu do niej. Na rysunku 5.1 znajduje się typowa struktura aplikacji, opracowana z uwzględnieniem informacji, które dotąd przedstawiłem. Od tego momentu będę zakładać, że aplikacja PHP nie została zainstalowana na poziomie witryny, lecz skonfigurowano ją jako jedną z wielu aplikacji witryny. Zdefiniowaną przy tym założeniu konfigurację będziesz mógł wykorzystywać, a informacje przetwarzać w taki sam sposób również dla celów aplikacji, która będzie główną aplikacją dla witryny.
Folder główny lub katalog wirtualny Gdy instaluje się aplikację PHP, najpierw trzeba ustalić, czy należy uruchomić ją w fizycznym głównym folderze witryny, czy poza tym folderem. Obydwa podejścia mają wady i zalety. Aplikacja w folderze głównym Dzięki zainstalowaniu aplikacji w folderze głównym zyskujesz to, że jej ścieżka fizyczna pozostaje identyczna jak ścieżka URL. Znacznie ułatwia to administrowanie witryną WWW, jednak z tego wypływa też istotna wada: otóż domyślnie wszystkie pliki i foldery, które znajdują się w folderze głównym, są dostępne za pośrednictwem adresu URL, co oznacza, że są dostępne publicznie. Natomiast ze względów bezpieczeństwa nie powinieneś dawać użytkownikom dostępu za pośrednictwem adresów URL do strefy prywatnej aplikacji. Dlatego będziesz musiał skonfigurować serwer IIS w taki sposób, aby odrzucał on żądania o pliki, które znajdują się w strefie prywatnej.
ROZDZIAŁ 5. Bezpieczeństwo 109
RYSUNEK 5.1. Struktura folderów aplikacji PHP
Możesz do tego wykorzystać funkcję filtrowania żądań na podstawie adresów URL, zgodnie z opisem w punkcie „Filtrowanie żądań” w dalszej części tego rozdziału. Niedostępne powinny też pozostać foldery przeznaczone do przechowywania plików tymczasowych. OSTRZEŻENIE Jeśli później będziesz chciał dodać do aplikacji kolejne foldery, za każdym razem będziesz musiał sprawdzić, czy nowy folder powinien zostać dodany do filtra.
Aplikacja w katalogu wirtualnym Rozwiązaniem alternatywnym względem uruchamiania aplikacji w folderze głównym jest osadzenie tej aplikacji przy użyciu katalogu wirtualnego. Rysunek 5.2 prezentuje proponowaną strukturę folderów dla takiej aplikacji. W tym przypadku poza głównym folderem witryny tworzony jest dodatkowy folder \apps, który będzie przechowywał wszystkie aplikacje. Jako fizyczną ścieżkę katalogu wirtualnego należy wskazać strefę publiczną aplikacji, na przykład \apps\aplikacjaphp1\wwwroot. W ten sposób automatycznie z publicznego dostępu wyłączone zostaną także wszystkie inne foldery aplikacji, które potencjalnie utworzysz w późniejszym czasie.
110 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
RYSUNEK 5.2. Struktura folderów aplikacji, która będzie udostępniana za pośrednictwem katalogu wirtualnego
Wskazywanie plików wykonywalnych Pliki wykonywalne to skrypty PHP, które są wywoływane przez podanie adresu URL i wykonywane przez interpreter języka PHP. To oznacza, że wykonywalne skrypty PHP muszą spełniać dwa kryteria: plik musi znajdować się w strefie publicznej aplikacji i na serwerze IIS musi być zdefiniowane przypisanie uchwytu, które będzie wykonywać skrypty przy użyciu interpretera PHP. UWAGA Skrypty PHP, które znajdują się poza strefą publiczną aplikacji, nie są wykonywane bezpośrednio w odpowiedzi na żądanie URL. Dlatego w tym kontekście nie są one traktowane jako pliki wykonywalne.
Konfigurowanie przypisania uchwytu Serwer IIS pozwala na zmianę przypisania uchwytu (mapowania obsługi) na wszystkich poziomach witryny, o ile tylko konfiguracja nie została zablokowana. Aby zapewnić bezpieczeństwo aplikacji, w strefie publicznej wyłącznie folder \php (albo foldery, które zawierają wykonywalne skrypty PHP) powinien mieć przypisany uchwyt PHP. Żaden inny folder nie powinien takiego przypisania posiadać! Konfigurowanie filtrowania żądań Ponieważ przypisanie uchwytu zwykle bazuje na rozszerzeniu pliku (*.php), można także użyć filtrowania żądań i wyłączyć z obsługi te pliki PHP, które znajdują się poza folderem \php. Takie rozwiązanie stanowi alternatywę dla konfigurowania przypisania uchwytu. Zaletą takiego podejścia jest to, że w zastępstwie nie będzie też wysyłany kod źródłowy plików PHP, ponieważ dostęp do nich jest zablokowany na poziomie ogólnym.
ROZDZIAŁ 5. Bezpieczeństwo 111
Skrypty PHP w folderze głównym strefy publicznej Jeżeli skrypty PHP, na przykład index.php, znajdują się bezpośrednio w folderze głównym strefy publicznej aplikacji, wówczas foldery wykonywalne możesz odseparować od pozostałych na dwa sposoby. Pierwszy sposób opiera się na założeniu, że skrypty PHP, które znajdują się w strefie publicznej, zawsze mają charakter wykonywalnych i prawo to odbiera się folderom z danymi (na przykład \img, \data, \upload itp.). Wadą takiego podejścia jest to, że musisz pamiętać o zdjęciu prawa wykonywania również ze wszystkich innych folderów, które utworzysz w przyszłości. W drugim podejściu wyłącza się ogólną możliwość wykonywania skryptów PHP w strefie publicznej. Prawo wykonywania nadaje się jedynie folderowi \php, dlatego wszystkie skrypty PHP, które znajdują się w głównym folderze, trzeba będzie przenieść do folderu \php. Potem będziesz mógł przekierowywać lub przepisywać żądania pochodzące od użytkowników za pomocą funkcji URL Rewrite (więcej na ten temat napiszę w rozdziale 7. „Ponowne zapisywanie adresów URL”). WAŻNE Upewnij się, że skrypty PHP nie mogą być wykonywane w folderach dostępnych do zapisu.
Potencjalny napastnik, który będzie mógł wykonać własny skrypt na serwerze, będzie miał zdecydowanie łatwiejsze zadanie niż napastnik, który nie będzie mógł wykonać własnych skryptów.
Konfiguracja PHP PHP posiada pewne ustawienia konfiguracyjne, które wpływają na bezpieczeństwo aplikacji PHP. Ustawienia te decydują między innymi o tym, do których plików PHP może mieć dostęp, jak można używać zmiennych oraz które funkcje mogą być wykonywane. W tabeli 5.1 opisałem opcje konfiguracyjne, które mają wpływ na ogólne bezpieczeństwo aplikacji. W tabeli nie ma ustawień dla trybu Safe Mode PHP, ponieważ faktyczne bezpieczeństwo tego trybu jest złudne i należy z niego korzystać w oddzielnych pulach aplikacji. Powinieneś unikać automatycznego neutralizowania danych wejściowych przy użyciu symboli ucieczki, ponieważ opcja ta nie bierze pod uwagę w wystarczającym zakresie różnych formatów kodowania danych wejściowych oraz różnych sposobów ich neutralizowania dla celów baz danych. Tabela 5.2 zawiera listę opcji konfiguracyjnych, które ograniczają możliwości przetwarzania zasobów. Ustawienia te powinieneś dostosować do wymagań własnych aplikacji. WSKAZÓWKA PHP Manager udostępnia specjalny interfejs użytkownika, w którym można zdefiniować większość opcji konfiguracyjnych opisanych w tabeli 5.2. Dla wybranej wersji PHP otwórz PHP Managera z poziomu Menedżera IIS, a następnie wybierz polecenie PHP Settings/Set Runtime Limits.
112 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS) TABELA 5.1. Ogólne opcje konfiguracyjne związane z zabezpieczeniami
Opcja konfiguracyjna
Wartość
Opis
allow_url_fopen
Off
Zabrania dostępu do zewnętrznych zasobów na innych serwerach (jednak nie dotyczy rozszerzeń specjalnych, takich jak cURL).
allow_url_include
Off
Uniemożliwia osadzanie skryptów PHP pochodzących z zewnętrznych źródeł; jeżeli allow_url_fopen ma wartość On, ta opcja powinna być ustawiona na Off.
default_charset
Zestaw znaków
Wskazuje domyślny zestaw znaków przesyłany w nagłówku Content-Type protokołu HTTP, na przykład UTF-8.
disable_classes
Lista klas
Zawiera listę klas PHP, dla których tworzenie instancji jest zabronione.
disable_functions
Lista funkcji
Zawiera listę funkcji PHP, których wykonywanie jest zabronione. Na przykład exec, dl, passthru, shell_exec, system, eval, popen, fsockopen, proc_open, proc_get_status, proc_nice, proc_terminate, show_source, stream_socket_server, symlink, link, lchgrp, lchown, chown, chgrp, posix_initgroups, posix_kill, posix_mkfifo, posix_mknod, posix_setegid, posix_seteuid, posix_setgid, posix_setpgid, posix_setsid, posix_setuid.
enable_dl
Off
Wyłącza możliwość dynamicznego ponownego ładowania rozszerzeń.
expose_php
Off
Zmniejsza zakres informacji udostępnianych przez PHP na zewnątrz.
magic_quotes_gpc
Off
Wyłącza automatyczne neutralizowanie danych wejściowych przy użyciu symboli ucieczki.
magic_quotes_runtime
Off
Wyłącza automatyczne neutralizowanie danych wejściowych pochodzących ze źródeł zewnętrznych.
open_basedir
Ścieżka
Ogranicza dostęp do danych do folderów (i podfolderów). Ścieżka powinna kończyć się znakiem lewego ukośnika.
register_globals
Off
Wyłącza możliwość rejestrowania danych wejściowych jako zmiennych globalnych.
TABELA 5.2. Ograniczanie korzystania z zasobów
Opcja konfiguracyjna
Wartość
Opis
file_uploads
Off
Włącza (On) lub wyłącza (Off) wysyłanie plików na serwer.
max_execution_time
30
Wyrażony w sekundach maksymalny czas, przez jaki można wykonywać skrypt PHP.
max_input_time
60
Wyrażony w sekundach maksymalny czas, przez jaki PHP może wczytywać dane wejściowe.
memory_limit
16M
Maksymalna ilość pamięci do wykorzystania.
post_max_size
8M
Maksymalny rozmiar przychodzących danych HTTP POST (włączając w to rozmiar plików przesyłanych na serwer).
upload_max_filesize
2M
Maksymalny rozmiar plików, które można przesłać na serwer.
upload_tmp_dir
Ścieżka
Tymczasowy folder na pliki wysyłane na serwer. Folder powinien znajdować się poza ścieżką DOCUMENT_ROOT i być dostępny wyłącznie dla użytkowników PHP.
ROZDZIAŁ 5. Bezpieczeństwo 113
Tabela 5.3 zawiera listę opcji konfiguracyjnych, które dotyczą zapisywania informacji o błędach oraz informowania o nich. Wbrew temu, czego można by się spodziewać, opcja display_error = Off działa wyłącznie wtedy, gdy zachodzi równość log_errors = On i plik wskazywany przez error_log jest dostępny do zapisu. W środowiskach produkcyjnych wartości opcji konfiguracyjnych powinno się definiować zgodnie z opisem zawartym w tabeli, zaś w środowiskach roboczych informacje o błędach można także wyświetlać bezpośrednio w wynikach działania skryptów. TABELA 5.3. Opcje konfiguracyjne związane ze zwracaniem i zapisywaniem błędów
Opcja konfiguracyjna
Wartość
Opis
display_errors
Off
Wyłącza wyświetlanie błędów.
display_startup_errors
Off
Wyłącza wyświetlanie błędów procesu uruchamiania PHP.
error_log
Ścieżka do pliku
Plik dziennika zdarzeń, który powinien znajdować się poza DOCUMENT_ROOT.
error_reporting
E_ALL
Raportuje wszystkie błędy (alternatywnie można użyć wartości E_ALL|E_STRICT).
log_errors
On
Zapisuje błędy w dzienniku zdarzeń.
WSKAZÓWKA PHP Manager udostępnia dwa profile raportowania błędów — przeznaczone dla środowiska roboczego oraz dla środowiska programistycznego. Aby z nich skorzystać, otwórz PHP Managera dla wybranej wersji PHP, a następnie wybierz polecenie PHP Settings/Configure Error Reporting. W ten sposób będziesz mógł wybrać jeden lub dwa profile oraz wskazać plik dziennika błędów.
W tabeli 5.4 znajdują się opcje konfiguracyjne, które definiują sposób zarządzania sesjami PHP. Identyfikatory sesji nie powinny znajdować się w adresach URL, ponieważ w ten sposób ułatwia się przeprowadzanie ataków na sesje (podsunięcie identyfikatora sesji albo przechwycenie sesji). TABELA 5.4. Opcje konfiguracyjne do zarządzania sesjami PHP
Opcja konfiguracyjna
Wartość
Opis
session.cookie_httponly
On
Wyłącza możliwość odczytania identyfikatora sesji przez skrypty JavaScript.
session.cookie_secure
On/Off
Dla witryn dostępnych za pośrednictwem protokołu HTTPS należy nadać wartość On; dla pozostałych wartość Off.
session.hash_function
1
Użycie SHA-1 zamiast MD5.
session.save_path
Ścieżka
Opcja powinna wskazywać folder, który znajduje się poza DOCUMENT_ROOT i może być odczytywany wyłącznie przez użytkowników PHP mających prawo do wykonywania.
session.use_only_cookies
On
Wyłącza możliwość używania identyfikatorów sesji w adresach URL.
session.use_trans_sid
Off
Wyłącza możliwość używania identyfikatorów sesji w adresach URL.
114 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Uwierzytelnianie użytkownika Użytkowników można uwierzytelniać na dwa sposoby: wewnątrz samej aplikacji PHP lub przy użyciu mechanizmów uwierzytelniania protokołu HTTP. W pierwszej metodzie aplikacja PHP przyjmuje nazwę użytkownika i jego hasło, obydwa przesyłane w postaci zwykłego tekstu, a następnie porównuje je z przechowywanymi lokalnie danymi o użytkowniku. Jeżeli porównanie wypadnie pomyślnie, za pomocą pliku cookie lub funkcji sesji PHP użytkownikowi przypisany zostaje identyfikator uwierzytelnionej sesji. Jeżeli uwierzytelnienie przeprowadza się za pośrednictwem protokołu HTTP, to IIS (zamiast aplikacji PHP) bierze na siebie odpowiedzialność za zarządzanie użytkownikami i ich uwierzytelnianie. Tego typu metoda uwierzytelniania zabezpiecza nie tylko skrypty PHP, lecz także wszystkie zasoby, które znajdują się w strukturze używanej aplikacji. W przypadku zastosowania uwierzytelniania przy użyciu protokołu HTTP i serwera IIS uwierzytelnienie może być wykonane trzema metodami:
Uwierzytelnianie podstawowe (Basic authentication) — hasło jest przesyłane jako zwykły tekst.
Uwierzytelnianie szyfrowane (Digest authentication) — hasło jest przesyłane w postaci zaszyfrowanej.
Uwierzytelnianie systemu Windows (Windows authentication — NTLM, Negotiate) — uwierzytelnienie następuje za pośrednictwem protokołu NT Lan Manager (NTLM) i umożliwia przesłanie do witryny danych logowania systemu Windows, a więc również tzw. pojedyncze logowanie (ang. single sign-on).
To, której metody uwierzytelnienia powinno się użyć, zależy od warunków, w jakich uwierzytelnianie ma być przeprowadzane. Uwierzytelnianie podstawowe działa zawsze, lecz metody tej należy używać tylko w przypadku, gdy połączenie jest szyfrowane. Uwierzytelnianie szyfrowane działa w większości przeglądarek, lecz Mozilla Firefox może mieć z tą metodą kłopoty. Z kolei uwierzytelnianie systemu Windows działa we wszystkich współczesnych przeglądarkach, lecz nie obsługują go telefony komórkowe.
Instalowanie wymaganych usług ról Zanim będziesz mógł skorzystać z dodatkowych metod uwierzytelniania, będziesz musiał zainstalować niezbędne do tego usługi ról. Instalowanie usług ról uwierzytelniania przy użyciu Menedżera serwera Aby zainstalować usługi ról uwierzytelniania w Menedżerze serwera, wykonaj następujące czynności: 1. Otwórz program Menedżer serwera. 2. Kliknij opcję Role, a następnie prawym przyciskiem myszy kliknij pozycję Serwer sieci Web (IIS)
i w menu podręcznym wybierz polecenie Dodaj usługi ról.
ROZDZIAŁ 5. Bezpieczeństwo 115 3. W sekcji Serwer sieci Web, w grupie Zabezpieczenia, zaznacz opcje Uwierzytelnianie
podstawowe, Uwierzytelnianie Windows oraz Uwierzytelnienie szyfrowane. 4. Naciśnij przycisk Dalej, a następnie przycisk Zainstaluj.
Instalowanie przy użyciu Instalatora platformy sieci Web Aby zainstalować usługi ról uwierzytelniania przy użyciu Instalatora platformy sieci Web (Web PI), wykonaj następujące czynności: 1. Uruchom program Instalator platformy sieci Web. 2. Kliknij polecenie Produkty/Serwer i dodaj następujące pozycje: Usługi IIS: Uwierzytelnianie
podstawowe, Usługi IIS: Uwierzytelnianie systemu Windows oraz Usługi IIS: Uwierzytelnianie szyfrowane. 3. Naciśnij przycisk Zainstaluj, po czym kliknij opcję Akceptuję.
W ten sposób zakończyłeś instalację i możesz skonfigurować odpowiednią metodę uwierzytelniania na serwerze IIS.
Ustawianie metody uwierzytelniania użytkowników w Menedżerze IIS Aby ustawić metodę uwierzytelniania użytkowników w Menedżerze IIS, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz element, dla którego chcesz ustawić
zabezpieczenie w postaci uwierzytelniania. 2. Dwukrotnie kliknij funkcję Uwierzytelnianie, aby ją otworzyć. 3. Wybierz opcję Uwierzytelnianie anonimowe, po czym w panelu Akcje kliknij polecenie
Wyłącz. 4. Wybierz typ uwierzytelniania, który chcesz włączyć, a następnie w panelu Akcje kliknij
polecenie Włącz. Możesz też zdefiniować kilka dodatkowych elementów:
W przypadku uwierzytelniania podstawowego możesz wskazać nazwy obszarów uwierzytelniania dla aplikacji, a także domenę domyślną. W tym celu w panelu Akcje musisz wybrać polecenie Edytuj.
W przypadku uwierzytelniania szyfrowanego możesz zdefiniować nazwę obszaru uwierzytelniania.
W przypadku uwierzytelniania systemu Windows możesz w panelu Akcje kliknąć polecenie Ustawienia zaawansowane, aby włączyć ochronę rozszerzoną. Stosowanie tej opcji ma sens jedynie na witrynach, z którymi połączenie jest szyfrowane protokołem HTTPS. W takim przypadku na liście rozwijanej należy wybrać pozycję Zaakceptuj.
W ten sposób włączyłeś uwierzytelnianie użytkownika dla wybranej witryny lub katalogu.
116 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Ustawianie metody uwierzytelniania w wierszu poleceń Program appcmd pozwala zdefiniować sposób uwierzytelniania dla określonej ścieżki. Aby wyłączyć uwierzytelnianie anonimowe, wykonaj następujące polecenie: appcmd set config <ŚCIEŻKA> /section:anonymousAuthentication /enabled:false
UWAGA Jeżeli w wyniku wykonania polecenia zwrócony zostanie błąd mówiący o zablokowaniu sekcji
konfiguracji, odblokuj sekcję konfiguracji, która dotyczy uwierzytelniania, zgodnie z opisem z rozdziału 3. „Konfigurowanie serwera IIS”.
Aby włączyć uwierzytelnianie domyślne (podstawowe), wykonaj następujące polecenie: appcmd set config <ŚCIEŻKA>/section:basicAuthentication /enabled:true /realm:MójObszar /defaultLogonDomain:""
Z kolei aby włączyć uwierzytelnianie szyfrowane, wykonaj następujące polecenie: appcmd set config <ŚCIEŻKA> /section:digestAuthentication /enabled:true /realm:MójObszar
Uwierzytelnianie systemu Windows włącza się następującym poleceniem: appcmd set config <ŚCIEŻKA> /section:windowsAuthentication /enabled:true /extendedProtection.tokenChecking:Allow
Uwierzytelnianie systemu Windows i nazwy komputerów Jeżeli używasz uwierzytelniania systemu Windows oraz nazwy serwera, która jest inna niż nazwa komputera w adresie URL, wówczas wywołanie strony z komputera lokalnego, na którym działa serwer IIS, nie powiedzie się. Dzieje się tak dlatego, że w uwierzytelnianiu systemu Windows sprawdzana jest również nazwa komputera. UWAGA Nazwę serwera możesz wpisać w pliku C:\Windows\System32\drivers\etc\hosts lub w swoim lokalnym serwerze DNS.
Uwierzytelnianie lokalne Aby umożliwić używanie innej nazwy serwera, wykonaj następujące czynności: 1. Wybierz polecenie Start/Uruchom i wpisz regedit, aby uruchomić Edytor rejestru. 2. Zmień następujące dwa klucze:
Możesz wyłączyć sprawdzanie nazwy w trakcie uwierzytelniania. W tym celu przejdź do klucza HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa i utwórz nową wartość DWORD o nazwie DisableLoopbackCheck. Nadaj jej wartość 1.
Alternatywnie możesz dodać pożądaną nazwę domeny: przejdź do klucza HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0, utwórz nową wartość ciągu wielokrotnego o nazwie BackConnectionHostNames, po czym w polu tekstowym wpisz pożądane nazwy komputerów (każda nazwa w oddzielnym wierszu).
3. Zamknij Edytor rejestru i ponownie uruchom serwer IIS.
ROZDZIAŁ 5. Bezpieczeństwo 117
Uwierzytelnianie na podstawie Active Directory W trakcie uwierzytelniania użytkowników domenowych uwierzytelnianie systemu Windows może zakończyć się niepowodzeniem, jeśli w Microsoft Active Directory nie będą znane nazwy dodatkowych domen. Aby dodać te domeny, użyj programu setspn w następujący sposób: setspn -A HTTP/
Przykład: setstpn -A HTTP/www.witrynademophp.site serwerwww
Natomiast aby uzyskać aktualnie wpisane usługi, wykonaj następujące polecenie: setspn -L
Uzyskiwanie danych uwierzytelniania w PHP W PHP można odczytać nazwę użytkownika z trzech następujących zmiennych:
$_SERVER["LOGON_USER"] zawiera nazwę konta przypisanego użytkownikowi (także po zmianie
tożsamości dokonanej przez filtr uwierzytelniania IIS), które jest używane do obsługi żądania.
$_SERVER["AUTH_USER"] oraz $_SERVER["REMOTE_USER"] zawierają nieprzetworzoną nazwę
użytkownika dokładnie w takiej postaci, w jakiej została ona uzyskana z nagłówków protokołu HTTP. WSKAZÓWKA Standardowo nazwę bieżącego użytkownika powinno się odczytywać ze zmiennej $_SERVER["LOGON_USER"].
Tożsamość i prawa dostępu Aby prawidłowo definiować prawa dostępu do plików i zewnętrznych źródeł danych, takich jak SQL Server i Active Directory, musisz najpierw zrozumieć, z jaką tożsamością i z jakimi prawami działa PHP. Prawa te zależą od różnorodnych ustawień serwera IIS i języka PHP. Prawa dostępu lub tożsamość skryptów PHP są wynikiem działania przedstawionych poniżej reguł, które są wdrażane jedna po drugiej. PHP przybiera wówczas tożsamość pierwszej reguły, która do niego pasuje: 1. fastcgi.impersonate=0 — używa tożsamości puli aplikacji serwera IIS, na przykład
IISAppPool/DefaultAppPool. 2. Dostępna jest informacja o ścieżce logowania — można skonfigurować konkretne konta
użytkowników dla aplikacji i wirtualnych katalogów serwera IIS. W takim przypadku PHP przybiera tożsamość skonfigurowanego użytkownika. 3. Uwierzytelniony użytkownik WWW — PHP przybiera tożsamość użytkownika WWW.
118 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS) 4. Anonimowy użytkownik WWW — wykorzystywany jest wewnętrzny, anonimowy
użytkownik serwera IIS NT AUTHORITY/IUSR. UWAGA PHP przybiera tożsamość uwierzytelnionego użytkownika WWW jedynie wówczas, gdy ustawiona jest opcja fastcgi.impersonate=1 oraz nie jest dostępna ścieżka logowania.
W kolejnym punkcie pokażę, jak definiuje się tożsamości puli aplikacji, anonimowego użytkownika oraz informację o ścieżce logowania.
Tożsamość puli aplikacji Tożsamość puli aplikacji można zdefiniować oddzielnie dla każdej puli. Domyślnie tożsamości puli aplikacji (również dla kont niestandardowych) są przypisywane dynamicznie grupie IIS_IUSRS. Identyfikator bezpieczeństwa (ang. security ID — SID) zintegrowanego konta puli aplikacji również jest uwzględniany w tym procesie (na przykład IIS AppPool\DefaultAppPool). Zawsze możesz też przypisać prawa dostępu do plików kontu puli aplikacji albo grupie IIS_IUSRS. Aby zdefiniować tożsamość puli aplikacji w Menedżerze IIS, wykonaj następujące czynności: 1. W Menedżerze IIS, w panelu Połączenia, kliknij opcję Pule aplikacji i na liście wybierz
pożądaną pulę. 2. W panelu Akcje kliknij polecenie Ustawienia zaawansowane. 3. Wybierz opcję Model procesu/Tożsamość. 4. W wyświetlonym oknie dialogowym możesz wybrać jedno z kont zintegrowanych
albo wskazać własne, niestandardowe konto użytkownika. 5. Naciśnij przycisk OK, aby zamknąć okno dialogowe i wdrożyć w życie wprowadzone
zmiany. Tożsamość puli aplikacji można zdefiniować także przy użyciu programu appcmd. Na przykład poniższe polecenie oznacza konkretnego użytkownika: appcmd set apppool /processModel.identityType:SpecificUser /processModel.userName:manfred /processModel.password:ściśle-tajne
Informacje o ścieżce logowania Dla aplikacji i katalogów wirtualnych można zdefiniować konto użytkownika, którego serwer IIS, a więc także PHP (przy założeniu, że zdefiniowane jest ustawienie fastcgi.impersonate=1) będzie używał do uzyskiwania dostępu do danych. Aby zdefiniować informację o ścieżce logowania w Menedżerze IIS, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz witrynę, aplikację albo katalog wirtualny. 2. W panelu Akcje kliknij opcję Ustawienia podstawowe. 3. W wyświetlonym oknie dialogowym naciśnij przycisk Połącz jako.
ROZDZIAŁ 5. Bezpieczeństwo 119 4. W kolejnym oknie dialogowym możesz wskazać konkretnego użytkownika albo wybrać
Użytkownika aplikacji (uwierzytelnianie przekazywane). 5. Naciśnij przycisk OK, aby zatwierdzić wprowadzone zmiany.
Informacje o ścieżce logowania możesz też zdefiniować za pomocą programu appcmd. Na przykład aby wskazać katalog wirtualny dla określonego użytkownika, użyj następującego polecenia: appcmd set vdir <ŚCIEŻKA> /userName:manfred /password:ściśle-tajne
Definiowanie tożsamości anonimowego użytkownika Tożsamość anonimowego użytkownika można zdefiniować bezpośrednio przy użyciu funkcji uwierzytelniania. W tym celu wykonaj następujące czynności: 1. W Menedżerze IIS otwórz funkcję uwierzytelniania dla wybranego elementu. 2. W obszarze roboczym wybierz opcję Uwierzytelnianie anonimowe, a następnie w panelu
Akcje kliknij polecenie Edytuj. 3. W wyświetlonym oknie dialogowym możesz teraz wskazać użytkownika albo użyć
tożsamości puli aplikacji. Użytkownik IUSR nie potrzebuje hasła. 4. Naciśnij przycisk OK, aby zakończyć wprowadzanie zmian.
Do tego samego celu możesz też użyć programu appcmd: appcmd set config <ŚCIEŻKA> /section:anonymousAuthentication /userName:antoni /password:ściśle-tajne
Zabezpieczanie aplikacji PHP Na podstawie włączonej tożsamości możesz nadawać prawa do aplikacji PHP lub plików znajdujących się na serwerze. W ten sposób za pomocą praw dostępu do plików (opartych na listach ACL) można oddzielać od siebie aplikacje, co wydatnie zwiększa bezpieczeństwo środowiska. OSTRZEŻENIE Jeżeli obowiązuje ustawienie fastcgi.impersonate=1, wówczas IIS korzysta z innych plików (na przykład plików graficznych) na takich samych prawach jak PHP. Dlatego aby zapewnić spójność praw dostępu, zawsze powinieneś uruchamiać PHP z opcją konfiguracyjną fastcgi.impersonate=1.
Aby nadać prawa do plików i folderów tylko tym użytkownikom, którzy mają z nich korzystać, wykonaj następujące czynności: 1. W eksploratorze Windows wybierz plik lub folder, po czym w menu podręcznym kliknij
polecenie Właściwości. 2. Na zakładce Zabezpieczenia naciśnij przycisk Edytuj. 3. Naciśnij przycisk Dodaj, aby dodać odpowiedniego użytkownika i zdefiniować dla niego
prawa na liście poniżej. Dla skryptów PHP i innych plików wystarczy nadać prawo Odczyt.
120 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS) 4. Aby odebrać prawa użytkownikom odziedziczonym (na przykład odebrać prawo odczytu
grupie Użytkownicy), na zakładce Zabezpieczenia kliknij przycisk Zaawansowane, a następnie przycisk Zmień uprawnienia. Potem wyczyść pole wyboru Dołącz uprawnienia dziedziczne z tego obiektu nadrzędnego. W wyświetlonym oknie dialogowym naciśnij przycisk Dodaj. W dalszej kolejności możesz edytować prawa dostępu dla innych obiektów albo całkowicie te obiekty usuwać. Aby przypisać prawa dostępu w wierszu poleceń, użyj polecenia icacls w następujący sposób: icacls auth.php /inheritance:d icacls auth.php /grant "IIS AppPool\DefaultAppPool":R /remove "PREDEFINED\user" icacls auth.php
Pierwsze dwa polecenia usuwają dziedziczenie praw oraz prawa dla grupy Użytkownicy. Dodatkowo puli aplikacji DefaultAppPool przypisane zostaje uprawnienie odczytu i zapisu do pliku auth.php. Natomiast ostatnie polecenie wyświetla listę wszystkich uprawnień do pliku auth.php.
Reguły autoryzacji Dostęp do określonych witryn i aplikacji można kontrolować za pomocą uwierzytelniania użytkownika — na przykład przy użyciu reguł autoryzacji można nadać albo odebrać dostęp określonym grupom użytkowników lub użytkownikom. Serwer IIS udostępnia dwa typy reguł autoryzacji: reguły uprawnień oraz reguły odmawiania. Reguły odmawiania zawsze mają wyższy priorytet. Jeżeli albo użytkownik, albo grupa, do której ten użytkownik należy, są uwzględnione w regule odmawiania, wówczas dostęp nigdy nie zostanie przyznany. Możesz zdefiniować reguły ograniczające dla konkretnych metod protokołu HTTP, dzięki czemu udostępnisz obszary poufne do odczytu (metody GET, HEAD), a jednocześnie uniemożliwisz wprowadzanie w tych obszarach zmian zwykle wynikających z przetwarzania formularzy przy użyciu metody POST.
Instalowanie wymaganych usług ról Zanim będziesz mógł zacząć definiowanie konfiguracji, musisz najpierw zainstalować wymaganą usługę roli autoryzacji IIS. Instalowanie usług ról autoryzacji w Menedżerze serwera Aby zainstalować usługi ról autoryzacji w Menedżerze serwera, wykonaj następujące czynności: 1. Otwórz Menedżera serwera. 2. Kliknij Role, a następnie prawym przyciskiem myszy kliknij pozycję Serwer sieci Web (IIS).
W menu podręcznym wybierz polecenie Dodaj usługi ról. 3. W sekcji Serwer sieci Web/Zabezpieczenia wybierz opcję Autoryzacja adresów URL. 4. Naciśnij przycisk Dalej, a potem Zainstaluj.
ROZDZIAŁ 5. Bezpieczeństwo 121
Instalowanie przy użyciu Instalatora platformy sieci Web (Web PI) Aby zainstalować usługi ról autoryzacji za pomocą Instalatora platformy sieci Web, wykonaj następujące czynności: 1. Uruchom Instalatora platformy sieci Web. 2. Wybierz opcję Produkty/Serwer, po czym wybierz opcję Usługi IIS: Autoryzacja adresów URL. 3. Naciśnij przycisk Zainstaluj, a następnie przycisk Akceptuję.
W ten sposób zakończyłeś instalację i możesz już przystąpić do konfigurowania reguł autoryzacji na serwerze IIS.
Definiowanie reguł w Menedżerze IIS Reguły autoryzacji można też zdefiniować w Menedżerze IIS. W tym celu wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz element, który chcesz skonfigurować. 2. Dwukrotnie kliknij myszą funkcję Reguły autoryzacji .NET. 3. Aby zdefiniować nową regułę uprawnień, w panelu Akcje kliknij polecenie Dodaj regułę Zezwalaj.
(Jeśli chcesz zdefiniować nową regułę odmawiania, kliknij polecenie Dodaj regułę Odrzuć). Wyświetlone zostanie okno dialogowe Dodaj regułę autoryzacji Zezwalaj. Regułą można objąć wszystkich użytkowników, wszystkich użytkowników anonimowych, określone role, grupy użytkowników albo konkretnych użytkowników (rysunek 5.3). Regułę można też ograniczyć do wybranych metod (zleceń) protokołu HTTP, na przykład do metody POST.
RYSUNEK 5.3. Okno dialogowe Dodaj regułę autoryzacji Zezwalaj, w której można dodać regułę autoryzacji uprawnienia
4. Kliknij przycisk OK, aby utworzyć regułę.
122 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Definiowanie reguł w wierszu poleceń Aby zarządzać regułami autoryzacji z poziomu wiersza poleceń, skorzystaj z programu appcmd zgodnie z poniższym opisem:
Aby dodać regułę uprawnienia dla określonych użytkowników: appcmd set config <ŚCIEŻKA> -section:security/authorization /+[accessType='Allow',users='dorota,julia']
Aby dodać regułę odmawiania dla określonych ról lub grup: appcmd et config <ŚCIEŻKA> -section:security/authorization /+[accessType='Deny',roles='xmp\milosnicychomikow']
Aby zdefiniować regułę uprawnienia dla wszystkich użytkowników anonimowych, która będzie dotyczyć metody GET protokołu HTTP: appcmd set config <ŚCIEŻKA> -section:security/authorization /+[accessType='Allow',users='?',verbs='GET']
UWAGA W definicji reguł autoryzacji używaj następującej składni: • Aby wskazać wszystkich użytkowników: users="*" • Aby wskazać wszystkich użytkowników anonimowych: users="?"
Filtrowanie żądań Serwer IIS 7 udostępnia funkcję filtrowania żądań, która automatycznie filtruje i odrzuca niechciane żądania. Filtrowanie żądań jest przeprowadzane na bardzo wczesnym etapie procesu przetwarzania żądania HTTP, aby w ten sposób szybko i skutecznie zapobiec żądaniom potencjalnie niebezpiecznym lub niechcianym. Filtr żądań jest więc skutecznym narzędziem zabezpieczania aplikacji PHP. Jeżeli filtr odrzuci żądanie, IIS zwróci do przeglądarki komunikat o błędzie, który będzie zawierał kod błędu 404. Informacja na temat przyczyny powstania błędu będzie się znajdować w dodatkowym kodzie błędu. Jeśli serwer IIS będzie skonfigurowany w taki sposób, aby zwracać szczegółowe informacje o błędach, wówczas odpowiedź zwrócona do przeglądarki będzie zawierać informację o przyczynie odrzucenia żądania. Filtr żądań posiada osiem różnych ustawień lub funkcji:
Ustawienia ogólne — ustawienia te dotyczą ograniczeń żądań oraz kodowania ciągów znaków (więcej na ten temat napiszę w punkcie „Definiowanie ustawień ogólnych” w dalszej części tego rozdziału).
Ograniczenia długości pojedynczych nagłówków protokołu HTTP — definiuje wyrażone w bajtach ograniczenia rozmiaru wskazanych nagłówków.
Restrykcje na zakres dozwolonych metod protokołu HTTP — wskazuje, które metody protokołu HTTP są dozwolone lub zabronione.
ROZDZIAŁ 5. Bezpieczeństwo 123
Filtrowanie adresów URL — jeśli początek adresu URL będzie odpowiadać wskazanemu ciągowi znaków, URL ten będzie można oznaczyć jako dozwolony lub zablokowany. Jeśli URL zostanie oznakowany jako adres dozwolony, wówczas żadne inne filtry adresów URL nie będą stosowane (alwaysAllowedUrls).
Filtrowanie ciągów zapytań — jeżeli wskazany ciąg znaków będzie znajdować się w dowolnym miejscu ciągu zapytania, wówczas żądanie będzie można oznaczyć jako dozwolone lub zablokowane. Jeśli ciąg zapytania zostanie oznaczony jako dozwolony, żadne inne filtry ciągów zapytań nie będą już stosowane (alwaysAllowedQueryStrings).
Filtrowanie lub przyzwalanie na rozszerzenia plików — za pomocą tej funkcji można zapobiegać atakom na pliki *.exe (więcej informacji na ten temat znajduje się w punkcie „Filtrowanie rozszerzeń nazw plików” w dalszej części tego rozdziału).
Ukrywanie segmentów adresów URL — funkcja ta umożliwia wyłączenie dostępu do pliku web.config.
Filtrowanie na podstawie reguł — realizuje filtrowanie na podstawie określonych reguł (więcej na ten temat w punkcie „Filtrowanie na podstawie reguł” w dalszej części tego rozdziału).
W kolejnych punktach omówię niektóre funkcje filtrowania żądań oraz ich najważniejsze cechy. Pozostałe funkcje i właściwości, na przykład w jaki sposób wyłączyć WebDAV z niektórych reguł, można znaleźć w dokumentacji serwera IIS. UWAGA Filtr żądań jest wykonywany dopiero po przepisaniu adresu URL za pomocą funkcji URL Rewrite. Dlatego wszystkie reguły filtrowania są stosowane już na przepisanym adresie URL. Pamiętaj o tym, gdy będziesz te reguły definiować.
Definiowanie ustawień ogólnych Filtr żądań posiada szereg ustawień globalnych, które dotyczą wszystkich żądań. Ustawienia te dotyczą ograniczeń żądań, filtra znaków oraz domyślnego sposobu przetwarzania metod protokołu HTTP i rozszerzeń nazw plików. Ograniczenia żądań Rozmiar żądań można ograniczyć na podstawie trzech różnych wielkości, do których należą:
Rozmiar zawartości (treści HTTP), zwykle dla żądania POST lub PUT.
Długość adresu URL.
Długość ciągu zapytania.
Domyślne długości adresu URL i ciągu zapytania powinny być odpowiednie dla wszystkich aplikacji, lecz domyślny rozmiar zawartości (określony na 30 MB) może być dla niektórych aplikacji zbyt duży, a dla innych — za mały. W takim przypadku powinieneś dostosować tę wielkość zależnie od okoliczności.
124 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Filtr znaków Filtr znaków parsuje ścieżkę adresu URL w poszukiwaniu znaków niepożądanych. Pozostałe części adresu URL, w szczególności ciąg zapytania, nie są uwzględniane. Filtr żądania udostępnia dwie metody filtrowania znaków:
Blokowanie znaków, które nie należą do zakresu US-ASCII (o kodach szesnastkowych od 00 do 7F) — jeżeli wybierzesz tę funkcję, nie będziesz mógł wywoływać adresów URL, w których nazwa pliku zawiera na przykład znak umlaut (¨). Domyślnie funkcja ta jest wyłączona.
Blokowanie znaków fałszywych lub dwukrotnie zneutralizowanych — funkcja jest domyślnie włączona i odrzuca żądania, w których znaki zostały nieprawidłowo zneutralizowane (na przykład znaki specjalne takie jak <, >, #, " i im podobne nie są poprzedzone symbolem ucieczki) bądź też znaki zostały zneutralizowane dwukrotnie albo (celowo lub przypadkowo) zostały wielokrotnie zamaskowane w wyniku zastosowania kodowania URL. IIS odrzuca takie żądania, ponieważ w przeszłości napastnicy używali dwukrotnie zneutralizowanych znaków, aby wykorzystywać luki w zabezpieczeniach aplikacji. UWAGA Filtr znaków fałszywych lub dwukrotnie zneutralizowanych odrzuca także znak „+” (znak plusa) zakodowany w ścieżce adresu URL. W ciągu zapytania znak plusa reprezentuje spację. Ze względów historycznych aplikacje wciąż mogą interpretować znak plusa znajdujący się w ścieżce adresu URL jako odpowiednik znaku spacji. Jest to jednak niezgodne ze standardem HTTP i dlatego IIS 7 odfiltrowuje tego typu adresy URL.
Stosowanie filtra znaków dwukrotnie zneutralizowanych jest zalecaną praktyką. Może być ona źródłem problemów jedynie wówczas, gdy aplikacja będzie przekazywać i przetwarzać parametry za pośrednictwem podścieżki adresu URL (zmienna PATH_INFO). W takim przypadku należy zapewnić, że parametry będą prawidłowo zakodowane. Zasadniczo nie powinno się zezwalać na znaki procentu (%) w parametrach. W przeciwnym razie może dojść do sytuacji, w której zastosowanego kodowania nie będzie można odróżnić od znaku dwukrotnie zneutralizowanego, który jest odrzucany przez filtr żądania. WSKAZÓWKA Aby zakodować poszczególne fragmenty ścieżki adresu URL, używaj funkcji PHP rawurlencode() i rawurldecode(), ponieważ są one zgodne z odpowiednimi standardami. W przypadku ciągu zapytania używaj natomiast funkcji urlencode() i urldecode().
Jeżeli aplikacja, którą zaimplementujesz, będzie tworzyć lub używać adresów URL odrzucanych przez filtr, będziesz musiał albo wyłączyć ten filtr na serwerze, albo zmienić kod źródłowy aplikacji. Z punktu widzenia bezpieczeństwa drugie podejście jest zdecydowanie bardziej zalecane.
ROZDZIAŁ 5. Bezpieczeństwo 125
Kodowanie adresów URL Reguły kodowania adresów URL są określone w standardach RFC 1738 oraz RFC 3986. Oprócz sposobu strukturyzacji adresów URL wspomniane standardy nakładają obowiązek neutralizowania wszystkich znaków z wyłączeniem znaków alfanumerycznych oraz niektórych znaków specjalnych. Znak zneutralizowany jest przekształcany w trzyznakowy ciąg złożony ze znaku procentu oraz szesnastkowej wartości znaku oryginalnego. Na przykład znak tyldy (~) po zneutralizowaniu przybiera postać ciągu %7F. Pierwotnie znaków, które wykraczały poza zbiór znaków US-ASCII (00 do 7F w notacji szesnastkowej), w ogóle nie uwzględniano w adresach URL. Wyjaśnia to, dlaczego ścieżki adresów URL oraz ścieżki zapytań są kodowane w odmienny sposób.
Kodowanie ścieżki adresu URL Znaki, które nie należą do zbioru znaków US-ASCII — na przykład niemieckie znaki umlaut (¨) — są w ścieżkach adresów URL kodowanie zgodnie z regułami UTF-8. UTF-8 to reguła kodowania znaków Unicode, która dla znaków spoza zbioru US-ASCII generuje zmienną liczbę bajtów z zakresu wartości szesnastkowych od 80 do FF. Znaki bazujące na alfabecie łacińskim, na przykład niemieckie znaki z umlautem, są kodowane w dwóch bajtach. Znaki takie są potem przekształcane (neutralizowane) do formatu ze znakiem procentu, zgodnie z regułami kodowania URL. Na przykład litera A ze znakiem umlaut (Ä), której kodem Unicode jest U+00C4, jest w UTF-8 kodowana jako C3 84 w zapisie szesnastkowym. Z kolei w adresie URL sekwencja ta zostanie zneutralizowana do postaci C3%84.
Kodowanie ciągu zapytania Sposób kodowania ciągów zapytań zależy od warunków, w których ciąg zapytania powstał. Jeżeli adres URL został wpisany przez użytkownika bezpośrednio w pasku adresu, wówczas sposób kodowania zostanie dobrany przez przeglądarkę. Jeżeli ciąg zapytania będzie składać się tylko ze znaków ze zbioru ISO-8859-1 (który zawiera podstawowe znaki specjalne środkowej Europy), kodowanie zostanie przeprowadzone właśnie w formacie ISO-8859-1. W takim przypadku znak Ä zostanie zakodowany do postaci %C4. Natomiast jeśli ciąg zapytania będzie zawierał także inne znaki, różne przeglądarki zastosują różne podejścia; niektóre zakodują ciąg zapytania w formacie UTF-8. Zawsze gdy jest to możliwe, Internet Explorer będzie zastępował znaki wymagające kodowania odpowiadającymi im znakami z alfabetu łacińskiego albo znakami zapytania. Jeżeli ciąg zapytania zostanie wygenerowany przez przeglądarkę, na przykład w wyniku przetworzenia formularza na stronie przesyłanego metodą GET, kodowanie ciągu zapytania będzie takie samo jak kodowanie strony. Zatem jeśli strona HTML będzie zakodowana w formacie UTF-8, wygenerowany ciąg zapytania również zostanie zakodowany w tym formacie. Z kolei jeśli strona HTML będzie zakodowana jako ISO-8859-1, to w taki sam sposób zakodowany zostanie również ciąg zapytania.
Kodowanie PHP Na nieszczęście dla programistów, którzy implementują aplikacje dla użytkowników z różnych krajów, podstawowy kod źródłowy PHP nie jest przygotowany na obsługę Unicode — wszystkie dane wejściowe są kodowane w formacie ISO-8859-1. Aby móc przetwarzać znaki Unicode, trzeba skorzystać z rozszerzenia PHP do obsługi wielobajtowych ciągów znaków albo użyć rozszerzenia iconv. W regułach filtrowania wyszukiwane ciągi znaków są konfrontowane z oryginalnym formatem danych wejściowych. W przypadku ciągów zapytań sprawdzany jest dodatkowo format po zdekodowaniu. W ten sposób zyskujesz gwarancję, że niepożądane ciągi znaków nie prześlizgną się przez filtry, nawet jeśli zostaną zakodowane przy użyciu znaku procentu.
126 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Definiowanie ustawień w Menedżerze IIS Aby zdefiniować ogólne ustawienia filtra żądań, wykonaj następujące czynności: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz element, który chcesz skonfigurować. 3. W obszarze roboczym dwukrotnie kliknij myszą funkcję Filtrowanie żądań, aby ją uruchomić. 4. W panelu Akcje kliknij polecenie Edytuj ustawienia funkcji.
Wyświetlone zostanie okno dialogowe Edytuj ustawienia filtrowania żądań, widoczne na rysunku 5.4.
RYSUNEK 5.4. Edycja ogólnych ustawień filtrowania żądań
W polach tekstowych sekcji Limity żądań możesz ustawić ograniczenia żądań. 5. Aby zezwolić na obsługę ścieżek adresów URL ze znakami spoza zbioru US-ASCII,
zaznacz pole wyboru Zezwalaj na znaki wysokobitowe. 6. Aby zezwolić na obsługę znaków dwukrotnie zneutralizowanych w ścieżce adresu URL,
zaznacz pole wyboru Zezwalaj na podwójne anulowanie. 7. Naciśnij przycisk OK, aby zamknąć okno dialogowe.
Definiowanie ustawień w wierszu poleceń Aby zmienić ogólne ustawienia filtra żądań w wierszu poleceń, otwórz okno wiersza poleceń z uprawnieniami administratora i wykonaj następujące polecenia programu appcmd:
ROZDZIAŁ 5. Bezpieczeństwo 127
Aby określić ograniczenie długości żądania, musisz zdefiniować atrybut maxAllowedContentLength. Atrybut maxUrl wyznacza maksymalną długość adresu URL, zaś atrybut maxQueryString definiuje maksymalną długość ciągu zapytania, zgodnie z poniższym przykładem: appcmd set config "<ŚCIEŻKA>" /section:requestFiltering /requestLimits.maxAllowedContentLength:2500000 /requestLimits.maxUrl:4000 /requestLimits.maxQueryString:1500
Aby zezwolić na obecność w ścieżce adresu URL znaków spoza zbioru US-ASCII, wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestFiltering /allowHighBitCharacters:true
Aby zezwolić na obecność dwukrotnie zneutralizowanych znaków w ścieżce adresu URL, wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestFiltering /allowDoubleEscaping:true
Aby wyłączyć filtrowanie ciągów zapytań w szerszym zakresie (uwzględniające sprawdzanie ciągu zapytania po zdekodowaniu), wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestFiltering /unescapeQueryString:false
UWAGA Parametr <ŚCIEŻKA> w przytoczonych przykładach reprezentuje ścieżkę elementu serwera, który chcesz skonfigurować, na przykład Witryna demo PHP/aplikacjaphp.
Filtrowanie rozszerzeń nazw plików W filtrze żądań można selektywnie blokować żądania, które kończą się określonym rozszerzeniem nazwy pliku. Filtr może działać w dwóch trybach:
Blokowanie wszystkich wskazanych rozszerzeń (ustawienie domyślne).
Obsługa tylko wskazanych rozszerzeń oraz blokowanie wszystkich innych rozszerzeń.
Definiowanie ustawień w Menedżerze IIS Aby zdefiniowań filtrowanie rozszerzeń nazw plików w Menedżerze IIS, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz element, który chcesz skonfigurować. 3. W obszarze roboczym dwukrotnie kliknij myszą funkcję Filtrowanie żądań, aby ją uruchomić. 4. W obszarze roboczym kliknij zakładkę Rozszerzenia nazw plików. 5. W panelu Akcje kliknij polecenie Odmów rozszerzenia nazwy plików, wpisz rozszerzenie
nazwy pliku, które chcesz blokować, i naciśnij przycisk OK. 6. Aby włączyć odrzucanie wszystkich rozszerzeń nazw plików, które nie znajdują się na liście,
w panelu Akcje kliknij polecenie Edytuj ustawienia funkcji i wyczyść pole wyboru Zezwalaj na rozszerzenia nazw plików nieznajdujące się na liście.
128 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Definiowanie ustawień w wierszu poleceń Aby skonfigurować filtrowanie rozszerzeń nazw plików w wierszu poleceń, otwórz okno wiersza poleceń z uprawnieniami administratora i wykonaj następujące polecenia:
Aby dodać rozszerzenie nazwy plików (false — zablokuj rozszerzenie, true — zezwól na obsługę rozszerzenia), wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /+fileExtensions.[fileextension='.exe',allowed='false']
Aby usunąć rozszerzenie nazwy pliku, wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /-fileExtensions.[fileExtension='.exe']
Aby wskazać, czy dozwolona jest obsługa plików z rozszerzeniami nazw, które nie znajdują się na liście, wykonaj następujące polecenie: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /fileExtensions.allowUnlisted:true
Filtrowanie na podstawie reguł Jako ostatni element filtrowania żądań przedstawię funkcję filtrowania z użyciem reguł — niezwykle przydatny mechanizm filtrowania. Reguły filtrowania mogą wyszukiwać określone ciągi znaków w ścieżkach adresów URL, ciągach zapytań i nagłówkach protokołu HTTP. Działanie reguł można też ograniczać, tak aby były one stosowane tylko względem określonych rozszerzeń nazw plików. Definiowanie reguł filtrowania w Menedżerze IIS Aby zdefiniować nową regułę filtrowania w Menedżerze IIS, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz element, który chcesz skonfigurować. 3. W obszarze roboczym dwukrotnie kliknij funkcję Filtrowanie żądań, aby ją uruchomić. 4. Na zakładce Reguły kliknij polecenie Akcje/Dodaj regułę filtrowania.
Wyświetlone zostanie okno dialogowe Dodaj regułę filtrowania, widoczne na rysunku 5.5. 5. Wpisz pożądane wartości:
W polu tekstowym Nazwa wpisz nazwę reguły.
Jeśli chcesz, aby ciągi były wyszukiwane w ścieżce adresu URL, zaznacz pole wyboru Skanuj adres URL.
Jeśli chcesz, aby ciągi były wyszukiwane w ciągu zapytania, zaznacz pole wyboru Skanuj ciąg zapytania.
Jeżeli chcesz również, aby przeszukiwane były nagłówki protokołu HTTP, w sekcji Skanuj nagłówki wpisz nazwy nagłówków, które mają być filtrowane.
ROZDZIAŁ 5. Bezpieczeństwo 129
RYSUNEK 5.5. Dodawanie reguł filtrowania
Aby ograniczyć działanie reguły tylko do wybranych typów plików, w polu tekstowym Rozszerzenie pliku w sekcji Dotyczy wpisz rozszerzenia nazw plików (ze znakiem kropki).
Na koniec w polu Odmów ciągów wpisz ciągi znaków, które chcesz odrzucać. Reguła zostanie zastosowana (i żądanie zostanie odrzucone) wówczas, gdy któryś z podanych ciągów znaków zostanie odnaleziony w analizowanych obszarach, czyli w ścieżce adresu URL, ciągu zapytania lub nagłówku protokołu HTTP.
6. Zamknij okno dialogowe przyciskiem OK, aby wdrożyć regułę w życie.
Edytowanie reguł filtrowania w wierszu poleceń Aby zmienić reguły filtrowania w wierszu poleceń, otwórz okno wiersza poleceń z uprawnieniami administratora i wykonaj następujące polecenia:
Aby zdefiniować nową regułę: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /+"filteringRules.[name='zmiana katalogu',scanUrl='true']"
Aby dodać nagłówki protokołu HTTP, które mają być sprawdzane: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /+"filteringRules.[name='zmiana katalogu'].scanHeaders.[requestHeader='Referer']"
130 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Aby ograniczyć działanie reguły do wybranych rozszerzeń nazw plików: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /+"filteringRules.[name='zmiana katalogu'].appliesTo.[fileExtension='.php']"
Aby wskazać ciąg znaków, który ma być wyszukiwany: appcmd set config "<ŚCIEŻKA>" /section:requestfiltering /+"filteringRules.[name='zmiana katalogu'].denyStrings.[string='..']"
Aby usunąć ciągi znaków, rozszerzenia nazw plików, nagłówki HTTP albo całe reguły, w przytoczonych wyżej poleceniach zamiast sekwencji znaków /+ użyj sekwencji /-.
Połączenia szyfrowane (HTTPS) Protokół HTTPS pozwala na przesyłanie zaszyfrowanych danych protokołem HTTP z wykorzystaniem protokołu TLS lub SSL. Dzięki zaszyfrowaniu danych żaden napastnik nie będzie w praktyce w stanie podsłuchać ani zmienić przesyłanych danych. Jeżeli będziesz przesyłał dane wrażliwe, powinieneś zapewnić na swojej witrynie bezpieczne, szyfrowane połączenie protokołem HTTPS. Aby można było udostępnić połączenie HTTPS, na serwerze WWW musi być zainstalowany odpowiedni certyfikat. Można też używać certyfikatów dla klientów, przeznaczonych do autoryzowania użytkowników, jednak takie certyfikaty są opcjonalne. Menedżer IIS udostępnia proste w użyciu funkcje, które wykonują wszystkie etapy konfiguracji bezpiecznego połączenia. W kolejnych punktach pokażę, w jaki sposób instaluje się certyfikat na serwerze oraz jak konfiguruje się zaszyfrowane połączenie, w jaki sposób wywoływać certyfikaty użytkowników oraz jak na podstawie tych certyfikatów przeprowadzać uwierzytelnienie. Na koniec natomiast opiszę, jak w aplikacjach PHP odpytywać o dane w połączeniu szyfrowanym.
Tworzenie kluczy i certyfikatów Serwer IIS potrafi zarządzać więcej niż jednym certyfikatem serwera dla różnych mapowań obsługi i witryn WWW. Menedżer IIS udostępnia funkcje, za pomocą których można konfigurować trzy różne typy certyfikatów: certyfikaty podpisane samodzielnie, certyfikaty pochodzące od głównego urzędu certyfikacji dla domeny Windows oraz certyfikaty zewnętrznych urzędów certyfikacji. W tym punkcie omówię jedynie sposób konfigurowania certyfikatu domeny, jednak w ten sam sposób będziesz mógł skonfigurować również certyfikaty pozostałych typów. Aby skonfigurować certyfikat domeny, musisz najpierw w domenie uruchomić usługi certyfikacji Active Directory. Sposób uruchamiania usług certyfikacji jest przedstawiony w rozdziale 15. „Konfigurowanie Active Directory”. Aby zacząć korzystać na serwerze IIS z certyfikatu domeny, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz serwer. 2. Dwukrotnie kliknij myszą funkcję Certyfikaty serwera, aby ją otworzyć.
ROZDZIAŁ 5. Bezpieczeństwo 131 3. W panelu Akcje kliknij polecenie Utwórz certyfikat domeny.
Otwarte zostanie okno dialogowe Utwórz certyfikat. 4. Wpisz dane firmy.
W polu tekstowym Nazwa pospolita należy wpisać pełną nazwę domeny zabezpieczanej witryny internetowej, na przykład www.witrynademophp.site. Aby utworzyć certyfikat ogólny, którego będzie można używać także dla wielu nazw poddomen, użyj symbolu wieloznacznego — znaku gwiazdki, na przykład *.witrynademophp.site. 5. Naciśnij przycisk Wybierz, aby wybrać urząd certyfikacji, a następnie wpisz nazwę,
jaka ma się wyświetlać. UWAGA Jeżeli nie możesz wybrać urzędu certyfikacji, oznacza to, że usługi certyfikacji Active Directory nie zostały włączone, używany komputer nie należy do domeny albo ogólnej struktury, w której usługi certyfikacyjne działają, bądź też urzędu certyfikacji nie ma wśród zaufanych głównych urzędów certyfikacji serwera.
6. Naciśnij przycisk Zakończ, aby utworzyć certyfikat i odpowiednio skonfigurować serwer IIS.
W ten sposób utworzyłeś i skonfigurowałeś certyfikat. W następnym kroku możesz użyć certyfikatu do nawiązania zaszyfrowanego połączenia.
Uruchamianie szyfrowanego połączenia Aby uruchomić szyfrowane połączenie, do witryny trzeba dodać powiązanie HTTPS. Następnie można wskazać, czy używanie szyfrowanego powiązania jest obowiązkowe. Tworzenie powiązania Aby zdefiniować powiązanie HTTPS dla witryny, wykonaj następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz witrynę. 2. W panelu Akcje kliknij polecenie Powiązania. 3. Naciśnij przycisk Dodaj i wpisz następujące parametry nowego powiązania:
Typ: https.
Adres IP: adres IP powiązania (opcjonalnie).
Port: 443 (jest to port domyślny).
Certyfikat SSL: wybierz odpowiedni certyfikat serwera.
Nazwa hosta: Jeżeli wybrałeś certyfikat ogólny, możesz również wpisać nazwę komputera. WAŻNE Dla danej kombinacji adresu IP i portu można użyć tylko jednego certyfikatu. Nie można
używać różnych certyfikatów dla różnych witryn, które mają ten sam adres IP i port. Więcej niż jedna witryna może współużytkować powiązanie HTTPS o tym samym adresie IP i numerze portu jedynie wówczas, gdy używany jest certyfikat ogólny.
4. Naciśnij przycisk Zamknij, aby zamknąć okno dialogowe.
132 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Jeżeli po wykonaniu opisanych czynności będziesz mógł wywołać witrynę przez podanie adresu URL HTTPS, będzie to równoznaczne z zestawieniem szyfrowanego połączenia. UWAGA Jeżeli wywołasz witrynę spoza domeny Windows, Internet Explorer wyświetli informację, że certyfikat serwera jest nieprawidłowy, ponieważ główny certyfikat urzędu certyfikacji Active Directory nie jest rozpoznawany poza domeną. W takiej sytuacji możesz tymczasowo kontynuować połączenie i w późniejszym czasie do magazynu zaufanych głównych urzędów certyfikacji dodać główny certyfikat swojego urzędu certyfikacji. Innym rozwiązaniem jest zaklasyfikowanie certyfikatu serwera jako certyfikatu zaufanego (czyni się to bezpośrednio w oknie dialogowym Błąd certyfikatu/Wyświetl certyfikaty/Zainstaluj certyfikat w pasku adresu Internet Explorera).
O tym, jak dodać powiązanie w wierszu poleceń przy użyciu programu appcmd, możesz się dowiedzieć w punkcie „Definiowanie dodatkowych powiązań” rozdziału 2. „Architektura IIS”. Ustawienia protokołu SSL Funkcja Ustawienia SSL pozwala na zdefiniowanie dodatkowych parametrów szyfrowanego połączenia. W Menedżerze IIS wykonaj w tym celu następujące czynności: 1. W panelu Połączenia Menedżera IIS wybierz witrynę. 2. Dwukrotnie kliknij myszą funkcję Ustawienia protokołu SSL, aby ją otworzyć. 3. Jeżeli chcesz narzucić korzystanie z połączenia szyfrowanego, zaznacz opcję Wymagaj
protokołu SSL. 4. Dla certyfikatów klientów można wybrać jedną z trzech następujących opcji: Ignoruj,
Zaakceptuj lub Wymagaj. Opcja domyślna (Zaakceptuj) zwykle sprawdza się najlepiej. 5. W panelu Akcje kliknij polecenie Zastosuj, aby wdrożyć zdefiniowaną konfigurację w życie.
Wymóg korzystania z certyfikatów klientów oraz protokołu SSL można także narzucić w wierszu poleceń programem appcmd: appcmd set config <ŚCIEŻKA> -section:security/access /sslFlags:"Ssl, SslNegotiateCert, SslRequireCert" /commit:apphost
Gdy otworzysz witrynę internetową w przeglądarce, zostaniesz poproszony o wybranie certyfikatu. Tworzenie certyfikatu użytkownika Dzięki certyfikatowi użytkownika serwer może przedstawić się użytkownikom, a użytkownicy mogą przedstawiać się serwerowi. W przypadku serwerów publicznych certyfikaty użytkowników są używane stosunkowo rzadko. Jednak dla witryn intranetowych, które mogą być dostępne również z zewnątrz, certyfikaty użytkownika stanowią ciekawą alternatywę względem innych metod uwierzytelniania.
ROZDZIAŁ 5. Bezpieczeństwo 133
Aby wystawić certyfikat dla użytkownika domenowego, wykonaj następujące czynności: 1. Kliknij Start/Uruchom i wpisz mmc, aby uruchomić konsolę zarządczą Microsoft
Management Console. 2. Wybierz polecenie Plik/Dodaj/Usuń przystawkę i dodaj przystawkę Certyfikaty. Jako typ
zarządzanych certyfikatów wybierz Moje konto użytkownika. 3. W katalogu głównym konsoli wybierz pozycję Certyfikaty — bieżący użytkownik, kliknij
prawym przyciskiem myszy opcję Osobisty i w menu podręcznym wybierz polecenie Wszystkie zadania/Żądaj nowego certyfikatu, aby uruchomić kreatora Rejestracja certyfikatów. 4. Na drugiej stronie kreatora wybierz Zasady rejestracji usługi Active Directory i naciśnij
przycisk Dalej. 5. Jako typ certyfikatu wybierz opcję Użytkownika, a następnie naciśnij przycisk Zarejestruj. 6. Gdy certyfikat zostanie wystawiony, naciśnij przycisk Zakończ, aby zamknąć kreatora. 7. Wystawiony certyfikat możesz sprawdzić w konsoli MMC — w tym celu na liście wybierz
certyfikat i dwukrotnie kliknij polecenie Certyfikaty — bieżący użytkownik/Osobisty/Certyfikaty. Odpytywanie o informacje w aplikacjach PHP W PHP dostępne są różnego rodzaju zmienne $_SERVER, dzięki którym można odczytywać informacje na temat połączenia HTTPS, certyfikatu serwera oraz opcjonalnego certyfikatu klienta. Tabela 5.5 prezentuje dostępne zmienne wraz z ich przykładowymi wartościami dla używanego połączenia HTTPS oraz certyfikatu serwera. Jeżeli ustawiona jest opcja $_SERVER['HTTPS']=on, możesz sprawdzić, czy skrypt został wywołany w ramach połączenia szyfrowanego. Z kolei zmienna $_SERVER['HTTPS_KEYSIZE'] zwraca długość (w bitach) klucza transportowego. Klienty, od których pochodzi żądanie, mogą negocjować różne wartości. TABELA 5.5. Zmienne $_SERVER, za pomocą których można odczytywać informacje na temat połączenia i certyfikatu serwera
Zmienna $_SERVER
Przykładowa wartość
HTTPS
On
HTTPS_KEYSIZE
128
HTTPS_SECRETKEYSIZE
1024
HTTPS_SERVER_ISSUER
DC=witryna, DC=xmp, CN=moje-CA
HTTPS_SERVER_SUBJECT
C=AT, S=Styria, L=Graz, O=XMP, OU=KlubChomikow, CN=*.witrynademophp.site
Jeżeli używasz certyfikatów klienta, możesz skorzystać z dodatkowych zmiennych, aby uzyskać informacje na temat tych certyfikatów. Przeznaczone do tego zmienne zamieszczono w tabeli 5.6. Tożsamość użytkownika jest wczytywana do zmiennej $_SERVER['CERT_SUBJECT'], zaś zmienna $_SERVER['CERT_COOKIE'] zawiera unikatowy identyfikator certyfikatu.
134 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS) TABELA 5.6. Zmienne $_SERVER z informacjami o certyfikacie klienta
Zmienna $_SERVER
Przykładowa wartość
CERT_COOKIE
1058a4ac31108e8dcebcee12ab2780da80777b77a7acfe5dc7ed7b308ebbccd3
CERT_FLAGS
1
CERT_ISSUER
DC=site, DC=xmp, CN=my-CA
CERT_SERIALNUMBER
1c-3f-a9-fb-00-00-00-00-00-0d
CERT_SUBJECT
DC=witryna, DC=xmp, OU=AdventureWorks, OU=Departmenty, OU=Techniczny, CN=Julia Kurtys, [email protected]
Na podstawie takich danych skrypt PHP może jednoznacznie zidentyfikować i uwierzytelnić użytkownika. Gdy używane są certyfikaty klienta, oddzielny etap uwierzytelniania tak naprawdę nie jest konieczny.
Uwierzytelnianie przy użyciu certyfikatów klientów Certyfikaty klientów przydają się nie tylko do uruchamiania i uwierzytelniania połączeń szyfrowanych, lecz można ich używać bezpośrednio jako metody uwierzytelniania. W dalszej części tego punktu pokażę, jak można uwierzytelniać użytkowników domenowych. Aby móc skorzystać z tej możliwości, musisz zainstalować odpowiednią funkcję uwierzytelniania. Instalacja wymaganych usług ról Aby zainstalować usługę ról serwera IIS niezbędną do tego, aby móc przeprowadzać uwierzytelnianie na podstawie certyfikatów klientów, wykonaj następujące czynności: 1. Otwórz Menedżera serwera. 2. Kliknij Role, a następnie prawym przyciskiem myszy kliknij pozycję Serwer sieci Web (IIS).
W menu podręcznym wybierz polecenie Dodaj usługi ról. 3. W sekcji Serwer sieci Web, w grupie Zabezpieczenia, wybierz opcję Uwierzytelnianie
mapowań certyfikatów klientów. UWAGA Druga opcja, o nazwie Uwierzytelnianie mapowań certyfikatów klientów za pośrednictwem usług IIS, nie używa Active Directory. Zamiast tego serwer IIS samodzielnie i bezpośrednio zarządza lokalnymi przypisaniami. Opis tego rozwiązania jest dostępny w dokumentacji MSDN, na stronie pod adresem http://www.iis.net/ConfigReference/system.webServer/security/authentication/ iisClientCertificateMappingAuthentication. 4. Naciśnij przycisk Dalej, a następnie przycisk Zainstaluj.
Zamiennie można też skorzystać z Instalatora platformy sieci Web (Web PI) i za jego pomocą zainstalować potrzebne moduły. 1. Uruchom Instalatora platformy sieci Web. 2. Kliknij polecenie Produkty/Serwer, a następnie dodaj Usługi IIS: Uwierzytelnianie mapowań
certyfikatów klientów.
ROZDZIAŁ 5. Bezpieczeństwo 135 3. Naciśnij przycisk Zainstaluj, a następnie przycisk Akceptuję.
W ten sposób zainstalowałeś wszystkie potrzebne komponenty i możesz przystąpić do konfigurowania metod uwierzytelniania na serwerze IIS. Aktywowanie uwierzytelniania mapowań certyfikatów klientów Uwierzytelnianie mapowań certyfikatów klientów można uaktywnić dokładnie tak samo jak każdą inną metodę uwierzytelniania. Aby włączyć tę konkretną metodę uwierzytelniania, użyj polecenia appcmd (wraz z opcją /commit:apphost, która jest niezbędna, aby zapisać konfigurację w pliku applicationHost.config): appcmd set config <ŚCIEŻKA> -section:clientCertificateMappingAuthentication /enabled:true /commit:apphost
UWAGA Obecnie Menedżer IIS nie udostępnia funkcji, która pozwoliłaby aktywować uwierzytelnianie mapowań certyfikatów klientów. Dlatego w tym punkcie skupiam się wyłącznie na wykorzystaniu do tego celu programu appcmd.
Jeżeli używasz przeglądarki, w której zainstalowano prawidłowy certyfikat klienta umożliwiający dostęp do witryny, zostaniesz teraz poproszony o wskazanie tego certyfikatu. Gdy wybierzesz odpowiedni certyfikat, zostaniesz automatycznie uwierzytelniony. Potem w skrypcie PHP można sprawdzić przypisane konto użytkownika, na przykład za pomocą zmiennej $_SERVER['LOGON_USER']. Zmienna $_SERVER['AUTH_TYPE'] będzie wówczas mieć wartość "SSL/PCT". Zależnie od zalogowanego użytkownika serwer zacznie także stosować odpowiednie reguły autoryzacji.
Podsumowanie Możliwość przypisywania różnych tożsamości oraz praw dostępu poszczególnym aplikacjom PHP, czy to w ramach różnych pul aplikacji, czy to na podstawie ścieżki logowania, jest kluczowym mechanizmem, którego używa się do zabezpieczania witryn internetowych. Dzięki wspomnianym rozwiązaniom można skutecznie odseparować aplikacje od siebie, dzięki czemu błędy w jednej nie będą praktycznie w żaden sposób wpływać na działanie innej aplikacji. Odpowiednio bezpieczna konfiguracja PHP zdecydowanie zmniejsza także możliwości przeprowadzenia skutecznego ataku na nią. Dostępność mechanizmów uwierzytelniania użytkownika, reguł autoryzacji i filtrów żądań w różnych konfiguracjach pozwala wdrażać zróżnicowane scenariusze bezpieczeństwa dla aplikacji PHP działających na serwerze IIS. Jeżeli jeszcze dodatkowo uruchomisz połączenie HTTPS, będziesz mógł dodatkowo zabezpieczyć dane na etapie przed ich podejrzeniem w trakcie przesyłania. W następnym rozdziale wyjaśnię, jak za pomocą różnego rodzaju buforów pamięci podręcznej zwiększa się wydajność działania aplikacji napisanych w języku PHP.
136 CZĘŚĆ I INTERNET INFORMATION SERVICES (IIS)
Rozdział 6.
Pamięć podręczna W tym rozdziale: Pamięć podręczna a sieć WWW .......................................................................................138 Buforowanie danych wyjściowych ...................................................................................146 Rozszerzenie WinCache dla PHP ......................................................................................150 Podsumowanie ..................................................................................................................157
Pamięć podręczna to bardzo ważne narzędzie do zwiększania wydajności działania aplikacji PHP przy jednoczesnym zmniejszaniu ilości zasobów zużywanych na serwerze. Jako programista PHP masz do dyspozycji trzy możliwości wykorzystania pamięci podręcznej:
Na podstawie nagłówków protokołu HTTP możesz kontrolować, czy i jak długo klienty lub serwery pośredniczące mogą przechowywać dane w swojej pamięci podręcznej. Zaletą tego rozwiązania jest to, że w późniejszym czasie ten sam klient lub serwer nie wysyła już do serwera nowego żądania o te same zasoby, a zatem nie są angażowane kolejne zasoby serwera ani transfer w ramach połączenia sieciowego.
Dzięki buforowaniu danych wyjściowych serwera Internetowe Usługi Informacyjne (IIS) pliki najczęściej wywoływane są przechowywane bezpośrednio w pamięci podręcznej serwera i zwracane bezpośrednio z niej w odpowiedzi na określone żądanie. W tym przypadku dostęp do systemu plików nie jest więc potrzebny, skrypty PHP nie muszą być ponownie wykonywane, a baza danych — odczytywana. W efekcie wydajność działania aplikacji odpowiednio wzrasta.
Rozszerzenie WinCache języka PHP przyspiesza wykonywanie skryptów PHP. WinCache umieszcza kody skompilowanych skryptów PHP w pamięci podręcznej, co zmniejsza czas ich wykonywania, a także liczbę niezbędnych operacji odczytu w systemie plików.
Wszystkie trzy możliwości korzystania z pamięci podręcznej zostaną opisane w kolejnych punktach tego rozdziału.
138 CZĘŚĆ I Internet Information Services (IIS)
Pamięć podręczna a sieć WWW Strona internetowa składa się z wielu pojedynczych elementów, takich jak kod HTML strony, osadzone na niej elementy graficzne, instrukcje formatujące kaskadowych arkuszy stylów CSS, pliki skryptów (na przykład JScript albo JavaScript), a także inne treści aktywne (na przykład Microsoft Sliverlight albo ActiveX). Każdy taki plik jest przesyłany z serwera do klienta w ramach oddzielnego cyklu HTTP wywołania i odpowiedzi na to wywołanie. Nawet jeśli kod HTML strony internetowej zmieni się między dwoma kolejnymi żądaniami, to pozostała zawartość strony, na przykład logo albo style CSS, pozostają wciąż takie same. Tak naprawdę większość elementów strony (w tym nierzadko sam kod HTML) ma w zasadzie charakter statyczny. Zawartość tych elementów zmienia się niezbyt często albo w ogóle. Strona główna portali informacyjnych, takich jak http://msn.com, zmienia się bardzo często. Jednak już logo takich portali nie zmienia się prawie nigdy, a ponadto treść poszczególnych artykułów publikowanych na portalu też już raczej się nie zmieni. Dlatego rozsądnym rozwiązaniem jest zapisywanie odpowiedzi na żądania HTTP lokalnie na kliencie, ponieważ pozwoli to oszczędzić transfer i czas potrzebny na przesłanie danych z serwera do klienta, zwiększy wydajność aplikacji i pozytywnie wpłynie na odczucia użytkownika. Jest to szczególnie istotne w przypadku używania przycisku Wstecz w przeglądarce, ponieważ jeżeli poprzednio oglądana strona nie została zapisana w lokalnej pamięci podręcznej, wówczas użycie przycisku Wstecz spowoduje ponowne wysłanie żądania o stronę do serwera, a opóźnienie związane z jej ponownym pobieraniem będzie zauważalne dla użytkownika. Protokół HTTP zawiera w sobie mechanizmy i nagłówki przeznaczone do obsługi pamięci podręcznej. Na ich podstawie serwer może kontrolować, które treści mają być zapisywane w buforze klienta, pod jakimi warunkami i na jak długo. Na przykład na witrynie http://msn.pl logo można zapisać w pamięci podręcznej na długie miesiące, zaś poszczególne artykuły na kilka minut. Z kolei stronę główną portalu opłaca się zapisywać w buforze wyłącznie na potrzeby obsługi przycisku Wstecz, ponieważ we wszystkich innych przypadkach powinno się ją załadować ponownie. Protokół HTTP udostępnia szereg funkcji do obsługi pamięci podręcznej, które dotyczą czasu przechowywania w tej pamięci, zmian treści i warunków przechowywania. W kolejnych punktach bliżej opiszę wszystkie wspomniane funkcje.
Przechowywanie w pamięci podręcznej przez określony czas Aby wyznaczyć czas przechowywania treści w pamięci podręcznej, można użyć dwóch mechanizmów protokołu HTTP: nagłówka Expires oraz instrukcji max-age. Nagłówek Expires Aby zezwolić na przechowywanie danego zasobu w pamięci podręcznej przez określony czas, należy użyć nagłówka odpowiedzi Expires protokołu HTTP. Nagłówek Expires zawiera wskazanie czasu, po jakim treść zapisana w pamięci podręcznej nie powinna być więcej
ROZDZIAŁ 6. Pamięć podręczna 139
używana (ani przez przeglądarkę, ani przez serwery pośredniczące), lecz powinna zostać na nowo pobrana ze źródła. Na listingu 6.1 znajduje się treść odpowiedzi HTTP, w której użyto nagłówka Expires. LISTING 6.1. Użycie nagłówka Expires do ograniczenia czasu przechowywania treści w pamięci podręcznej HTTP/1.1 200 OK Content-Type: image/jpeg Date: Wed, 07 Sep 2011 07:31:07 GMT Expires: Fri, 07 Sep 2012 07:25:03 GMT
Format daty jest zdefiniowany w dokumencie RFC ze specyfikacją protokołu HTTP i musi być następujący (liczby w nawiasach wskazują wymaganą liczbę znaków): dzień(3), data(2) miesiąc(3) rok(4) godzina(8) GMT
Datę tę i czas wskazuje się jako czas strefy czasowej Greenwich Mean Time (GMT). UWAGA W ramach protokołu HTTP czas GMT jest równoważny czasowi Coordinated Universal Time (UTC).
W PHP datę w wymaganym formacie można wygenerować następującą instrukcją: $dateString = gmdate('D, d M Y H:i:s', $timeStamp) . ' GMT';
UWAGA Data i godzina wskazywane w nagłówku Expires nie powinny sięgać dalej niż rok w przyszłość.
Z kolei aby zyskać pewność, że zawartość strony, która często się zmienia, jest zawsze pobierana z serwera źródłowego, powinieneś w nagłówku Expires ustawić taką samą datę i godzinę jak w nagłówku Date: Date: Wed, 07 Apr 2010 07:31:07 GMT Expires: Wed, 07 Apr 2010 07:31:07 GMT
UWAGA Wiele przeglądarek akceptuje wartość -1 w nagłówku Expires. Wartość taka również wskazuje, że dany zasób musi zostać na nowo pobrany z serwera źródłowego.
Instrukcja max-age Nagłówek Expires wyznacza konkretną datę i godzinę, zaś instrukcją max-age można wskazać w nagłówku Cache-Control czas w ujęciu względnym. Wartość max-age podaje się w sekundach i wskazuje ona, przez jaki czas dana treść może być przechowywana w pamięci podręcznej. Na przykład aby zezwolić na przechowywanie danego zasobu w pamięci podręcznej przez dwa dni, nagłówek powinien mieć treść przedstawioną na listingu 6.2.
140 CZĘŚĆ I Internet Information Services (IIS) LISTING 6.2. Instrukcja max-age to inny sposób ograniczania czasu przechowywania treści w pamięci podręcznej HTTP/1.1 200 OK Content-Type: image/jpeg Date: Wed, 07 Sep 2011 07:31:07 GMT Cache-Control: max-age=172800
Jeżeli użyte zostaną jednocześnie nagłówek Expires i instrukcja max-age, wówczas pierwszeństwo będzie mieć max-age. Aby zapewnić sobie, że dany zasób będzie zawsze pobierany z serwera, należy ustawić max-age na 0 w następujący sposób: Cache-Control: max-age=0
Treści zmienne Protokół HTTP zawiera w sobie dwa mechanizmy, które pozwalają ustalić, czy zawartość zasobu WWW uległa zmianie. Są to: data ostatniej zmiany oraz znacznik Entity, który jednoznacznie wskazuje wersję zasobu. Data ostatniej zmiany Data zmiany jest zawarta w nagłówku Last-Modified. Na tej podstawie klient może później stwierdzić, czy zawartość zasobu zmieniła się od czasu, gdy pobrano go po raz ostatni. Jeżeli zawartość zasobu nie uległa zmianie, serwer zwróci odpowiedni komunikat HTTP o kodzie 304. Opcja ta nie eliminuje całkowicie komunikacji między klientem a serwerem, lecz zdecydowanie zmniejsza wielkość transferu danych. Listing 6.3 ilustruje przykładową sytuację: serwer odpowiada na pierwsze żądanie klienta i zwraca zawartość zasobu oraz nagłówek Last-Modified, który zawiera datę ostatniej zmiany zasobu. Gdy w późniejszym czasie klient ponownie wywoła ten sam zasób, w ramach żądania wyśle też nagłówek If-Modified-Since. W ten sposób skrypt PHP może sprawdzić, czy data ostatniej zmiany jest wciąż taka sama. Jeśli tak, zwrócona zostanie jedynie odpowiedź HTTP z kodem 304, bez zawartości wywoływanego zasobu (co widać na listingu). Klient pobierze więc treść z pamięci podręcznej. Jeżeli natomiast zawartość zasobu uległa zmianie, zostanie on przesłany do klienta w standardowy sposób, wraz z odpowiedzią HTTP o kodzie 200. LISTING 6.3. Przebieg żądań i odpowiedzi, gdy używany jest nagłówek Last-Modified Pierwsze żądanie klienta: GET /lastmodified.php HTTP/1.1 Host: witrynademophp.site Odpowiedź serwera: HTTP/1.1 200 OK Last-Modified: Mon, 05 Sep 2011 07:31:07 GMT Date: Wed, 07 Sep 2011 08:57:04 GMT
ROZDZIAŁ 6. Pamięć podręczna 141 Drugie żądanie klienta: GET /lastmodified.php HTTP/1.1 Host:witrynademophp.site If-Modified-Since: Mon, 05 Sep 2011 07:31:07 GMT Odpowiedź serwera: HTTP/1.1 304 Not Modified Date: Wed, 07 Sep 2011 08:57:13 GMT
Serwer lub skrypt PHP musi wówczas jawnie przeanalizować wartość nagłówka HTTP If-Modified-Since . Znacznik Entity Określenie daty ostatniej zmiany nie zawsze jest możliwe. W takich przypadkach można skorzystać z nagłówka ETag, który przypisuje danej treści znacznik Entity, a więc unikatowy ciąg znaków dla konkretnej wersji tej treści. Ciągiem tym może być liczba albo wartość mieszająca. Cały mechanizm działa podobnie jak w przypadku nagłówka Last-Modified: w kolejnych żądaniach klient wysyła nagłówek If-None-Match, który jest sprawdzany przez serwer lub skrypt PHP. Na listingu 6.4 znajdują się dwa żądania klienta. Po pierwszym żądaniu serwer odpowiada nagłówkiem ETag. Wartość musi być umieszczona w cudzysłowach, natomiast wyboru samej wartości dokonujesz już samodzielnie. Drugie żądanie, wykonywane przez klienta w późniejszym czasie, zawiera wersję ETag treści, która znajduje się w pamięci podręcznej klienta. Wartość ta jest przesyłana w nagłówku If-None-Match. Serwer lub skrypt analizują wartość ETag i zwracają odpowiedź, którą może być kod 304 protokołu HTTP (jeżeli treść nie uległa zmianie) bądź też kod 200 protokołu HTTP wraz z nową wersją zasobu. LISTING 6.4. Przebieg żądań i odpowiedzi, gdy używany jest nagłówek ETag Pierwsze żądanie klienta: GET /etag.php HTTP/1.1 Host: witrynademophp.site Odpowiedź serwera: HTTP/1.1 200 OK ETag: "387060f9402aca1:5fff-35" Date: Wed, 07 Sep 2011 08:57:04 GMT Drugie żądanie klienta: GET /etag.php HTTP/1.1 Host:witrynademophp.site If-None-Match: "387060f9402aca1:5fff-35"
UWAGA Nagłówek If-None-Match może zawierać także więcej niż jedną wartość znaczników Entity, na przykład: If-None-Match: "387060f9402aca1:5fff-35", W/"3653412", "38:5fff:35aca1"
142 CZĘŚĆ I Internet Information Services (IIS)
Znaczniki Entity można zakwalifikować jako znaczniki słabe lub mocne:
Znaczniki mocne muszą się między sobą różnić od razu, gdy nowa wersja zasobu będzie się różnić od poprzedniej co najmniej jednym bajtem.
Znaczniki słabe, które reprezentuje się jako W/"…", powinny zmieniać się jedynie wówczas, gdy zmieni się semantyczne znaczenie zasobu.
Na przykład znacznik mocny dla licznika wizyt zmienia się wraz z wyświetleniem strony przez każdego kolejnego użytkownika, natomiast znacznik słaby może się zmieniać na przykład raz na dzień, jeżeli dokładna liczba użytkowników wchodzących na stronę nie jest dla aplikacji tak istotna. Zawsze gdy jest to możliwe, powinno się używać znaczników mocnych. Nagłówków ETag i Last-Modified można używać łącznie. Jeżeli nagłówki If-None-Match i If-Modified-Since zostaną ustawione w następujących po sobie żądaniach, wówczas w przypadku spełnienia obydwóch wskazanych przez nie warunków serwer zwykle odpowie standardowym komunikatem HTTP o kodzie 304.
Warunki zapisywania w pamięci podręcznej Nagłówek HTTP o nazwie Cache-Control pozwala definiować dodatkowe warunki zapisywania danych w pamięci podręcznej. W tabeli 6.1 znajdują się najważniejsze instrukcje tego nagłówka. Instrukcja max-age została opisana już wcześniej w tym rozdziale, w punkcie „Instrukcja max-age”. TABELA 6.1. Instrukcje nagłówka Cache-Control
Instrukcja
Opis
max-age=sekundy
Maksymalny wiek wersji przechowywanej w pamięci podręcznej, po którego osiągnięciu klient musi ponownie zażądać zasobu z serwera.
must-revalidate
Zasób może być zapisywany w pamięci podręcznej, lecz przed jego kolejnym użyciem klient musi ponownie nawiązać kontakt z serwerem i sprawdzić, czy zasób uległ zmianie.
no-cache
Zasób nie może być zapisywany w pamięci podręcznej i zawsze należy żądać go od serwera.
no-store
Zasób nie może być zapisywany w pamięci podręcznej ani w pliku lokalnym (na przykład w folderze tymczasowych plików internetowych). Opcja ta jest przeznaczona przede wszystkim dla witryn, na których przetwarza się poufne dane.
private
Zasób można zapisywać wyłącznie w prywatnym buforze pamięci podręcznej, przeznaczonym tylko dla użytkownika, który wysłał żądanie.
public
Zasób można zapisywać w pamięci podręcznej dostępnej dla większej liczby użytkowników — zwykle jest to pośredniczący bufor pamięci podręcznej. Jest to działanie domyślne, gdy na poziomie protokołu HTTP nie jest przeprowadzane uwierzytelnianie.
W pojedynczym nagłówku można łączyć ze sobą więcej niż jedną instrukcję — wystarczy oddzielić je od siebie znakiem przecinka, jak w przykładzie: Cache-Control: public, max-age=86400, must-revalidate
ROZDZIAŁ 6. Pamięć podręczna 143
Różne przeglądarki mogą w różny sposób interpretować instrukcje no-cache i no-store. W przypadku naciśnięcia przycisku Wstecz lub Dalej wszystkie przeglądarki na nowo załadują stronę, jeśli ustawiona będzie instrukcja no-store. Jeżeli natomiast obowiązywać będzie instrukcja no-cache, przeglądarki wyświetlą wersję zasobu pobraną z pamięci podręcznej albo (zależnie od przeglądarki) ponownie załadują zasób z serwera. Starsze przeglądarki obsługują natomiast nagłówek Pragma, którego przeznaczenie jest obecnie nieco inne: Pragma: no-cache
Nagłówek Pragma pozwala w starszych przeglądarkach wyłączyć zapisywanie w pamięci podręcznej.
Definiowanie nagłówków na serwerze IIS Nagłówki protokołu HTTP, które odpowiadają za użycie pamięci podręcznej, można w kodzie PHP ustawiać za pomocą metody header(). Dla zasobów innego typu, na przykład dla elementów graficznych, nagłówki można zdefiniować na serwerze IIS. Znaczniki Entity (nagłówki ETag) oraz nagłówki Last-Modified są dodawane automatycznie do zasobów udostępnianych przez uchwyt StaticFile. Dla tego rodzaju zasobów serwer IIS przejmuje zarządzanie nagłówkami zmian i zaczyna monitorować dany plik oraz odpowiednio ustawiać wartości nagłówków, gdy zarejestrowana zostanie jakakolwiek zmiana tego pliku. Inne nagłówki można zdefiniować w Menedżerze IIS albo przy użyciu programu appcmd. Definiowanie nagłówków w Menedżerze IIS Aby w Menedżerze IIS ograniczyć czas przechowywania w pamięci podręcznej, wykonaj następujące czynności: 1. Otwórz Menedżera IIS. 2. W panelu Połączenia wybierz witrynę, aplikację lub katalog, który chcesz skonfigurować. 3. W obszarze roboczym otwórz moduł Nagłówki odpowiedzi HTTP. 4. W panelu Akcje kliknij polecenie Ustaw wspólne nagłówki.
Wyświetlone zostanie okno dialogowe Ustawianie wspólnych nagłówków odpowiedzi HTTP, widoczne na rysunku 6.1.
RYSUNEK 6.1. Definiowanie nagłówka odpowiedzi HTTP dla zasobów, których ważność wygasła
144 CZĘŚĆ I Internet Information Services (IIS) 5. Zaznacz pole opcji Zawartość sieci Web wygasa, a następnie wybierz jedną z trzech opcji:
Natychmiast — zasób nie może być zapisywany w pamięci podręcznej (ustawia nagłówek Cache-Control na no-cache).
Po — wpisz czas przechowywania w pamięci podręcznej (ustawia nagłówek Cache-Control na max-age=).
O — wskazuje, że zasób może znajdować się w pamięci podręcznej do określonego momentu (ustawia nagłówek Expires na podaną datę i godzinę).
6. Naciśnij przycisk OK, aby wdrożyć ustawienia.
W tym samym module możesz też zdefiniować dodatkowe nagłówki, w szczególności nagłówek Cache-Control. W tym celu wykonaj następujące czynności: 7. W panelu Akcje kliknij polecenie Dodaj. 8. W wyświetlonym oknie dialogowym, w polu tekstowym Nazwa, wpisz nazwę nagłówka HTTP (na przykład Cache-Control), zaś w polu tekstowym Wartość wpisz pożądaną zawartość tego nagłówka (na przykład must-revalidate, public). 9. Naciśnij przycisk OK, aby zacząć dodawać nagłówek do nowych żądań. UWAGA Serwer IIS automatycznie dołącza zbiór instrukcji Cache-Control funkcji wspólnych nagłówków do ręcznie zdefiniowanych nagłówków odpowiedzi, aby obydwóch nagłówków można było używać jednocześnie.
Definiowanie nagłówków w wierszu poleceń Aby zdefiniować pożądane nagłówki w wierszu poleceń, skorzystaj z programu appcmd i wykonaj następujące polecenia: Aby wyłączyć zapisywanie zasobów statycznych w pamięci podręcznej: appcmd.exe set config "<ŚCIEŻKA>" -section:system.webServer/staticContent /clientCache.cacheControlMode:"DisableCache"
Aby włączyć zapisywanie zasobów statycznych w pamięci podręcznej na określony czas (podawany w formacie dni.godziny:minuty:sekundy): appcmd.exe set config "<ŚCIEŻKA>" -section:system.webServer/staticContent /clientCache.cacheControlMode:"UserMaxAge" /clientCache.cacheControlMaxAge:"1.12:30:00"
Aby włączyć przechowywanie zasobów statycznych w pamięci podręcznej do określonego momentu: appcmd.exe set config "<ŚCIEŻKA>" -section:system.webServer/staticContent /clientCache.cacheControlMode:"UseExpires" /clientCache.cacheControlMaxAge:"Thu, 07 Apr 2011 07:25:03 GMT"
W celu zarządzania własnymi nagłówkami (niezależnie od tego, czy zasób jest odsyłany przez uchwyt StaticFile, czy nie) posłuż się następującymi poleceniami appcmd:
ROZDZIAŁ 6. Pamięć podręczna 145
Aby dodać nowy nagłówek: appcmd set config "<ŚCIEŻKA>"-section:system.webServer/httpProtocol /+customHeaders.[name='',value='']
Aby usunąć nagłówek: appcmd set config "<ŚCIEŻKA>" -section:system.webServer/httpProtocol /-customHeaders.[name='']
Elementy konfiguracyjne Ustawienia pamięci podręcznej można zdefiniować bezpośrednio w plikach konfiguracyjnych przy użyciu dwóch następujących elementów konfiguracyjnych: staticContent/clientCache oraz httpProtocol/customHeaders. Tabela 6.2 prezentuje atrybuty pamięci statycznej dla zasobów przekazywanych przez uchwyt StaticFile. TABELA 6.2. Atrybuty elementu konfiguracyjnego staticContent/clientCache
Atrybut
Opis
cacheControlMaxAge
Wskazuje dozwolony czas przechowywania w pamięci podręcznej. Czas wskazuje się w formacie dni.godziny:minuty:sekundy, na przykład 1.12:30:00. Atrybut działa wyłącznie wraz z ustawieniem cacheControlMode=UseMaxAge.
cacheControlMode
Definiuje tryb działania pamięci podręcznej: DisableCache — zapisywanie w pamięci podręcznej jest wyłączone. UseMaxAge — zasób może znajdować się w pamięci podręcznej tylko przez podany czas. UseExpires — zasób może znajdować się w pamięci tylko do określonego momentu.
httpExpires
Wskazuje datę i godzinę, do których dozwolone jest przechowywanie zasobu w pamięci podręcznej — na przykład Thu, 07 Apr 2011 07:25:03 GMT. Atrybut działa wyłącznie wraz z ustawieniem cacheControlMode=UseExpires.
Na listingu 6.5 pokazano, w jaki sposób ustawia się przechowywanie zasobu przez jeden dzień, 12 godzin i 30 minut. LISTING 6.5. Ustawienia pamięci podręcznej dla treści statycznych
W kolekcji ustawień konfiguracyjnych httpProtocol/customHeaders można dodatkowo ustawić inne nagłówki. Listing 6.6 ilustruje sposób, w jaki do nagłówka Cache-Control dodaje się instrukcję must-revalidate.
146 CZĘŚĆ I Internet Information Services (IIS) LISTING 6.6. Konfigurowanie dodatkowych atrybutów nagłówków odpowiedzi
Buforowanie danych wyjściowych W celu szybszego przetwarzania żądań HTTP serwer IIS udostępnia bufor pamięci podręcznej dla danych wyjściowych. Pliki i zasoby, które znajdują się w tym buforze, są przechowywane bezpośrednio w głównym magazynie. Nie jest więc konieczne wykonywanie operacji na dysku, aby odczytać takie pliki i zasoby. Bufora danych wyjściowych można także używać do przechowywania skryptów PHP — zdecydowanie wzrośnie wówczas wydajność działania aplikacji, ponieważ dzięki temu nie trzeba stale wykonywać skryptów ani czytać z bazy danych. IIS pozwala na skonfigurowanie bufora danych wyjściowych na dwa sposoby: w trybie użytkownika oraz w trybie jądra. Buforowanie w trybie jądra jest niezwykle wydajne, ponieważ żądanie jest w całości wykonywane bezpośrednio na stosie protokołu HTTP (http.sys), a dane żądania nie muszą być przekazywane do modułów serwera IIS w trybie użytkownika. Jednak bufor pamięci podręcznej ma też pewne ograniczenia — w szczególności nie można w nim zapisywać niektórych żądań. UWAGA Dodatkowe warunki, jakie należy spełnić, aby zapewnić prawidłową pracę w trybie jądra, zostały opisane na stronach http://support.microsoft.com/kb/817445 oraz http://msdn.microsoft.com/ en-us/library/aa364670%28VS.85%29.aspx.
Jeżeli bufor jest objęty zapisywaniem zdarzeń do dziennika, wówczas zapisywanie w dzienniku błędów żądań również jest bardzo pomocne (więcej na ten temat w rozdziale 8. „Komunikaty o błędach i wyszukiwanie błędów”). Więcej informacji na ten temat można znaleźć we wpisie dziennika, w sekcji HTTPSYS_CACHEABLE.
Konfigurowanie przy użyciu Menedżera IIS Aby skonfigurować bufor danych wyjściowych w Menedżerze IIS, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz element, który chcesz skonfigurować. 3. W obszarze roboczym dla wybranego elementu otwórz moduł Buforowanie danych
wyjściowych.
ROZDZIAŁ 6. Pamięć podręczna 147 4. W panelu Akcje kliknij polecenie Edytuj ustawienia funkcji, upewnij się, że odpowiedni tryb
bufora danych wyjściowych jest włączony (tryb jądra lub tryb użytkownika), a następnie naciśnij przycisk OK. UWAGA Maksymalny rozmiar odpowiedzi HTTP oraz rozmiar bufora pamięci podręcznej można ustawiać wyłącznie na poziomie serwera.
5. W panelu Akcje kliknij polecenie Dodaj.
Otwarte zostanie okno dialogowe Dodaj regułę buforowania, widoczne na rysunku 6.2.
RYSUNEK 6.2. Dodawanie reguły buforowania
6. Wpisz rozszerzenie nazw plików, dla których należy włączyć buforowanie danych
wyjściowych. Wybierz jeden z dwóch trybów buforowania, a następnie ustaw Monitorowanie pamięci podręcznej plików dla skryptów PHP na Przedziały czasu. 7. W przypadku buforowania w trybie użytkownika możesz zdefiniować dodatkowe
ustawienia. W tym celu kliknij przycisk Zaawansowane. Na przykład aby buforować dane wyjściowe dla plików cookie, zaznacz pole opcji Nagłówki i w odpowiadającym mu polu tekstowym wpisz Cookie. Naciśnij OK, aby zatwierdzić zdefiniowane ustawienia zaawansowane. 8. Naciśnij przycisk OK, aby dodać regułę buforowania.
148 CZĘŚĆ I Internet Information Services (IIS)
W ten sposób włączyłeś buforowanie danych wyjściowych. Aby sprawdzić działanie mechanizmu, napisz prosty skrypt testowy — na przykład taki, jak na listingu 6.7 — i skopiuj go do odpowiedniej lokalizacji na witrynie WWW. Gdy uruchomisz skrypt kilka razy pod rząd, zauważysz, że przez 30 sekund wyświetlana będzie taka sama godzina. LISTING 6.7. cachetest.php — skrypt do testowania bufora danych wyjściowych Test buforowania danych wyjściowych Czas:
Serwer IIS pozwala wskazać, od którego momentu plik ma być buforowany w pamięci podręcznej. Służą do tego ustawienia frequentHitThreshold (liczba wymaganych wywołań pliku) oraz frequentHitTimePeriod (czas, w jakim wywołania muszą zajść) elementu konfiguracji system.webServer/ServerRuntime. W Menedżerze IIS wartości te można zdefiniować wyłącznie w edytorze konfiguracji (który poznałeś w rozdziale 3. „Konfigurowanie serwera IIS”). Aby plik został zapisany w buforze danych wyjściowych domyślnie, musi on zostać wywołany co najmniej dwa razy w ciągu 10 sekund.
Konfigurowanie w wierszu poleceń Aby włączyć buforowanie danych wyjściowych w trybie użytkownika, wykonaj następujące polecenie appcmd: appcmd set config "<ŚCIEŻKA>" -section:caching/+profiles.[extension='.php', duration= ´'00:00:30',policy='CacheForTimePeriod',varyByHeaders='Cookie']
Jeśli chcesz uzależnić wersję pliku od ciągu zapytania, musisz ustawić atrybut varyByQuerystring. Aby włączyć buforowanie w trybie jądra, należy zamiast atrybutu polityki lub razem z tym atrybutem ustawić atrybut kernelCachePolicy. Regułę buforowania usuwa się następującym poleceniem appcmd: appcmd set config "<ŚCIEŻKA>" -section:caching /-profiles.[extension='.php']
Z kolei aby zdefiniować, od którego momentu należy rozpocząć buforowanie pliku, wykonaj następujące polecenie: appcmd set config -section:system.webServer/ServerRuntime /frequentHitThreshold:5 / ´frequentHitTimePeriod:00:00:15
Obydwa atrybuty można zdefiniować wyłącznie na poziomie globalnym dla całego serwera, a nie odrębnie dla poszczególnych witryn.
ROZDZIAŁ 6. Pamięć podręczna 149
Gdy uruchomisz już buforowanie danych wyjściowych w trybie jądra, będziesz mógł użyć polecenia netsh, aby sprawdzić aktualny stan bufora. Polecenie ma następującą postać: netsh http show cache
Elementy konfiguracji Bufor danych wyjściowych konfiguruje się za pomocą profili i kolekcji ustawień konfiguracyjnych. W tabeli 6.3 opisane zostały atrybuty wyznaczające sposób buforowania danych wyjściowych. TABELA 6.3. Atrybuty profili i kolekcji ustawień konfiguracyjnych dla bufora danych wyjściowych
Atrybut
Opis
duration
Określa czas ważności bufora. Działa tylko w połączeniu z polityką CacheForTimePeriod.
extension
Rozszerzenie nazwy pliku.
kernelCachePolicy
Sposób buforowania w trybie jądra. Dostępne są takie same opcje jak dla buforowania w trybie użytkownika.
policy
Sposób buforowania w trybie użytkownika: • CacheUntilChange — zasób jest buforowany do czasu, aż plik ulegnie zmianie. • CacheForTimePeriod — zasób jest buforowany przez określony czas. • DontCache — buforowanie nie jest wykonywane.
varyByHeaders
Wskazuje parametry ciągów zapytań, które wpływają na buforowanie danych wyjściowych (dotyczy tylko buforowania w trybie użytkownika).
varyByQueryString
Wskazuje nagłówki żądań HTTP, które wpływają na buforowanie danych wyjściowych (dotyczy tylko buforowania w trybie użytkownika).
Na listingu 6.8 widać, jak włącza się buforowanie danych wyjściowych przez 30 sekund. LISTING 6.8. Konfigurowanie profilu buforowania danych wyjściowych
150 CZĘŚĆ I Internet Information Services (IIS)
Rozszerzenie WinCache dla PHP Rozszerzenie WinCache dla PHP nie wykonuje buforowania na poziomie HTTP, lecz zwiększa wydajność na etapie wykonywania skryptów PHP. Rozszerzenie udostępnia następujące funkcje:
Buforowanie kodu operacji — skrypty PHP są przetwarzane w dwóch krokach: najpierw skrypt jest parsowany i kompilowany do postaci instrukcji kodu operacji (ang. opcode), a potem następuje wykonanie tych instrukcji. Kod operacji skryptu PHP jest buforowany w pamięci podręcznej dla kodu operacji, dzięki czemu nie trzeba już kompilować kolejnych instrukcji.
Buforowanie plików — WinCache także potrafi zapisywać pliki skryptów PHP w pamięci podręcznej, aby zmniejszyć liczbę wykonywanych operacji odczytu plików.
Uchwyt sesji — dzięki sesjom PHP dane można zapisywać w zmiennej $_SESSION (domyślnie wartości sesji PHP są buforowane w pliku). WinCache udostępnia uchwyt sesji, który przechowuje dane sesji w głównym magazynie, dzięki czemu nie trzeba ponownie wykonywać czasochłonnych operacji dostępu do pliku lub bazy danych.
Buforowanie danych użytkownika — funkcje rozszerzenia WinCache można wywoływać bezpośrednio z poziomu skryptu użytkownika. Dzięki temu w buforze pamięci podręcznej można zapisywać własne dane użytkownika, które jednocześnie stają się dostępne dla wszystkich procesów PHP w danej puli aplikacji.
W kolejnych punktach pokażę, jak instaluje się rozszerzenie WinCache oraz jak korzysta się z niektórych jego funkcji.
Uruchamianie rozszerzenia WinCache Rozszerzenie WinCache można zainstalować ręcznie. UWAGA W momencie oddawania niniejszej książki do druku aktualna wersja rozszerzenia WinCache oraz PHP w wersji 5.3 wymagały ręcznej instalacji rozszerzenia.
Ręczna instalacja rozszerzenia WinCache Aby ręcznie zainstalować rozszerzenie WinCache, wykonaj następujące czynności: 1. Ze strony pod adresem http://www.iis.net/expand/WinCacheForPhp pobierz program
instalacyjny dla aktualnej wersji rozszerzenia, przeznaczonej dla tej wersji PHP, której używasz (5.2 lub 5.3). Zapisz plik na dysku lokalnym komputera. W tej książce używam wersji 1.1 Beta 2 rozszerzenia WinCache. 2. Uruchom program instalacyjny i potwierdź znajomość postanowień licencji przez kliknięcie
przycisku Yes. 3. Wybierz katalog, w którym instalator ma rozpakować pliki rozszerzenia.
ROZDZIAŁ 6. Pamięć podręczna 151 4. Przejdź do tego katalogu i skopiuj plik php_wincache.dll, który się w nim znajduje,
do katalogu rozszerzeń języka PHP C:\PHP\ext. 5. Otwórz plik php.ini (C:\PHP\php.ini) w edytorze tekstu i wpisz w nim następujący wiersz: extension = php_wincache.dll
6. Upewnij się, że w pliku php.ini jako katalog rozszerzeń wskazany jest katalog ext.
Prawidłowe ustawienie powinno wyglądać następująco: extension_dir = "ext"
Jeżeli katalog rozszerzeń nie będzie zdefiniowany w taki sposób, rozszerzenie nie zostanie załadowane. 7. Uruchom ponownie odpowiednią pulę aplikacji serwera IIS. 8. Wykonaj skrypt phpinfo().
Na stronie zwróconej przez skrypt powinien pojawić się opis rozszerzenia WinCache, widoczny na rysunku 6.3.
RYSUNEK 6.3. Rozszerzenie WinCache dla PHP
152 CZĘŚĆ I Internet Information Services (IIS)
Bufor kodu operacji i bufor plików Dzięki buforom kodu operacji i plików skrypty PHP działają szybciej, ponieważ bufory te minimalizują liczbę koniecznych operacji dostępu do plików. Funkcje te minimalizują również zakres kompilacji wykonywanych w trakcie wykonywania skryptu, co jest możliwe dzięki buforowaniu kodu operacji. Konfiguracja Za pomocą odpowiednich opcji konfiguracyjnych można kontrolować działanie obydwóch buforów. W tabeli 6.4 znajdują się najważniejsze opcje konfiguracyjne. TABELA 6.4. Opcje konfiguracyjne dla buforów kodu operacji i plików
Opcja konfiguracyjna
Opis
wincache.chkinterval
Wskazuje wyrażony w sekundach czas, przez jaki rozszerzenie WinCache ma czekać, zanim sprawdzi, czy plik uległ zmianie. Im dłuższy interwał zostanie wskazany, tym mniej operacji dostępu do plików zostanie wykonanych, ale też więcej czasu zajmie uwzględnienie zmian wprowadzonych w plikach.
wincache.fcachesize, wincache.ocachesize
Maksymalny rozmiar bufora plików (f) oraz bufora kodu operacji (o), wyrażony w megabajtach.
wincache.fcenabled, wincache.ocenabled
Włącza (1) lub wyłącza (0) bufor plików (fc) lub bufor kodu operacji (oc).
wincache.ignorelist
Lista plików (bez wskazywania ścieżek dostępu do nich), których nie należy buforować. Kolejne nazwy są od siebie oddzielone znakiem potoku (|).
Począwszy od wersji 1.1, WinCache automatycznie rozpoznaje zmiany w plikach PHP. W tym przypadku czas, w którym zmiany nie są sprawdzane (chkinterval), nie jest uwzględniany, chyba że system plików nie obsługuje powiadamiania o zmianach (jak choćby w przypadku udziału UNC). W takiej sytuacji WinCache sprawdza, czy plik się zmienił, dopiero po upłynięciu czasu wskazywanego przez chkinterval. UWAGA W razie potrzeby możesz użyć funkcji wincache_refresh_if_changed(), aby odnowić zawartość bufora pamięci podręcznej przed upłynięciem czasu wskazywanego przez wincache.chkinterval.
Informacje o stanie rozszerzenia WinCache zawiera w sobie skrypt PHP, który informuje o aktualnym stanie rozszerzenia. Aby móc skorzystać z tego skryptu, wykonaj następujące czynności: 1. Skopiuj plik wincache.php z katalogu instalacyjnego do katalogu na witrynie WWW
(na przykład C:\inetpub\wwwroot\wincache\wincache.php).
ROZDZIAŁ 6. Pamięć podręczna 153 2. Otwórz plik w edytorze tekstu, przejdź do sekcji CONFIGURATION SETTINGS i wpisz nowe hasło.
Jeżeli skopiowałeś skrypt do lokalizacji, w której wymagana jest autoryzacja IIS, przypisz nazwy uprawnionych użytkowników do zmiennej $user_allowed. 3. Zapisz plik, a następnie otwórz go w przeglądarce.
W ten sposób uzyskasz informacje na temat bieżącego użycia pamięci podręcznej oraz stanu bufora rozszerzenia WinCache w formie widocznej na rysunku 6.4.
RYSUNEK 6.4. Informacje o stanie rozszerzenia WinCache dla PHP
Uchwyt sesji Począwszy od wersji 1.1, WinCache udostępnia uchwyt sesji PHP. Aby skorzystać z uchwytu sesji WinCache, wykonaj następujące czynności: 1. Otwórz plik php.ini (C:\PHP\php.ini). 2. Poszukaj wiersza, który zawiera instrukcję session.save_handler, i zastąp go następującym
wierszem: session.save_handler = wincache
3. Dane sesji są zapisywane także w folderze systemu Windows przeznaczonym na tymczasowe
pliki internetowe. Jeśli chcesz zmienić ten folder, przypisz ścieżkę dostępu do nowego folderu do zmiennej session.save_path. Nie zapomnij przydzielić użytkownikom puli aplikacji IIS (IIS_IUSRS) odpowiednich uprawnień dostępu do folderu. 4. Zapisz plik i uruchom ponownie odpowiednią pulę aplikacji IIS.
154 CZĘŚĆ I Internet Information Services (IIS)
Od teraz PHP będzie używał WinCache do zapisywania danych sesji i przechowywania ich w głównym magazynie pamięci, aby zminimalizować czas dostępu. Za pomocą opcji konfiguracji wincache.ucachesize możesz wskazać rozmiar dostępnego bufora pamięci podręcznej dla sesji wraz z buforem dla użytkownika. Wartość opcji definiuje się w megabajtach.
Pamięć podręczna dla użytkownika Pamięć podręczna dla użytkownika została udostępniona po raz pierwszy w wersji 1.1 rozszerzenia WinCache. W buforze tym użytkownik może przechowywać własne dane, z których mogą korzystać wszystkie procesy PHP z tej samej puli aplikacji. Standardowo w buforze użytkownika zapisuje się globalne informacje o stanie i liczniki o zasięgu globalnym; można go także używać jako bufora pamięci podręcznej na wyniki często wykonywanych obliczeń albo operacji bazodanowych. W buforze pamięci podręcznej należy zapisywać dane globalne dla wszystkich aplikacji PHP. Zmienna $_SESSION bardziej się przydaje do przechowywania danych związanych z użytkownikiem. OSTRZEŻENIE Gdy kilka aplikacji PHP korzysta z tej samej puli aplikacji, aplikacje PHP mają dostęp
do danych znajdujących się w buforze użytkownika, które zostały tam umieszczone przez inne aplikacje. Może to stanowić potencjalne zagrożenie bezpieczeństwa.
Na listingu 6.9 znajduje się kod przykładowej aplikacji, która korzysta z bufora użytkownika. Jest nią czat, a sama aplikacja korzysta z następujących funkcji do obsługi bufora użytkownika:
wincache_ucache_clear() — usuwa wszystkie pozycje z bufora użytkownika.
wincache_ucache_exists($key) — sprawdza, czy w buforze znajduje się wskazana pozycja.
wincache_ucache_add ($key, $value, $ttl) — dodaje nową pozycję do bufora, ale tylko wtedy, gdy w buforze nie ma jeszcze takiej pozycji. Argument $ttl wskazuje, po ilu sekundach pozycję należy usunąć. Wartość 0 (która jest wartością domyślną) oznacza, że pozycji
nie należy usuwać.
wincache_ucache_inc($key, $inc_by) — zwiększa wartość danej pozycji o $inc_by albo o 1, jeżeli $inc_by nie została określona. Jeżeli w trakcie operacji wystąpi błąd (na przykład dlatego, że pozycja nie istnieje albo nie jest ona liczbą), funkcja zwróci wartość false.
wincache_ucache_get($key, &$success) — wczytuje pozycję i zwraca wartość false, jeśli pozycja nie istnieje. Jeśli wolisz, aby funkcja zwracała wartość logiczną oznaczającą wynik jej działania, możesz ustawić stan w argumencie opcjonalnym $success.
wincache_ucache_set($key, $value, $ttl) — dodaje nową pozycję albo nadpisuje pozycję już istniejącą. Argument $ttl określa czas ważności tej pozycji.
ROZDZIAŁ 6. Pamięć podręczna 155 LISTING 6.9. wincache-chat.php — prosty skrypt czatu, który korzysta z WinCache Czat Czat
Wiadomości usunięte, licznik zresetowany.'; } if (!wincache_ucache_exists('counter')) { wincache_ucache_add('counter', 0); } $cnt = wincache_ucache_inc('counter'); echo "Liczba wywołań strony od ostatniego restartu: $cnt.\n"; ?>
5 ostatnich wiadomości
5) { array_shift($chat); } wincache ucache set('chat', $chat); } foreach (array_reverse($chat) as $msg) { echo htmlspecialchars($msg), "
\n"; } ?>
Na rysunku 6.5 znajduje się wynik działania skryptu po wysłaniu kilku wiadomości. Wynik działania skryptu jest identyczny dla wszystkich użytkowników. Zawartość bufora użytkownika WinCache jest dostępna globalnie.
156 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 6.5. Wynik działania skryptu czatu
Podsumowanie Dzięki rozwiązaniom opisanym w tym rozdziale możesz wydatnie zwiększyć wydajność tworzonych aplikacji PHP. W najczęściej wywoływanych aplikacjach powinno się wręcz korzystać jednocześnie ze wszystkich trzech dostępnych narzędzi, którymi są: buforowanie oparte na nagłówkach protokołu HTTP, buforowanie danych wyjściowych IIS oraz bufory pamięci podręcznej języka PHP, takie jak WinCache. Szczególną uwagę powinieneś zwrócić na różnicę między użytkownikami anonimowymi i użytkownikami zalogowanymi — standardowo bowiem użytkownicy anonimowi generują znacznie więcej żądań niż użytkownicy zalogowani. Ponadto strony przeznaczone dla użytkowników zalogowanych są zazwyczaj spersonalizowane, dlatego wykorzystanie w tym przypadku buforowania danych wyjściowych IIS dla skryptów PHP nie da większych efektów. Aby odróżnić od siebie poszczególne typy użytkowników, wystarczy zastosować różne adresy URL do stron dla użytkowników anonimowych i tych, którzy muszą się zalogować. Zagadnienie to należy brać pod uwagę już na etapie projektowania aplikacji PHP. W trakcie konfigurowania środowiska warto od razu przewidzieć oddzielne foldery dla plików o różnych wymaganiach pod względem buforowania w pamięci podręcznej (na przykład pliki graficzne i arkusze stylów) i nie mieszać ich ze skryptami PHP. W szczególnych przypadkach buforowanie można skonfigurować na poziomie plików (służy do tego element location, o czym napisałem w rozdziale 3.) zamiast na poziomie folderów. Wręcz może to być konieczne w przypadku plików index.php. Ostateczna konfiguracja zależy od charakteru aplikacji i jej użytkowników. Źródłem przydatnych informacji mogą być w tym przypadku między innymi pliki dziennika zdarzeń.
Rozdział 7.
Ponowne zapisywanie adresów URL W tym rozdziale: Uruchamianie mechanizmu ponownego zapisywania adresów URL ...............................159 Zmienne predefiniowane ...................................................................................................160 Przetwarzanie reguł ..........................................................................................................165 Definiowanie reguł ............................................................................................................168 Mapy ponownego zapisywania .........................................................................................176 Szczegółowe zasady działania reguł .................................................................................178 Konfiguracja XML ..............................................................................................................189 Przykłady ...........................................................................................................................195 Konwersje z modułu mod_rewrite serwera Apache ........................................................202 Podsumowanie ..................................................................................................................204
Ponowne zapisywanie adresów URL (realizowane za pomocą modułu serwera URL Rewrite) to niezwykle elastyczne i użyteczne narzędzie tworzenia aplikacji w PHP. Narzędzie to pozwala na przypisywanie wywoływanych adresów URL dowolnemu wybranemu skryptowi PHP albo innemu zasobowi i nadpisanie w ten sposób odwzorowania ścieżki URL na ścieżkę fizyczną. Skrypty PHP mogą więc odpowiadać za obsługę dowolnych adresów URL. Począwszy od wersji 2.0, moduł URL Rewrite pozwala też ponownie zapisywać wynikowy kod HTML i nagłówki HTTP. W tym rozdziale przedstawię najpierw najważniejsze zagadnienia dotyczące modułu, abyś mógł zrozumieć jego istotę, czyli ścieżki URL, fragmenty ścieżek URL i skojarzone z nimi zmienne PHP, a także sposób przetwarzania reguł. Potem dowiesz się, jak tworzy się reguły w Menedżerze IIS. Szczegółowo przedstawię wówczas wzorce, warunki i akcje. Na koniec przeanalizuję konfigurację XML modułu oraz omówię kilka przykładów.
158 CZĘŚĆ I Internet Information Services (IIS)
Uruchamianie mechanizmu ponownego zapisywania adresów URL Aby zainstalować moduł URL Rewrite, możesz użyć Instalatora platformy sieci Web (Web PI) albo przeprowadzić instalację ręcznie za pomocą pakietu instalacyjnego.
Ręczna instalacja modułu URL Rewrite Aby zainstalować moduł URL Rewrite bez korzystania z Instalatora platformy sieci Web, wykonaj następujące czynności: 1. Przejdź na stronę http://www.iis.net/expand/URLRewrite i pobierz URL Rewrite Module 2.0
w wersji odpowiedniej dla systemu, którego używasz (x86 lub x64). 2. Uruchom pobrany plik instalacyjny. 3. W oknie dialogowym zaznacz pole opcji, które oznacza zgodę na warunki licencji,
po czym naciśnij przycisk Zainstaluj. 4. Wyjdź z instalatora przez kliknięcie przycisku Zakończ.
Jeśli zostaniesz zapytany o zgodę na ponowne uruchomienie serwera, uruchom serwer ponownie. W ten sposób zainstalowałeś moduł.
Instalacja modułu URL Rewrite przy użyciu Web PI Aby zainstalować moduł URL Rewrite za pomocą Web PI, wykonaj następujące czynności: 1. Uruchom Web PI z uprawnieniami administratora. 2. Kliknij opcję Produkty/Serwer. 3. Dodaj Ponowne zapisywanie adresów URL 2.0. 4. Naciśnij przycisk Zainstaluj.
Wyświetlone zostanie okno dialogowe instalacji. 5. W oknie dialogowym naciśnij przycisk Akceptuję.
Web PI rozpocznie pobieranie i instalowanie modułu. 6. Po pomyślnym zakończeniu instalacji naciśnij przycisk Zakończ.
Zmienne predefiniowane Aby zrozumieć następstwa reguł przekierowywania i ponownego zapisywania, przedstawię najpierw bliżej predefiniowane zmienne PHP, które odgrywają istotną rolę w procesie ponownego zapisywania. Gdy zrozumiesz, jak działają reguły ponownego zapisywania, będziesz potrafił lepiej z nich korzystać w praktyce. Zmienne predefiniowane PHP pochodzą z trzech różnych źródeł, którymi są: język PHP, serwer Internetowe Usługi Informacyjne (IIS) oraz specyfikacja CGI.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 159
Zmienne Common Gateway Interface Common Gateway Interface (CGI) to specyfikacja opisana w dokumencie RFC 3875, który definiuje sposób, w jaki serwery WWW wywołują programy zewnętrzne oraz proces przekazywania informacji pochodzących z żądania do tych programów zewnętrznych. Zmienne istotne dla procesu ponownego zapisywania wywodzą się z adresu URL żądania HTTP. Adres URL składa się z kilku elementów przedstawionych na rysunku 7.1.
RYSUNEK 7.1. Struktura adresu URL
Poszczególne elementy adresu URL mają następujące znaczenie:
Schemat wskazuje protokół, którego używa aplikacja (dla witryn internetowych jest to HTTP lub HTTPS).
Nazwa komputera to nazwa serwera. Zazwyczaj jest to w pełni kwalifikowana nazwa domeny, na przykład www.bing.com albo www.microsoft.com.
Numer portu jest opcjonalny i wskazuje port TCP/IP dla połączenia. Dla protokołu HTTP domyślnym portem jest port numer 80. Z kolei dla HTTPS domyślnym portem jest 443.
Ścieżka określa zasób na serwerze, który jest przedmiotem żądania. Na rysunku 7.1 ścieżką jest /aplikacjaphp/info.php. Ścieżka ta jest poprzedzona znakiem ukośnika. Ścieżki URL zachowują się jak ścieżki dostępu do folderów. Domyślnie wiele serwerów WWW, nie wyłączając serwera IIS, odwzorowuje ścieżkę URL na fizyczną ścieżkę folderu.
Ciąg zapytania służy do przekazywania parametrów, na przykład poszukiwanego tekstu albo nazwy czynności, która ma zostać wykonana. Ciąg zapytania może zawierać dowolną liczbę parametrów, jednak w praktyce zwykle jego długość jest ograniczona do około 2 tysięcy znaków.
Fragment dokumentu wskazuje określoną część wywoływanego dokumentu. Jest on uwzględniany wyłącznie przez przeglądarkę i nie jest przekazywany za pośrednictwem protokołu HTTP. Fragmentami dokumentu są najczęściej nagłówki lub przypisy, do których ma przejść przeglądarka.
W specyfikacji CGI poszczególnym zmiennym przypisywane są te elementy adresu URL, które można odczytywać w PHP ze zmiennej globalnej $_SERVER. CGI ma jedną szczególną cechę, która stanowi odstępstwo od standardowego podziału adresów URL: otóż ścieżkę można podzielić na dwie części. Mówiąc najprościej, ścieżkę do skryptu można wydłużyć o kolejne elementy. Te kolejne fragmenty ścieżki są przekazywane do skryptu w postaci zmiennych. W tabeli 7.1 opisano zmienne zgodne ze specyfikacją CGI, które tworzone są na podstawie adresów URL. Jako przykładu użyłem adresu URL http://witrynademophp.site:80/aplikacjaphp/ info.php/sub/sciezka?art=1. Skrypt PHP (czyli zasób) znajduje się w głównym folderze witryny, w pliku aplikacjaphp/info.php.
160 CZĘŚĆ I Internet Information Services (IIS) TABELA 7.1. Zmienne CGI dostępne w zmiennej $_SERVER, które powstają na podstawie adresu URL żądania HTTP
Zmienna CGI
Opis
Przykład
PATH_INFO
Druga część ścieżki, która rozpoczyna się po ścieżce wskazującej skrypt.
/sub/sciezka
PATH_TRANSLATED
Pełna fizyczna ścieżka do skryptu wraz z drugą częścią ścieżki.
%root folder%\aplikacjaphp\info.php\sub\sciezka
QUERY_STRING
Ciąg zapytania adresu URL.
art=1
SCRIPT_NAME
Ścieżka adresu URL i nazwa wykonywanego skryptu.
/aplikacjaphp/info.php
SERVER_NAME
Nazwa serwera, która znajduje się również w nagłówku Host żądania HTTP.
witrynademophp.site
SERVER_PORT
Numer portu TCP/IP otrzymanego żądania HTTP.
80
SERVER_PROTOCOL
Protokół i numer wersji.
HTTP/1.1
UWAGA Jeżeli w środowisku roboczym, którego używasz, zmienne PATH_INFO i PATH_TRANSLATED nie
zawierają prawidłowych wartości, sprawdź, czy w pliku php.ini znajduje się opcja cgi.fix_pathinfo=1.
CGI definiuje także szereg innych zmiennych. Na przykład wszystkie nagłówki HTTP żądania są przekazywane w postaci zmiennych HTTP_*, to znaczy na przykład nagłówek Content-Type jest przekazywany jako HTTP_CONTENT_TYPE lub jako zmienna PHP $_SERVER['HTTP_CONTENT_TYPE']. Na podstawie specyfikacji CGI przekazywana jest także informacja na temat klienta, od którego pochodzi żądanie. Na przykład adres IP klienta jest przekazywany do skryptu PHP jako REMOTE_ADDR.
Zmienne IIS i PHP Serwer IIS oraz PHP definiują szereg dodatkowych zmiennych, których można użyć do ponownego zapisywania adresów URL w żądaniach HTTP. Zmienne te wskazują fizyczną ścieżkę do skryptu, a także oryginalny adres URL żądania. W tabeli 7.2 przedstawiono dodatkowe zmienne, które są definiowane w globalnej zmiennej $_SERVER. Również w tym przypadku przykładowym adresem URL jest http://witrynademophp.site:80/ aplikacjaphp/info.php/sub/sciezka?art=1. Skrypt PHP znajduje się w folderze głównym witryny C:\inetpub\wwwroot, w pliku aplikacjaphp\info.php. Adres URL jest wewnętrznie ponownie zapisywany. UWAGA Gdy połączenie nie jest zaszyfrowane, to inaczej niż w przypadku serwera Apache zmienna $_SERVER['HTTPS'] nie jest pusta, lecz ma wartość off. IIS 7 zawsze prawidłowo będzie ustawiał wartości zmiennych PATH_INFO i ORIG_PATH_INFO, jeżeli używane będzie FastCGI i w pliku php.ini zdefiniowana będzie opcja cgi.fix_pathinfo=1 (która jest wartością domyślną).
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 161 TABELA 7.2. Zmienne $_SERVER odpowiadające żądaniu HTTP
Zmienna PHP
Opis
Przykład
APPL_PHYSICAL_PATH (tylko na serwerze IIS)
Fizyczna ścieżka do aplikacji IIS skryptu PHP.
C:\inetpub\wwwroot
DOCUMENT_ROOT
Główny folder witryny WWW.
C:\inetpub\wwwroot
HTTP_X_ORIGINAL_URL (tylko na serwerze IIS)
Jeżeli ponownie zapisany został tylko adres URL, zmienna zawiera oryginalny adres URL żądania HTTP.
/aplikacjaphp/info.php/sub/ sciezka?art=1
HTTPS
Wskazuje, czy żądanie jest przekazywane za pomocą protokołu HTTPS.
off
IIS_UrlRewriteModule (tylko na serwerze IIS)
Wskazuje, czy moduł URL Rewrite jest włączony.
1
IIS_WasUrlRewritten (tylko na serwerze IIS)
Jeżeli adres URL został ponownie zapisany, zmienna jest ustawiona, w przeciwnym razie — nie jest.
1
ORIG_PATH_INFO
Jeżeli PATH_INFO nie jest ustawiona, ORIG_PATH_INFO może zawierać informację o ścieżce.
/aplikacjaphp/info.php/sub/ sciezka
Ostrzeżenie: Zmienna zawiera także względną ścieżkę do skryptu. PHP_SELF
Względna ścieżka do skryptu wraz z podścieżką.
/aplikacjaphp/info.php/sub/ sciezka?art=1
REQUEST_URI
Adres URL żądania HTTP.
/aplikacjaphp/info.php/sub/ sciezka?art=1
SCRIPT_FILENAME
Bezwzględna ścieżka fizyczna skryptu PHP.
C:\inetpub\wwwroot\ aplikacjaphp\info.php
UNENCODED_URL (tylko na serwerze IIS)
Jeżeli adres URL został ponownie zapisany, zmienna zawiera oryginalny adres URL żądania HTTP, bez zdekodowanych znaków zakodowanych w formacie URL.
/aplikacjaphp/info.php/sub/ sciezka?art=1
Oprócz zmiennych $_SERVER dostępne są także dwie stałe, które zawierają dodatkowe informacje na temat skryptu PHP. Stałymi tymi są __FILE__, która zawiera pełną fizyczną ścieżkę do pliku PHP, oraz __DIR__ (dostępna w PHP od wersji 5.3), która zawiera pełną fizyczną ścieżkę do folderu zawierającego plik PHP. Należy podkreślić, że wartości wspomnianych stałych zależą od pliku, w którym są używane. Stałe będą więc mieć inne wartości w plikach PHP dołączanych przez wykonywany skrypt PHP. PHP udostępnia także globalną zmienną $_ENV, która zawiera zmienne środowiskowe. W domyślnej instalacji serwera IIS do zmiennej $_ENV języka PHP nie są przekazywane żadne zmienne środowiskowe, natomiast wiele analogicznych danych trafia do zmiennej $_SERVER.
162 CZĘŚĆ I Internet Information Services (IIS)
Przykładowy skrypt PHP Abyś mógł lepiej zrozumieć następstwa reguł przekierowywania i ponownego zapisywania adresów URL, użyję skryptu PHP z pliku urlinfo.php. Kod skryptu znajduje się na listingu 7.1. Zmienne $_SERVER zostały w nim podzielone na trzy grupy: informacje na temat powiązań, adres URL żądania i informacje o wykonywanym skrypcie. Najpierw definiowana jest funkcja printServerVar(), która zwraca wartości zmiennej $_SERVER w postaci listy. LISTING 7.1. urlinfo.php — informacje na temat żądania HTTP i skryptu PHP Informacje na temat żądania HTTP Informacje na temat żądania HTTP
Specyfikacje powiązań
$text ($parameter): "; if (isset($_SERVER[$parameter])) { echo '"', htmlspecialchars($_SERVER[$parameter]), '"'; } else { echo '--nieokreślone--'; } echo "\n"; } printServerVar('Nazwa serwera', 'SERVER NAME'); printServerVar('Port', 'SERVER_PORT'); printServerVar('Protokół', 'SERVER_PROTOCOL'); printServerVar('Szyfrowane połączenie', 'HTTPS'); ?>
Specyfikacja adresu URL
Informacje o skrypcie
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 163 printServerVar('Fizyczna ścieżka do skryptu', 'SCRIPT_FILENAME'); printServerVar('Fizyczna ścieżka wraz z podścieżką', 'PATH_TRANSLATED'); echo '- stała __FILE__: ', __FILE__, '
'; echo '- stała __DIR__: ', __DIR__, '
'; // tylko w PHP 5.3 i późniejszych ?>
Skopiuj plik ze skryptem do głównego folderu witryny internetowej i wywołaj go w przeglądarce. Rysunek 7.2 przedstawia wynik działania skryptu urlinfo.php umieszczonego w folderze głównym C:\inetpub\wwwroot i wywołanego za pomocą adresu URL w postaci http://localhost/urlinfo.php/sub/sciezka?artykul=1.
RYSUNEK 7.2. Wynik działania skryptu urlinfo.php
164 CZĘŚĆ I Internet Information Services (IIS)
Przetwarzanie reguł Moduł URL Rewrite działa na podstawie reguł. Ponowne zapisywanie adresów URL oraz inne czynności są wyzwalane przez odpowiednio zdefiniowane reguły. Każda taka reguła zawiera trzy następujące części:
Wzorzec, z którym porównywana jest ścieżka adresu URL.
Warunki, które muszą zostać spełnione (oprócz zgodności ze wzorcem).
Akcja, którą należy wykonać w przypadku, gdy stwierdzona zostanie zgodność ze wzorcem i warunki będą spełnione.
Dla każdego przychodzącego żądania serwer przetwarza kolejne reguły jedna po drugiej, aby sprawdzić, która z nich powinna zostać zastosowana. Jeżeli któraś reguła będzie mieć zastosowanie, zostanie ona wykonana. Jeżeli na liście będą się znajdować kolejne reguły, cały proces będzie kontynuowany.
Typy akcji Dla każdej reguły moduł udostępnia pięć następujących akcji:
Redirect — przekierowuje do innego adresu URL. Przeglądarka ładuje wówczas nową stronę.
Rewrite — wewnętrznie zapisuje adres URL do innego pliku. Potem można zestawić połączenie między adresem URL a plikiem fizycznym.
Custom Response — odpowiada kodem stanu HTTP, który można dowolnie wybierać.
Abort Request — serwer natychmiast zamyka połączenie bez wysyłania właściwej odpowiedzi HTTP.
None — serwer nie wykonuje żadnej akcji. Cel takiego działania staje się widoczny w trakcie przetwarzania reguł — dzięki tej akcji można na przykład warunkowo przechodzić do wykonywania kolejnych reguł.
Hierarchia i ścieżki adresów URL Reguły można definiować na wszystkich poziomach: serwera, witryny, aplikacji, wirtualnego katalogu lub podfolderu. Reguły serwera stanowią jedną kategorię, a wszystkie pozostałe reguły — tak zwane reguły rozproszone — należą do drugiej kategorii i są przetwarzane w odmienny sposób:
Reguły serwera dotyczą całego serwera WWW, na przykład stosuje się je dla wszystkich witryn na serwerze. Wzorce reguł są przykładane do pełnych, bezwzględnych ścieżek URL. Reguły serwera są przetwarzane przed wszelkimi innymi regułami.
Reguły rozproszone są przetwarzane sekwencyjnie, zależnie od ich hierarchii. Zatem reguły dotyczące elementu rodzica mają pierwszeństwo. Wzorce nie są już przykładane do pełnej ścieżki URL, lecz tylko do względnej ścieżki adresu URL wskazującego element.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 165
Na przykład jeśli adresem URL katalogu wirtualnego jest http://witrynademophp.site/ aplikacjaphp/ i dla katalogu tego zdefiniujesz jakąś regułę, wówczas wywołanie adresu http://witrynademophp.site/aplikacjaphp/demo/info.php spowoduje, że elementem porównywanym ze wzorcem będzie jedynie ścieżka względna do katalogu demo/info.php. WAŻNE Ze względu na charakter reguł rozproszonych stosowane w nich wzorce nigdy nie powinny rozpoczynać się znakiem ukośnika.
Reguły rozproszone są dziedziczone. Oznacza to, że przetwarzane są także reguły elementów potomnych. Jednak pomimo tego punkt odniesienia, względem którego wyznacza się ścieżkę porównywaną potem ze wzorcem, pozostaje taki sam. Punktem odniesienia jest zawsze element, dla którego zdefiniowano daną regułę. W praktyce oznacza to, że reguły zawsze działają w taki sposób, jakby były przetwarzane na poziomie elementu, dla którego je zdefiniowano. Dziedziczenie reguł ujawnia się dopiero wówczas, gdy anuluje się przetwarzanie reguł dla elementów potomnych. W takiej sytuacji reguła zdefiniowana dla elementu rodzica nie zostanie wykonana na żądaniach, które znajdują się w zasięgu elementu potomnego. Ścieżki adresów są istotne także dla akcji reguł ponownego zapisywania i przekierowywania, ponieważ jeżeli ścieżkę względną wskaże się dla akcji obydwóch typów reguł, wówczas ścieżka ta zostanie potraktowana jako względna dla elementu, na którym regułę zdefiniowano. W odróżnieniu od wzorców akurat w tym przypadku definiowanie ścieżek bezwzględnych (rozpoczynających się znakiem ukośnika) jest jak najbardziej uzasadnione, ponieważ dzięki temu zyskujesz możliwość ponownego zapisywania lub przekierowywania katalogów wirtualnych i podfolderów w zakresie całej aplikacji. Przekierowania można też wykonywać do pełnych adresów URL, a nie tylko do względnych i bezwzględnych ścieżek URL. Oznacza to, że można wykonywać przekierowania także do innych witryn internetowych, a nawet do stron WWW na innych, zewnętrznych serwerach.
Czas przetwarzania Reguły modułu są przetwarzane na bardzo wczesnym etapie obsługi żądania. W momencie rozpoczęcia obsługi żądania reguły są już przetworzone, co widać na rysunku 7.3. Dzięki temu zyskujemy gwarancję, że reguły dotyczą wszystkich typów żądań i nie ma znaczenia, czy żądania te dotyczą skryptów PHP, czy na przykład plików graficznych. Trzy rodzaje akcji: Redirect, Abort Request i Custom Response pomijają większą część procesu obsługi żądania. Tylko akcje Rewrite i None przechodzą przez cały proces obsługi żądań.
166 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.3. Przetwarzanie reguł
Definiowanie reguł W tym punkcie omówię poszczególne typy reguł oraz pokażę, jak się je tworzy. Później poznasz kolejne aspekty reguł, w tym korzystanie z warunków i wyrażeń regularnych.
Definiowanie reguł przekierowania Przekierowanie (ang. redirect) różni się od ponownego zapisania adresu URL (ang. URL rewrite) tym, że działa z zewnątrz, podczas gdy ponowne zapisanie dotyczy jedynie ciągu zdarzeń na serwerze IIS. Oznacza to, że w procesie przekierowywania udział bierze również klient (przeglądarka internetowa). Sekwencja czynności Rysunek 7.4 przedstawia sekwencję czynności wykonywanych, gdy realizowana jest reguła przekierowania. Poniżej opisałem każdą czynność wykonywaną w tym procesie.
RYSUNEK 7.4. Przebieg zdarzeń, które zachodzą w trakcie przekierowywania żądania HTTP
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 167 1. Klient internetowy wysyła żądanie do serwera WWW. 2. Serwer WWW odnajduje regułę odpowiednią dla adresu URL żądania. 3. Serwer WWW wysyła do klienta kod stanu przekierowania wraz z nowym adresem URL. 4. Klient wysyła nowe żądanie z adresem URL uzyskanym w punkcie 3. 5. Serwer zwraca żądaną stronę lub zasób (na przykład obraz).
Tabela 7.3 opisuje kody stanu HTTP, które mogą zostać zwrócone, oraz ich znaczenie. Najczęściej spotykanymi kodami stanu są 301 i 302. Drugi z tych kodów jest często używany w nieprawidłowy sposób, lecz jest ogólnie akceptowany. Kody 303 i 307 zdefiniowane w specyfikacji HTTP/1.1 stanowią zamienniki dla kodu 302. TABELA 7.3. Kody stanu HTTP dla przekierowania
Kod stanu HTTP
Opis
301 (permanent)
Żądanie, a także wszystkie żądania w przyszłości, muszą zostać skierowane do nowego adresu URL. Kodu tego używa się na przykład po gruntownym przeorganizowaniu witryny WWW.
302 (found)
Żądanie musi zostać przekierowane do nowego adresu URL, lecz kolejne żądania w przyszłości mają używać dotychczasowego adresu, ponieważ przekierowanie ma charakter tylko tymczasowy. Metoda HTTP dla nowego żądania nie może się zmienić (na przykład jeśli oryginalne żądanie jest wykonywane metodą POST, żądanie po przekierowaniu również musi być wykonane metodą POST). W praktyce przeglądarki reagują na kod 302 tak samo jak na kod stanu 303.
303 (see other)
Dostępne od HTTP/1.1; odpowiedź na żądanie jest dostępna pod innym adresem URL, lecz samo żądanie zostało obsłużone prawidłowo. Nowy adres URL należy wywołać metodą GET, a kolejne żądania w przyszłości powinny być kierowane do pierwotnego adresu URL. Odpowiedzi z kodem stanu 303 nie mogą być buforowane w pamięci podręcznej. W praktyce kodu 303 używa się na przykład po to, aby formularz wywoływany metodą POST mógł po przetworzeniu przekierowywać do różnych stron wynikowych, zależnie od swojej zawartości.
307 (temporary)
Dostępne od HTTP/1.1; żądanie należy przekierować do nowego adresu URL, lecz kolejne żądania w przyszłości muszą być dalej kierowane do oryginalnego adresu URL, ponieważ przekierowanie ma charakter tylko tymczasowy. Użyta musi zostać ta sama metoda HTTP. Klient nie może również zakładać, że żądanie zostało już przetworzone.
Dodawanie reguły przekierowania Aby utworzyć regułę przekierowania i dodać ją do istniejącego zbioru reguł, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz odpowiedni element, na przykład Default Web Site. 3. W obszarze roboczym dwukrotnie kliknij myszą moduł URL Rewrite, aby go otworzyć. 4. W panelu Akcje kliknij polecenie Add Rule(s).
Otwarte zostanie okno dialogowe Add Rule(s). 5. Wybierz szablon Blank Rule. 6. Obszar roboczy Menedżera IIS zostanie zastąpiony widokiem Edit Inbound Rule,
pokazanym na rysunku 7.5.
168 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.5. Dodawanie reguły przekierowania
7. W polu tekstowym Name wpisz unikatową nazwę reguły. 8. Na liście rozwijanej Using wybierz pozycję Wildcards (o wyrażeniach regularnych,
czyli opcji Regular Expressions, napiszę więcej nieco później). 9. W polu tekstowym Pattern wpisz adres URL, z którego ma następować przekierowanie
do innego adresu URL. Dla celów tego przykładu użyję wzorca url-info. 10. W sekcji Action, na liście rozwijanej Actions Type, wybierz opcję Redirect. 11. W podsekcji Action Properties, w polu tekstowym Redirect URL, wpisz adres URL,
do którego ma zostać wykonane przekierowanie. W przykładzie użyję pliku urlinfo.php (tego samego przykładowego skryptu, którego użyłem już w punkcie „Przykładowy skrypt PHP” nieco wcześniej w tym rozdziale). 12. Na liście rozwijanej Redirect Type wybierz pozycję Temporary (307). 13. W panelu Akcje kliknij polecenie Apply, aby zatwierdzić dokonane zmiany, po czym kliknij
polecenie Back To Rules, aby wrócić do widoku reguł Rules.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 169
Jeśli teraz w przeglądarce wpiszesz adres http://localhost/info-url, zostaniesz automatycznie przekierowany do adresu URL http://localhost/urlinfo.php. Jeżeli przekierowanie będzie działać prawidłowo, nowy adres URL zostanie wyświetlony w pasku adresu przeglądarki — tak jak już wcześniej wspomniałem, przeglądarka też bierze udział w procesie przekierowywania. Fakt wykonania przekierowania można także zaobserwować w pliku dziennika zdarzeń serwera IIS dla witryny WWW. W pliku dziennika zdarzeń będą się znajdować dwa wpisy o następującej treści (kod stanu to czwarta liczba od końca): 2011-07-02 ´5.0) 307 2011-07-02 ´5.0) 200
19:52:19 ::1 GET /info-url - 80 - ::1 Mozilla/4.0+(compatible;+MSIE+9.0;+Trident/ 0 0 0 19:52:19 ::1 GET /urlinfo.php - 80 - ::1 Mozilla/4.0+(compatible;+MSIE+9.0;+Trident/ 0 0 15
UWAGA Pliki dzienników zdarzeń znajdują się w głównym folderze serwera IIS — C:\inetpub\logs\LogFiles\.
Gdy przeanalizujesz zawartość strony wynikowej zwróconej przez skrypt urlinfo.php po wykonanym przekierowaniu, zauważysz zapewne, że zawartość strony jest taka sama dla wywołania bezpośredniego http://localhost/urlinfo.php, jak i dla wywołania przekierowanego z adresu http://localhost/info-url. Wynika to z przebiegu procesu, podczas którego następuje przekierowanie: wszak przeglądarka generuje samodzielne, drugie żądanie do adresu URL http://localhost/urlinfo.php. Jest to pełnoprawne żądanie HTTP-GET, które niczym się nie różni od analogicznego, bezpośredniego żądania adresu URL wpisanego ręcznie przez użytkownika.
Definiowanie reguł ponownego zapisywania Reguła ponownego zapisywania pozwala na wykonanie ponownego zapisania adresu URL na serwerze IIS i zastąpienie go innym adresem URL. Dzięki regułom ponownego zapisywania można więc zaprojektować odwzorowania ścieżek URL na ścieżki do plików fizycznych. Reguł ponownego zapisywania używa się na przykład w programach do obsługi blogów, aby za ich pomocą generować opisowe adresy URL prowadzące do poszczególnych wpisów na blogach. Sekwencja czynności Reguły ponownego zapisywania są przetwarzane na bardzo wczesnym etapie obsługi żądania — podobnie zresztą jak wszystkie reguły modułu URL Rewrite — i wpływają na wszystkie zasoby, w tym skrypty PHP i pliki graficzne. Ponowne zapisywanie wykonywane jest wyłącznie wewnętrznie na serwerze — w trakcie obsługiwania żądania. Fakt ponownego zapisywania nie jest w żaden sposób zauważalny dla klienta. Po wykonaniu przekierowania przetwarzanie dobiega końca, natomiast po wykonaniu ponownego zapisu żądanie jest dalej obsługiwane. W szczególności przetwarzane są i wykonywane kolejne reguły. Jeżeli w ramach danej reguły zdefiniowana została konkretna akcja, reguły następujące po niej przyrównują do wzorca adres URL tej akcji, a nie oryginalny adres URL żądania.
170 CZĘŚĆ I Internet Information Services (IIS)
Dlatego może się zdarzyć, że zanim żądanie trafi do dalszego przetwarzania, adres URL może zostać nawet wielokrotnie przekierowany. Jedna z dostępnych opcji pozwala na zablokowanie możliwości przetwarzania kolejnych reguł; za pomocą tej samej opcji można także precyzyjnie kontrolować, które reguły mają być przetwarzane i kiedy. Dodawanie reguły ponownego zapisywania Aby utworzyć regułę ponownego zapisywania, wykonaj następujące czynności: 1. W Menedżerze IIS dla wybranego elementu (na przykład Default Web Site) w obszarze
roboczym wybierz polecenie URL Rewrite/Add Rule(s). Wyświetlone zostanie okno dialogowe Add Rule(s). 2. Wybierz szablon pustej reguły Blank Rule. Obszar roboczy Menedżera IIS zostanie
zastąpiony widokiem Edit Rules. 3. W polu tekstowym Name wpisz unikatową nazwę reguły. 4. Pola Match URL uzupełnij zgodnie z własnymi wymaganiami. UWAGA Składnia wzorca zostanie opisana w dalszej części tego rozdziału, w punkcie „Wzorce”. 5. W sekcji Action, na liście rozwijanej Actions Type, wybierz pozycję Redirect. 6. W sekcji Action Properties wpisz nowy adres URL (adres docelowy ponownego zapisywania).
Jeżeli chcesz, aby ciąg zapytania z oryginalnego adresu URL został zapamiętany, pozostaw zaznaczone pole opcji Append Query String. Jeżeli na tym etapie będziesz chciał zakończyć przetwarzanie reguł, zaznacz pole opcji Stop Processing Of Subsequent Rules. 7. W panelu Akcje kliknij polecenie Apply, aby potwierdzić dokonane zmiany konfiguracyjne,
a następnie kliknij polecenie Back To Rules, aby powrócić do widoku reguł Rules. Jeżeli w trakcie tworzenia reguły jako wzorzec (Pattern) wpiszesz inny-url/* i jako typ wskażesz Wildcards, zaś jako adres URL do ponownego zapisania (Rewrite URL) podasz urlinfo.php/{R:1}, wówczas po wywołaniu adresu URL http://localhost/inny-url/test/sciezka skrypt urlinfo.php zwróci następujące informacje: Specyfikacja adresu URL Adres URL żądania (REQUEST_URI): "/inny-url/test/sciezka" Ciąg zapytania (QUERY_STRING): "" Ścieżka URL skryptu wraz z podścieżką (PHP_SELF): "/urlinfo.php/test/sciezka" Ścieżka URL skryptu (SCRIPT_NAME): "/urlinfo.php" Podścieżka (PATH_INFO): "/test/sciezka" Ścieżka oryginalna (ORIG_PATH_INFO): "/urlinfo.php/test/sciezka" Czy ponownie zapisano adres URL? (IIS_WasUrlRewritten): "1" Oryginalny adres URL (HTTP_X_ORIGINAL_URL): "/inny-url/test/sciezka" Niezakodowany adres URL (UNENCODED_URL): "/inny-url/test/sciezka"
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 171
Informacje o skrypcie Folder główny (DOCUMENT_ROOT): "C:\inetpub\wwwroot" Fizyczna ścieżka do aplikacji IIS (APPL_PHYSICAL_PATH): "C:\inetpub\wwwroot\" Fizyczna ścieżka do skryptu (SCRIPT_FILENAME): "C:\inetpub\wwwroot\urlinfo.php" Fizyczna ścieżka wraz z podścieżką (PATH_TRANSLATED): "C:\inetpub\wwwroot\urlinfo.php\test\sciezka" stała __FILE__: C:\inetpub\wwwroot\urlinfo.php stała __DIR__: C:\inetpub\wwwroot
W informacjach o skrypcie widać, że żądanie zostało wewnętrznie ponownie zapisane jako żądanie skryptu PHP o nazwie urlinfo.php. Na to samo wskazują zmienne PHP_SELF oraz SCRIPT_NAME. Ścieżkę oryginalnego żądania można odczytać jedynie ze zmiennych REQUEST_URI oraz ze zmiennych serwera IIS: HTTP_X_ORIGINAL_URL oraz UNENCODED_URL. WSKAZÓWKA W aplikacjach PHP, w których trzeba rozpoznawać URL żądania, należy używać zmiennej REQUEST_URI. Dzięki temu aplikację będzie można uruchamiać na różnych platformach.
Inne typy akcji W taki sam sposób, w jaki definiuje się reguły przekierowania i ponownego zapisywania, możesz zdefiniować też reguły z innymi rodzajami akcji. O wszystkim decyduje się w sekcji Action. Dostosowywanie odpowiedzi Akcja Custom Response służy do tego, aby wysyłać dowolne kody stanów i podstanów HTTP. Aby zdefiniować regułę z tego typu akcją, wystarczy wykonać takie same czynności jak w przypadku innych reguł: 1. Dla nowej reguły, którą tworzysz, na liście rozwijanej Action Type w sekcji Action wybierz
pozycję Custom Response. 2. W polu tekstowym Status code wpisz kod stanu HTTP (na przykład 403), a w polu tekstowym
Substatus code właściwy dla IIS kod podstanu. W polu tekstowym Reason możesz wpisać dowolny, tekstowy opis kodu stanu. Opis ten będzie przesyłany w wierszu stanu odpowiedzi HTTP. 3. W polu tekstowym Error Description możesz wpisać opis bardziej szczegółowy. Może to być
szczególnie przydatne do debugowania kodu. 4. W panelu Akcje kliknij polecenie Apply to Confirm, aby zatwierdzić dokonane zmiany.
Jeżeli teraz w przeglądarce wpiszesz adres URL, którego ta reguła dotyczy, uzyskasz komunikat błędu odpowiedni dla zdefiniowanych ustawień reguły, widoczny na rysunku 7.6. Dla znanych sobie kodów stanu IIS zwróci stronę HTML z komunikatem błędu przyjaznym użytkownikowi.
172 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.6. Komunikat błędu zdefiniowany w ramach reguły z dostosowaną odpowiedzią
Akcja typu Abort Request Akcja typu Abort Request kończy przetwarzanie żądania tak szybko, jak jest to możliwe. Do klienta nie jest zwracana żadna odpowiedź HTTP, a serwer IIS nie generuje żadnego wpisu do dziennika zdarzeń na temat tak zakończonego żądania. Dlatego powinieneś dwa razy się zastanowić, zanim zdecydujesz się na skorzystanie z akcji tego typu. Warto z niej korzystać, kiedy wiadomo, że do serwera będą kierowane niechciane lub złośliwie spreparowane żądania, albo gdy serwer jest przeciążony z powodu zbyt dużego nawału żądań (jak w trakcie ataku typu Denial-of-Service). Natychmiastowe anulowanie obsługi żądań może pomóc ochronić zasoby serwera. Dla reguły, w której używana jest akcja typu Abort Request, w sekcji Action nie można zdefiniować żadnych dodatkowych opcji. Akcja typu None Jak sugeruje nazwa, akcja typu None nie wykonuje żadnej czynności. Na podstawie wzorca i warunków zdefiniowanych dla reguły None można anulować przetwarzanie następnych reguł. W sekcji Action reguły z akcją typu None znajduje się tylko jedno pole opcji: Stop Processing Of Subsequent Rules. Jeżeli nie chcesz, by przetwarzane były kolejne zdefiniowane reguły, zaznacz to pole opcji.
Definiowanie reguł na podstawie szablonów Jak dotąd wszystkie reguły definiowaliśmy na podstawie szablonu reguły pustej Blank Rule. Moduł URL Rewrite udostępnia jednak również dwa dodatkowe szablony, które ułatwiają tworzenie reguł ponownego zapisywania i anulowania żądań.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 173
Szablon User-Friendly URL Reguły ponownego zapisywania definiuje się najczęściej po to, aby tworzyć adresy URL przyjazne dla użytkowników. Przyjazny użytkownikowi adres URL z zasady nie zawiera ciągu zapytania, a poszczególne elementy takiego adresu są oddzielone od siebie znakiem ukośnika. Szablon do tworzenia adresów URL przyjaznych użytkownikowi bazuje właśnie na tych zasadach i stosownie do nich definiuje regułę ponownego zapisywania. 1. W Menedżerze IIS kliknij polecenie URL Rewrite/Add rule(s).
Wyświetlone zostanie okno dialogowe Add rule(s). 2. Wybierz szablon User-Friendly URL.
Otwarty zostanie kreator Add Rules To Enable User-Friendly URLs. 3. W pierwszym polu tekstowym wpisz przykładowy adres URL, który ma być ponownie
zapisywany. 4. Na liście rozwijanej możesz wybrać jedną z kilku propozycji przyjaznego użytkownikom
adresu URL. 5. W sekcji Rewrite Rule Definition wyświetlony zostanie sugerowany wzorzec URL oraz ten
sam adres URL po ponownym zapisaniu. 6. Jeżeli chcesz, by w aplikacji z zasady stosowane były adresy URL przyjazne użytkownikom,
możesz zaznaczyć pole opcji Create Corresponding Redirect Rule. Pozwoli to stworzyć regułę przekierowania, która będzie przekierowywać użytkownika od adresu wewnętrznego do adresu przyjaznego użytkownikom. Jeżeli zaznaczysz pole opcji Create Corresponding Redirect Rule, wówczas kreator doda regułę wychodzącą, która będzie zastępować wszystkie wystąpienia wewnętrznych adresów URL w zwracanym w odpowiedzi kodzie HTML odpowiadającymi im przyjaznymi adresami. 7. Naciśnij przycisk OK, aby zamknąć kreatora. Wygenerowane zostaną wówczas
odpowiednie reguły RewriteUserFriendlyURLn, RedirectUserFriendlyURLn oraz OutboundRewriteUserFriendlyURLn (zależnie od opcji wybranych w punkcie 6.). Tak utworzone reguły pojawią się na liście reguł obok wszystkich utworzonych wcześniej. Będzie je można edytować, zmieniać ich nazwy, wyłączać je lub usuwać. Szablon Blocking Requests Aby użyć szablonu reguły blokującej żądania, wykonaj następujące czynności: 1. W Menedżerze IIS kliknij polecenie URL Rewrite/Add rule(s).
Wyświetlone zostanie okno dialogowe Add rule(s). 2. Wybierz szablon Request Blocking.
Otwarty zostanie kreator Add Request Blocking Rule widoczny na rysunku 7.7. Żądania można blokować na podstawie różnych parametrów: ścieżki URL, nagłówka HTTP klienta (User-Agent), adresu IP, ciągu zapytania, odwołania (nagłówek Referer protokołu HTTP) lub nagłówka komputera (nagłówek Host).
174 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.7. Szablon do tworzenia reguły blokującej żądania
3. W polu tekstowym wpisz wzorzec reguły. Składnię wzorca możesz wskazać na liście
rozwijanej Using. 4. Na liście rozwijanej How To Block wpisz typ odpowiedzi. Możesz wybrać własną odpowiedź
z kodami stanów 401, 403 lub 404 albo anulować żądanie. 5. Naciśnij przycisk OK, aby zamknąć okno dialogowe. W ten sposób utworzona zostanie
reguła o nazwie RequestBlockingRuleN. Od teraz będziesz mógł przeglądać, edytować, wyłączyć lub usunąć utworzoną regułę tak samo jak każdą inną regułę dostępną na liście.
Mapy ponownego zapisywania Jeżeli chcesz zdefiniować reguły dla wielu różnych adresów URL, pomocnym narzędziem będą mapy ponownego zapisywania. Mapa ponownego zapisywania to tak naprawdę zbiór par nazwa – wartość. Na jej podstawie nazwa zastępowana jest odpowiadającą jej wartością. Nazwami są zwykle ścieżki URL, które należy ponownie zapisać albo przekierować do innych adresów URL. Mapy ponownego zapisywania nie są jednak ograniczone tylko do ścieżek URL.
Tworzenie mapy ponownego zapisywania Aby utworzyć mapę ponownego zapisywania, wykonaj następujące czynności: 1. Uruchom Menedżera IIS. 2. W panelu Połączenia wybierz odpowiedni element (na przykład Default Web Site). 3. Dwukrotnie kliknij moduł URL Rewrite.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 175 4. W panelu Akcje kliknij polecenie View Rewrite Maps. 5. W obszarze URL Rewrite Maps wyświetlona zostanie lista już istniejących map ponownego
zapisywania. 6. W panelu Akcje kliknij polecenie Add Rewrite Map.
Wyświetlone zostanie okno dialogowe Add Rewrite Map. 7. W polu tekstowym wpisz nazwę mapy i zatwierdź ją przyciskiem OK. Wyświetlony zostanie
wówczas obszar roboczy Edit Rewrite Map. 8. W panelu Akcje kliknij polecenie Add Mapping Entry.
Wyświetlone zostanie okno dialogowe Add Mapping Entry. 9. Wypełnij pola tekstowe Original Value i New Value zgodnie z własnymi potrzebami,
po czym naciśnij przycisk OK, aby zamknąć okno dialogowe. OSTRZEŻENIE Ani wartość oryginalna, ani nowa wartość nie mogą zawierać symboli zastępczych ani odwołań powrotnych. Mapy służą wyłącznie do zastępowania jednego ciągu znaków innym ciągiem.
Na mapie ponownego zapisywania można umieszczać także wartość domyślną, która będzie stosowana, gdy żadna z wartości oryginalnych nie będzie pasować. Jednak wartości domyślnych należy używać z dużą ostrożnością, ponieważ mogą one doprowadzić do wykonywania niepożądanych ponownych zapisów adresów URL. Aby ustawić wartość domyślną, wykonaj następujące czynności: 1. W panelu Akcje kliknij polecenie Edit Rewrite Maps, aby otworzyć obszar roboczy
dla wybranej mapy ponownego zapisywania. 2. W panelu Akcje kliknij polecenie Edit Map Settings.
Wyświetlone zostanie okno dialogowe Edit Rewrite Map. 3. W oknie dialogowym wpisz pożądaną wartość domyślną, a następnie zatwierdź zmianę
kliknięciem przycisku OK. UWAGA Mapy ponownego zapisywania są dziedziczone. Nie można ich jednak rozszerzać o kolejne pozycje, nie można także usuwać z takiej odziedziczonej mapy konkretnych pozycji. Konstrukcja interfejsu użytkownika może sugerować, że dodawanie pojedynczych pozycji do odziedziczonej mapy i usuwanie ich jest możliwe, jednak tak naprawdę mapa ponownego zapisywania zostanie usunięta na poziomie, na którym wprowadzasz w niej zmiany, a na jej miejsce wygenerowana zostanie nowa mapa z identyczną zawartością. Jeżeli zmienisz mapę oryginalną na wyższym poziomie hierarchii, zmiany te nie zostaną uwzględnione na niższych poziomach hierarchii. Jednak ponieważ zmieniona mapa ponownego zapisywania ma tę samą nazwę co mapa oryginalna, w zmienionej mapie stosowane będą reguły odziedziczone.
176 CZĘŚĆ I Internet Information Services (IIS)
Tworzenie reguły skojarzonej Sama obecność map ponownego zapisywania nie spowoduje jeszcze, że nastąpi ponowne zapisanie żądania. Mapy trzeba najpierw uwzględnić w definicji reguł. Map ponownego zapisywania można używać w warunkach definiowanych dla reguły albo we właściwości akcji. Nie można ich natomiast używać we wzorcach. Serwer IIS udostępnia kreator reguł. 1. Otwórz moduł URL Rewrite. 2. W panelu Akcje kliknij polecenie Add Rule(s). 3. Wybierz szablon Rule With Rewrite Template i naciśnij przycisk OK.
Uruchomiony zostanie kreator Add Rule With Rewrite Map. 4. Na liście rozwijanej Select The Rule Action wybierz, czy chcesz zdefiniować regułę
ponownego zapisywania, czy przekierowania. 5. Na drugiej liście rozwijanej wskaż mapę ponownego zapisywania, a następnie zatwierdź
zmiany przez kliknięcie przycisku OK. W ten sposób utworzyłeś regułę z odpowiednią akcją i mapą ponownego zapisywania. OSTRZEŻENIE Utworzona reguła używa mapy ponownego zapisywania w warunku, w którym
punktem wyjścia jest zmienna serwera REQUEST_URI. Zmienna REQUEST_uri — w odróżnieniu od ścieżek stosowanych we wzorcach reguł — zawsze zaczyna się znakiem ukośnika, a także zawiera ciąg zapytania. Dlatego wartości oryginalne zdefiniowane na mapie ponownego zapisywania także muszą zaczynać się znakiem ukośnika i uwzględniać ciągi zapytań.
Szczegółowe zasady działania reguł Na reguły składają się wzorce, warunki i akcje. W kolejnych punktach opiszę szczegółowo każdy z tych komponentów.
Wzorce Reguły są stosowane jedynie wówczas, gdy adres URL jest zgodny z określonymi wzorcami oraz gdy dla tych wzorców spełnione są także zdefiniowane warunki. Serwer IIS rozpoznaje trzy składnie wzorców: dokładne dopasowanie (Exact Match), proste symbole wieloznaczne (Wildcards) oraz wyrażenia regularne (Regular Expressions). Symbole wieloznaczne Symbole wieloznaczne stanowią stosunkowo prostą składnię dla wzorców reguł, a jednocześnie dzięki nim można uwzględnić dość zróżnicowane przypadki. Składnia symbolu zastępczego zawiera tylko jeden znak specjalny — znak gwiazdki '*'.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 177
Znak * jest symbolem zastępczym dla dowolnej liczby dowolnych znaków. Inaczej mówiąc, nie ogranicza on ani typu, ani liczby znaków. Znak gwiazdki może wręcz reprezentować brak znaku. Dla zawartości symbolu zastępczego tworzone jest odwołanie powrotne. W tabeli 7.4 przedstawionych zostało kilka przykładów zastosowania takiej składni. W uwagach odwołania powrotne przedstawiono jako {R:x}, czyli zgodnie ze składnią serwera IIS. Puste odwołanie powrotne {R:0} zawsze reprezentuje pełną zawartość wzorca wyszukiwania, jeśli został on odnaleziony. Inaczej mówiąc, odwołanie to jest identyczne jak dane wejściowe. TABELA 7.4. Przykłady zastosowania składni z symbolem zastępczym we wzorcach wyszukiwania
Wzorzec
Dane wejściowe
Pasuje?
Uwagi
a*c
abc
Tak
{R:0}=abc, {R:1}=b
a*c
a/b/d-e/c
Tak
{R:0}=a/bde/c, {R:1}=/b/d-e/; symbol zastępczy może zawierać znaki
a*c
a/b/d-e/c/d
Nie
Dane wejściowe muszą zawsze w całości pasować do wzorca wyszukiwania. W tym przypadku sekwencja "/d" powoduje, że dane nie pasują do wzorca.
ab/*/cd/*
ab/12/cd/cd
Tak
{R:0}=ab/12/cd/cd, {R:1}=12, {R:2}=cd; wzorzec wyszukiwania może
specjalne, na przykład znak ukośnika.
zawierać więcej niż jeden symbol zastępczy.
Wyrażenia regularne Wyrażenia regularne oferują zdecydowanie więcej możliwości w porównaniu z symbolami zastępczymi. Za pomocą wyrażeń regularnych można bardzo drobiazgowo i precyzyjnie zdefiniować wzorzec wyszukiwania. Ceną za większy zakres możliwości jest jednak wyższy stopień skomplikowania narzędzia. W wyrażeniach regularnych rozpoznawane są poniższe znaki kontrolne, które posiadają własne, specjalne znaczenie: . ( ) [ ] * + ? { } \ | ^ $
Jeżeli chcesz użyć któregoś z tych znaków jako znaku standardowego, a nie kontrolnego, musisz taki znak poprzedzić lewym ukośnikiem. Na przykład aby za pomocą wzorca wyszukiwać znak kropki, musisz go umieścić we wzorcu jako sekwencję "\.". Istotna różnica między wyrażeniami regularnymi a składnią z symbolami zastępczymi polega na tym, że wzorzec wyszukiwania zdefiniowany za pomocą wyrażenia regularnego nie musi pasować do całości danych wejściowych — wystarczy, że tylko określony ciąg znaków z danych wejściowych będzie odpowiadał wzorcowi. Dlatego możliwe są sytuacje, w których dane wejściowe będą posiadać inne znaki przed lub po ciągu, który pasuje do wzorca. Musisz zawsze o tym pamiętać, ponieważ w przeciwnym razie może się okazać, że do wzorca wyszukiwania pasuje zdecydowanie więcej adresów URL, niż początkowo przewidywałeś.
178 CZĘŚĆ I Internet Information Services (IIS)
Tabela 7.5 zawiera wszystkie znaki kontrolne oraz opisuje ich znaczenie. Wszystkie inne znaki, które nie zostały uwzględnione w tabeli, mogą być stosowane w wyrażeniach regularnych bez żadnych obostrzeń. Odwołania powrotne w postaci {R:x} są generowane w nawiasach okrągłych, zaś odwołanie {R:0} zawiera cały pasujący wzorzec wyszukiwania. TABELA 7.5. Znaki kontrolne stosowane w wyrażeniach regularnych
Znak kontrolny
Opis
.
Kropka oznacza pojedynczy znak (tylko jeden, nigdy więcej).
[]
Definiuje grupę znaków, na przykład [ADE] oznacza A, D lub E, ale już nie ciąg znaków ADE. W definicji zbioru można użyć też znaku myślnika (-), aby zdefiniować zakres znaków w porządku alfanumerycznym. Na przykład [A-Z] oznacza wszystkie litery ze zbioru od A do Z.
[^ ]
Jeżeli na początku grupy znaków znajduje się znak karetki, oznacza to, że definiowana jest grupa znaków, która ma zawierać wszystkie znaki oprócz tych zawartych w nawiasach kwadratowych. Na przykład zapis [^3-8] oznacza, że poszukiwane są wszystkie znaki z wyjątkiem cyfr od 3 do 8.
|
Znak potoku oznacza relację „lub”. Na przykład sekwencja abc|def pasuje zarówno do ciągu znaków abc, jak i do ciągu znaków def.
^
Definiuje początek danych wejściowych bez wskazywania ich pierwszego znaku. Na przykład wzorzec ^da pasuje zarówno do słowa dać, jak i danina, ale już nie do słowa buda ani panda.
$
Definiuje koniec danych wejściowych bez wskazywania ich ostatniego znaku. Na przykład wzorzec er$ pasuje do słów paker i moher, lecz już nie do pergamin ani erem.
()
Za pomocą nawiasów okrągłych grupuje się i generuje odwołania powrotne.
(?:)
Nawiasy okrągłe, w których pierwszymi znakami są znak zapytania i dwukropek, także służą do grupowania, lecz nie generują już odwołań powrotnych.
*
Wyrażenie poprzedzające znak gwiazdki może wystąpić dowolną liczbę razy albo wcale. Na przykład A* oznacza dowolną liczbę wystąpień litery A, zaś AB* oznacza wystąpienie litery A, po której ma nastąpić zero lub więcej liter B. Dzięki zastosowaniu grupowania ciągi można powtarzać. Dzięki temu wzorzec (AB)* oznacza dowolną liczbę wystąpień sekwencji AB, na przykład ABABAB.
+
Wyrażenie poprzedzające znak plusa może wystąpić dowolną liczbę razy, lecz nie mniej niż jeden raz. Na przykład [AB]+ oznacza dowolną liczbę wystąpień sekwencji liter A i B, jednak nie mniej niż jedno.
?
Wyrażenie poprzedzające znak zapytania może wystąpić tylko jeden raz albo nie wystąpić wcale.
{}
Wyrażenie poprzedzające nawiasy klamrowe ma wystąpić określoną liczbę razy. Na przykład {4} oznacza, że wyrażenie poprzedzające ma wystąpić dokładnie cztery razy, {2,4} oznacza, że wyrażenie poprzedzające ma wystąpić od dwóch do czterech razy, zaś {2,} oznacza, że wyrażenie poprzedzające ma wystąpić co najmniej dwa razy.
*?, +?, ??
Jeżeli po kwantyfikatorach *, + i ? występuje znak zapytania, oznacza to, że algorytm wyszukiwania nie powinien być zachłanny i kończy działanie po odnalezieniu pierwszej pasującej sekwencji. Na przykład jeśli dane wejściowe to ciąg ABBBC, odwołania powrotne dla wzorca wyszukiwania A(B+)(B*)C są ustalane następująco: {R:1}=BBB, {R:2}= puste. Natomiast odwołania powrotne dla wzorca wyszukiwania postaci A(B+?)(B*)C (a więc wyszukiwanie, które nie jest zachłanne) są ustalane następująco: {R:1}=B, {R:2}=BB. Przyczyną jest fakt, że w tym przypadku wyszukiwanie kończy się już w pierwszej grupie po odnalezieniu najkrótszej pasującej sekwencji.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 179 TABELA 7.5. Znaki kontrolne stosowane w wyrażeniach regularnych — ciąg dalszy
Znak kontrolny
Opis
(?= ), (?! )
Tak zwane wyrażenie wybiegające w przód: wzorzec (?=) oznacza, że po pasującej sekwencji musi wystąpić grupa zdefiniowana we wzorcu. Z kolei (?!) oznacza, że po pasującej sekwencji grupa zdefiniowana we wzorcu nie może występować. Na przykład wzorzec BCD(?=EF) pasuje do ciągu znaków ABCDEFG, ponieważ EF występuje po ciągu BCD. Ponieważ wyrażenie wybiegające w przód nie jest elementem wyszukiwanego ciągu, zerowe odwołanie powrotne (czyli całość danych wejściowych) ma postać {R:0}=BCD.
\
Znak ukośnika powrotnego jest stosowany do neutralizowania znaków kontrolnych, a także może definiować dodatkowe, samodzielne znaki kontrolne.
\u0000
Sekwencja \u definiuje znak w zapisie szesnastkowym jako jego wartość w formacie Unicode. Na przykład \u0041 oznacza literę A.
\x00
Sekwencja \x definiuje znak w zapisie szesnastkowym jako jego wartość w formacie ISO-8859-1. Na przykład \xdc oznacza literę Ü.
\b, \B
Sekwencja \b oznacza granicę słowa, a jednocześnie nie określa znaku, który tę granicę ma stanowić. Granica słowa jest rozpoznawana zawsze wówczas, gdy znak danego słowa (litera, cyfra albo znak podkreślenia) napotyka znak, który do słowa nie należy. Sekwencja \B oznacza znak, który nie jest granicą słowa. Sama sekwencja nie reprezentuje żadnego znaku.
\d, \D
Sekwencja \d oznacza cyfrę od 0 do 9, zaś sekwencja \D oznacza wszystkie znaki oprócz cyfr z przedziału od 0 do 9.
\s, \S
Sekwencja \s oznacza wszystkie znaki spacji, zaś sekwencja \S oznacza wszystkie znaki, które nie są znakami spacji.
\w, \W
Sekwencja \w oznacza znak słowa i nawiązuje do grupy znaków, która zawiera wszystkie litery, cyfry i znaki podkreślenia. Z kolei sekwencja \W oznacza wszystkie znaki oprócz znaków słowa.
Wyrażenia regularne bez wątpienia są bardzo rozbudowanym narzędziem, lecz ze względu na wysoki stopień złożoności łatwo o popełnienie w nich błędu. Projektanci serwera IIS postanowili ułatwić życie użytkownikom i udostępnili proste narzędzie do testowania działania wyrażeń regularnych. Testowanie działania wzorców Serwer IIS udostępnia wygodne narzędzie do testowania działania wzorców: 1. W Menedżerze IIS otwórz moduł URL Rewrite, a następnie w oknie dialogowym Add
Rule(s) utwórz nową regułę albo wybierz regułę już istniejącą i w panelu Akcje kliknij polecenie Edit. 2. W panelu Edit Rule, na liście rozwijanej Using, wybierz pożądany typ wzorca, a następnie
naciśnij przycisk Test Pattern. Wyświetlone zostanie okno dialogowe Test Pattern. 3. W polu tekstowym Pattern wpisz wzorzec, którego działanie chcesz sprawdzić. W polu
tekstowym Input Data To Test wpisz ścieżkę URL, za pomocą której chcesz przetestować wzorzec, po czym naciśnij przycisk Test.
180 CZĘŚĆ I Internet Information Services (IIS)
W panelu Test Results wyświetlona zostanie informacja, czy wpisana ścieżka URL pasuje do wzorca. Jeżeli tak, wyświetlona zostanie także lista odwołań powrotnych. 4. Powtórz testy na różnych danych wejściowych, aż wypracujesz odpowiednio precyzyjną
postać wzorca. Potem naciśnij przycisk Close, aby zamknąć okno dialogowe. Jeżeli zmieniłeś konfigurację wzorca, zostaniesz zapytany o to, czy zmiany te mają zostać zapisane. Naciśnij przycisk Yes lub No, aby powrócić do panelu Edit Rule.
Warunki Na podstawie wzorców reguł, które dotychczas poznałeś, można testować tylko ścieżki URL. Wzorzec nie ma jednak żadnego związku z innymi częściami adresu URL ani nagłówkami HTTP, dlatego nie są one we wzorcu w żaden sposób uwzględniane. Aby wyszukiwać wzorce w danych żądań HTTP, należy używać warunków reguły. Aby akcja zdefiniowana w ramach reguły została wykonana, nie wystarczy sama zgodność ścieżki URL ze wzorcem — spełniony musi być także warunek zdefiniowany w ramach reguły. Warunki składają się z trzech części: wartość początkowa dla warunku, typ warunku oraz (zależnie od tego typu) wzorzec warunku. Wartość początkowa dla warunku (ang. condition input) to dane, które zostaną użyte jako dane wejściowe dla testu lub wzorca. Wartością początkową mogą być zmienne CGI i serwera IIS opisane w punkcie „Zmienne predefiniowane” we wcześniej części tego rozdziału. Na przykład jako wartość początkową dla warunku można wskazać zmienną QUERY_STRING reprezentującą ciąg zapytania, SERVER_NAME zawierającą nazwę komputera czy HTTP_USER_AGENT, która przechowuje nagłówek User-Agent protokołu HTTP. Serwer IIS udostępnia sześć różnych typów warunków (ang. condition type). Oprócz typu sprawdzenia wzorca dostępne są również takie typy, dzięki którym można sprawdzać, czy celem żądania jest plik albo katalog. Oprócz takich trzech testów pozytywnych dostępne są odpowiadające im testy negatywne: celem żądania nie jest plik, nie jest nim katalog oraz dane początkowe nie pasują do wzorca warunku. Dodawanie i edytowanie warunków Aby dodać warunek do reguły, wykonaj następujące czynności: 1. W Menedżerze IIS, w module URL Rewrite, otwórz regułę, którą chcesz edytować. 2. Kliknij myszą sekcję Conditions, aby ją rozwinąć. 3. Na liście rozwijanej Logical Grouping wskaż, czy wszystkie warunki mają być spełnione,
aby akcja reguły została wykonana (opcja Match All), czy też wystarczy, by spełniony był tylko jeden z warunków (opcja Match Any). 4. Naciśnij przycisk Add, aby dodać nowy warunek.
Wyświetlone zostanie okno dialogowe Add Condition widoczne na rysunku 7.8.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 181
RYSUNEK 7.8. Dodawanie warunku do reguły
5. W polu tekstowym Condition Input wpisz wartość początkową dla warunku, którą chcesz
sprawdzać. Zmienne serwera należy wpisywać w nawiasach klamrowych. Istnieje wprawdzie możliwość użycia więcej niż jednej zmiennej, lecz aby utrzymać klarowność warunków, najlepiej jest w każdym warunku bazować tylko na jednej zmiennej. W definicji wartości początkowej dla warunku można też stosować odwołania powrotne i mapy ponownego zapisywania (dodatkowe informacje na ten temat znajdziesz też w następnym punkcie, zatytułowanym „Akcje”). 6. Na liście rozwijanej Check If Input String wybierz typ warunku.
Zwróć uwagę, że sprawdzanie, czy celem żądania jest plik albo katalog, ma sens tylko wtedy, gdy wartością początkową dla warunku jest ścieżka fizyczna. W innych sytuacjach powinieneś wykonywać jedynie sprawdzanie zgodności ze wzorcem. 7. Jeżeli w warunku sprawdzasz zgodność ze wzorcem, w polu tekstowym Pattern wpisz
wzorzec. Po naciśnięciu przycisku Test Pattern będziesz mógł sprawdzić, jak zachowuje się wzorzec względem różnego rodzaju danych wejściowych. Więcej informacji na ten temat przedstawiłem w punkcie „Testowanie działania wzorców” we wcześniejszej części tego rozdziału. 8. Naciśnij przycisk OK, aby zamknąć okno dialogowe. 9. Aby dodać kolejne warunki, w sekcji Condition ponownie naciśnij przycisk Add. 10. Na koniec w panelu Akcje wybierz polecenie Apply, aby zakończyć edytowanie reguły.
Odwołania powrotne Tak samo jak ścieżki URL, również warunki mogą generować odwołania powrotne. Odwołania powrotne można wykorzystywać w następnych warunkach lub właściwościach akcji jako {C:0}, {C:1} … {C:n}. Domyślnie zmienne {C:n} otrzymują odwołania powrotne tego warunku, który był przetwarzany jako ostatni. Nie można odczytywać odwołań powrotnych warunków wcześniejszych. Począwszy od wersji 2.0 modułu URL Rewrite, możesz włączyć opcję trackAllCaptures — w tym celu trzeba zaznaczyć pole opcji Track Capture Groups Across Conditions. Po włączeniu tej opcji
182 CZĘŚĆ I Internet Information Services (IIS)
kolejne grupy przechwyconych odwołań będą numerowane i udostępniane. Na przykład jeśli zdefiniowano dwie reguły i w każdej znajdują się dwie grupy odwołań, wówczas grupy odwołań z pierwszej reguły będą numerowane jako {C:0} i {C:1}, natomiast grupy odwołań z drugiej reguły będą mieć numery {C:2} i {C:3}. W obydwóch trybach istotna jest kolejność warunków. Kolejność warunków można ustalić w trakcie edytowania reguły.
Akcje Akcje w ramach reguły określają, w jaki sposób ma przebiegać dalsze przetwarzanie żądania. Jak już dowiedziałeś się w punkcie „Definiowanie reguł” z wcześniejszej części tego rozdziału, moduł URL Rewrite udostępnia pięć różnych typów akcji: Redirect, Rewrite, Custom Response, Abort i None (brak akcji). W definicjach właściwości akcji można używać zmiennych i funkcji. Zmienne We właściwościach akcji używane mogą być różne zmienne — dotyczy to w szczególności specyfikacji ścieżek URL dla akcji typu Redirect i Rewrite:
Zmienne serwera, na przykład {QUERY_STRING}, {SERVER_NAME}.
Odwołania powrotne ze wzorca reguły, na przykład {R:0}, {R:1}, … {R:n}.
Odwołania powrotne z warunków, na przykład {C:0}, {C:1}, … {C:n}.
Mapy ponownego zapisywania, do czego służy składnia {Nazwa mapy:wartość pozycji}. Na przykład aby dla mapy Moja_Mapa użyć danych wejściowych w postaci zmiennej {REQUEST_URI}, należy użyć zapisu {Moja_Mapa:{REQUEST_URI}}. UWAGA Wspomnianych zmiennych można używać w definicji warunku jako danych, które są porównywane ze wzorcem.
Funkcje Oprócz zmiennych we właściwościach akcji można używać także funkcji. Moduł URL Rewrite definiuje trzy następujące funkcje:
ToLower — wielkie litery w danych wejściowych są przekształcane na odpowiadające im małe litery.
UrlEncode — dane wejściowe są zakodowane w formacie URL. Znaki specjalne oraz znaki zabronione w adresach URL są neutralizowane zgodnie ze specyfikacją URL.
UrlDecode — przeciwieństwo funkcji UrlEncode.
Funkcje również umieszcza się w nawiasach klamrowych — na przykład funkcja {ToLower:Dom} zwróci ciąg znaków "dom". Jako parametry tych funkcji można wskazywać także inne zmienne, na przykład {UrlEncode:search.php?string={R:1}}.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 183 UWAGA Funkcje można stosować także w warunkach. W szczególności funkcji UrlDecode powinno się używać tylko w tym kontekście, ponieważ we właściwościach akcji może ona zwracać niepożądane wyniki (znaki, które są zabronione w ścieżkach URL).
Ustawianie zmiennych serwera i nagłówków protokołu HTTP Oprócz akcji, które powinny zostać wykonane, gdy odnaleziony zostanie wzorzec i spełnione będą warunki, moduł URL Rewrite udostępnia także funkcję, która ustawia zmienne serwera i nagłówki protokołu HTTP dla otrzymanego żądania. Zarówno zmienne, jak i nagłówki definiuje się w trakcie edytowania reguły, w sekcji Server Variables. Zmiennym serwera można nadawać dowolne nazwy; można nawet w ten sposób zastąpić standardowe zmienne serwera. Dla nagłówków protokołu HTTP należy stosować taki sam schemat nazewnictwa HTTP_* jak w PHP. Na przykład aby ustawić nagłówek Referer, należy zdefiniować zmienną HTTP_REFERER. Serwer IIS ma wbudowany pewien mechanizm zabezpieczający. Dzięki temu mechanizmowi zanim w definicji reguły będzie można ustawiać zmienne, trzeba będzie wskazać zmienne modyfikowane lub ustawiane w regule. Czyni się to w następujący sposób: 1. W panelu Połączenia wybierz pożądany element, a następnie otwórz moduł URL Rewrite. 2. W panelu Akcje wybierz polecenie View Server Variables. 3. Aby dodać nową zmienną, znów w panelu Akcje kliknij polecenie Add, w oknie dialogowym
wpisz nazwę zmiennej, po czym naciśnij przycisk OK. Potem do definicji reguł możesz już dodawać zmienne serwera i ich wartości. Służy do tego sekcja Server Variables panelu Edit Inbound Rule. Na rysunku 7.9 widać, w jaki sposób nagłówkowi Referer protokołu HTTP można przypisać zdalny adres klienta, jeżeli nagłówka tego brakuje. Upewnij się przy tym, że pole opcji Replace The Existing Value nie jest zaznaczone, ponieważ nie powinno się nadpisywać wartości istniejącego nagłówka. Zmienne serwera i nagłówki są ustawione w globalnej zmiennej PHP o nazwie $_SERVER. Jeśli zdefiniujesz zmienną odpowiedz tak, jak widać na liście zmiennych na rysunku 7.9, będzie można ją odczytać w kodzie PHP jako $_SERVER['odpowiedz']. Warto pamiętać, że dodawanie lub zmienianie przychodzących nagłówków i zmiennych ma sens wyłącznie w ramach akcji Rewrite lub None, o ile nie zainstalowałeś własnych, specjalnych modułów serwera IIS. Dzięki ustawieniu nagłówków lub zmiennych w ramach akcji None nie możesz rozszerzać żądania przychodzącego bez konieczności wykonywania ponownego zapisywania. Na podstawie tak ustawionych zmiennych i nagłówków można także obsługiwać różne przypadki w kolejnych regułach. Wystarczy w tym celu w warunkach kolejnych reguł sprawdzać wartości wcześniej ustawionych nagłówków i zmiennych.
184 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.9. Modyfikowanie nagłówka HTTP w ramach reguły ponownego zapisywania
Reguły wychodzące Moduł URL Rewrite pozwala na ponowne zapisywanie odpowiedzi wychodzących — również w tym przypadku można ustawiać nagłówki protokołu HTTP oraz zmienne serwera, a dodatkowo można też zmieniać zawartość odpowiedzi. Ponowne zapisywanie odpowiedzi przydaje się wówczas, gdy zachodzi konieczność zmodyfikowania łączy lub dodania jakiejś uwagi do wszystkich stron. Zasadniczo struktura reguł wychodzących nie różni się od struktury reguł przychodzących. Jednak ponieważ serwer IIS musi za każdym razem przeprowadzić parsowanie treści, przetwarzanie reguł wychodzących może negatywnie wpłynąć na wydajność. Dlatego właśnie serwer został wzbogacony o kilka narzędzi, które pozwalają zminimalizować ten negatywny wpływ na wydajność. Do narzędzi tych należą: warunki wstępne, filtry znaczników oraz buforowanie w pamięci podręcznej. To ostatnie rozwiązanie jest dostępne wyłącznie w konfiguracji XML. Warunki wstępne Warunki wstępne są sprawdzane jeszcze przed przetworzeniem reguły. Najczęściej za pomocą warunków wstępnych sprawdza się, czy treść odpowiedzi jest właściwego typu. Do tego właśnie służy dostępny w module URL Rewrite predefiniowany warunek o nazwie ResponseHtml1. Warunek ten sprawdza, czy treść odpowiedzi jest typu text/html. Aby zdefiniować własny warunek wstępny, wykonaj następujące czynności:
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 185 1. W panelu Połączenia wybierz pożądany element, a następnie otwórz moduł URL Rewrite. 2. W panelu Akcje kliknij polecenie Outbound Rules/Preconditions. 3. Ponownie w panelu Akcje wybierz polecenie Add.
Otwarte zostanie okno dialogowe Add Precondition. 4. W oknie dialogowym wpisz nazwę kolekcji warunków wstępnych, a następnie naciśnij
przycisk Add, aby dodać nowy warunek. 5. W oknie dialogowym Add Condition, w polu tekstowym Condition Input, wpisz dane
wejściowe dla wzorca. W tym przypadku nagłówki HTTP trzeba poprzedzać prefiksem "RESPONSE_". Na przykład aby jako dane wejściowe wskazać nagłówek Cache-Control, w polu tekstowym Condition Input należałoby wpisać {RESPONSE_CACHE_CONTROL}. 6. Podaj wzorzec oraz wskaż, czy wzorzec ten powinien spełniać warunek wstępny, czy też
nie powinien go spełniać. Następnie naciśnij przycisk OK. 7. Przyciskiem Add możesz dodawać kolejne warunki, możesz też zapisać kolekcję warunków
wstępnych przez kliknięcie przycisku OK. Filtry znaczników Aby zwiększyć wydajność działania mechanizmu porównywania ze wzorcem, możesz i powinieneś używać filtrów znaczników. Filtry znaczników wskazują te atrybuty elementów HTML, względem których należy zastosować wzorzec. Można na przykład wskazać, że wzorzec ma dotyczyć wyłącznie atrybutu src elementu img. Filtry znaczników mogą uwzględniać wyłącznie definicje atrybutów, a nie zawartości elementów. Mimo to nadal są one bardzo przydatnym narzędziem, ponieważ w większości przypadków za pomocą reguł wychodzących ponownie zapisuje się adresy URL, które są przechowywane w atrybutach HTML. Moduł URL Rewrite udostępnia predefiniowane filtry znaczników dla elementów a, area, base, form, frame, head, iframe, img, input, link i script. Aby zdefiniować własny filtr znaczników, wykonaj następujące czynności: 1. W panelu Połączenia wybierz pożądany element, po czym otwórz moduł URL Rewrite. 2. W panelu Akcje kliknij polecenie Outbound Rules/View Custom Tags. 3. Wciąż w panelu Akcje wybierz polecenie Add Group.
Wyświetlone zostanie kolejne okno dialogowe o nazwie New Custom Tags Collection, widoczne na rysunku 7.10. 4. W oknie dialogowym wpisz nazwę kolekcji znaczników, a następnie podaj nazwy elementów
i atrybutów. 5. Naciśnij przycisk OK, aby utworzyć kolekcję filtrów znaczników.
186 CZĘŚĆ I Internet Information Services (IIS)
RYSUNEK 7.10. Tworzenie kolekcji własnych filtrów znaczników dla wychodzących reguł ponownego zapisywania
Tworzenie reguły wychodzącej Regułę wychodzącą tworzy się w sposób podobny jak regułę przychodzącą: 1. W panelu Połączenia wybierz pożądany element i otwórz moduł URL Rewrite. 2. W panelu Akcje kliknij polecenie Add Rule(s). 3. Wybierz opcję Outbound Rules/Blank Rule i naciśnij przycisk OK. 4. W obszarze roboczym Edit Outbound Rule, w polu tekstowym Name, wpisz nazwę reguły. 5. Wybierz warunek wstępny, który ma być sprawdzany.
Jeżeli ponownie zapisujesz treść odpowiedzi, powinieneś zawsze w takim przypadku używać warunku wstępnego, w którym będzie sprawdzany typ zawartości odpowiedzi. 6. Wskaż zasięg dopasowania Matching Scope: albo odpowiedź (Response), albo zmienna
serwera (Server Variable). Jeśli wybierzesz Server Variable, na dalszym etapie całego procesu będziesz mógł ponownie dodawać lub modyfikować wychodzące nagłówki protokołu HTTP lub ustawiać zmienne dla własnych modułów serwera IIS. Dla nagłówków HTTP stosuje się prefiks "RESPONSE_" (na przykład RESPONSE_COOKIE). W dalszych krokach opisywanych poniżej przyjąłem założenie, że jako zasięg dopasowania wybrałeś odpowiedź (Response). 7. Jeżeli planujesz porównywać wzorzec z wartościami atrybutów, na liście rozwijanej Match
Content Within wybierz zbiór filtrów znaczników. W przeciwnym razie pozostaw tę opcję niezdefiniowaną. 8. Zdefiniuj wzorzec dopasowania, jego składnię oraz sposób uwzględniania wielkości liter
zgodnie z potrzebami tworzonego rozwiązania. Opcjonalnie możesz też zdefiniować dodatkowe warunki, tak samo jak w przypadku reguł przychodzących.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 187 9. W ostatnim kroku wskazuje się akcję. Dostępne są dwa rodzaje akcji: Rewrite i None. Podobnie jak
poprzednio akcja None ma sens wówczas, gdy za jej pomocą przerywa się przetwarzanie następnych żądań. Wartością, którą wskazuje się dla akcji typu Rewrite, jest wartość, która ma zostać zastąpiona przez wzorzec. Na przykład wzorzec można zastąpić wartością pasującego atrybutu. 10. W panelu Akcje kliknij polecenie Apply, aby utworzyć regułę.
Na przykład aby wszystkie łącza do strony logowania pod adresem http://niezabezpieczona. xmp.witryna/aplikacja/login ponownie zapisać w postaci https://zabezpieczona.xmp.witryna/ aplikacja/login, możesz zastosować następujące ustawienia:
Warunek wstępny (Pre-Condition): ResponseHtml1.
Zasięg dopasowania (Matching Scope): Response, dopasowywana treść elementów A i Form.
Składnia (Using): Wildcards; wzorcem będzie http://niezabezpieczona.xmp.witryna/*/login.
Typ akcji (Action Type): Rewrite z wartością (Value) https://zabezpieczona.xmp.witryna/{R:1}/login.
Konfiguracja XML Podobnie jak wszystkie ustawienia konfiguracyjne, również reguły modułu URL Rewrite można odwzorować w plikach konfiguracyjnych XML serwera IIS. W tym punkcie przedstawię najbardziej istotne ustawienia konfiguracyjne. Reguły definiuje się w sekcji system.webServer plików konfiguracyjnych (na przykład web.config). Na listingu 7.2 widnieje definicja przykładowej reguły, która umożliwia wyszukiwanie w sposób znany z witryny http://php.net. LISTING 7.2. Przykładowa konfiguracja reguły
URL Rewrite W tabeli 7.6 znajdują się elementy konfiguracyjne modułu URL Rewrite. Globalne reguły serwera można definiować wyłącznie w pliku applicationHost.config.
188 CZĘŚĆ I Internet Information Services (IIS) TABELA 7.6. Element konfiguracji
Element
Opis
rewrite
Definicje modułu URL Rewrite.
rewrite/allowedServerVariables
Definicja zmiennych serwera i nagłówków HTTP, które można dodawać lub modyfikować.
rewrite/globalRules
Reguły globalne (obowiązuje na poziomie serwera).
rewrite/outboundRules
Definicja rozproszonych reguł wychodzących.
rewrite/providers
Własne mechanizmy ponownego zapisywania zaimplementowane w .NET.
rewrite/rewriteMaps
Mapy ponownego zapisywania.
rewrite/rules
Reguły rozproszone.
Dostępne zmienne serwera Aby wskazać zmienne serwera oraz nagłówki HTTP, które mogą być modyfikowane przez moduł URL Rewrite, należy użyć kolekcji elementów konfiguracyjnych . Elementy tej kolekcji opisano w tabeli 7.7. TABELA 7.7. Elementy konfiguracyjne kolekcji
Element
Opis
add
Dodaje zmienną, która może być modyfikowana w następujących po niej regułach ponownego zapisywania. Zmienną definiuje się przy użyciu atrybutu name, na przykład: .
clear
Usuwa wszystkie wcześniej zdefiniowane zmienne. Element służy do czyszczenia wszystkich wartości odziedziczonych i nie posiada żadnych atrybutów ani zawartości.
remove
Usuwa zmienną wskazywaną przez atrybut name, na przykład: .
Reguły Oprócz reguł globalnych w plikach konfiguracyjnych XML można też definiować reguły rozproszone zgodnie z opisem w tabeli 7.8. Zalecaną praktyką jest rozpoczynanie definicji reguł globalnych instrukcją , natomiast używanie instrukcji w kontekście globalnym jest bezcelowe. TABELA 7.8. Elementy konfiguracyjne dla i
Element
Opis
clear
Usuwa wszystkie reguły zdefiniowane dotąd na tym samym poziomie hierarchii, w tym reguły odziedziczone. Zwykle element umieszcza się na początku ustawień , gdy w bieżącej sekcji nie powinny obowiązywać reguły odziedziczone. Element nie posiada atrybutów ani zawartości.
remove
Usuwa regułę wskazywaną przez atrybut name. Za pomocą elementu usuwa się pojedyncze reguły odziedziczone, na przykład: .
rule
Definicja reguły.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 189
Definicja reguły składa się z trzech sekcji: wzorca, warunków i akcji (zgodnie z opisem zawartym w tabeli 7.9). Każdej regule należy nadać unikatową nazwę — pozwoli to usunąć konkretną regułę z niższego poziomu hierarchii za pomocą elementu . Kolejność definiowania reguł jest istotna o tyle, że adres URL może być ponownie zapisywany wiele razy na podstawie różnych reguł, o ile przetwarzanie kolejnych reguł nie zostanie przerwane przez akcję odpowiedniego typu (na przykład akcję Abort) albo przez właściwość stopProcessing. TABELA 7.9. Element konfiguracyjny
Element
Atrybut
rule
Opis Definicja reguły.
enabled
Wskazuje, czy reguła jest włączona (true), czy wyłączona (false).
name
Unikatowa nazwa reguły.
patternSyntax
Składnia symboli zastępczych we wzorcu i warunkach: wyrażenia regularne (ECMAScript), proste symbole zastępcze (Wildcard) lub dokładne dopasowanie (ExactMatch).
stopProcessing
Wskazuje, czy jeżeli reguła zostanie zastosowana, należy zrezygnować z przetwarzania kolejnych reguł (false, true).
rule/match
Definicja wzorca reguły. negate
Wskazuje, czy akcję należy wykonać w przypadku, gdy dane wejściowe są zgodne ze wzorcem, czy też gdy dane wejściowe są niezgodne ze wzorcem.
ignoreCase
Wskazuje, czy wielkość liter (upper/lower) należy ignorować.
url
Wzorzec, z którym porównuje się ścieżkę URL.
rule/conditions
Definicja warunków reguły. logicalGrouping
Wskazuje, czy spełnione muszą być wszystkie warunki (MatchAll), czy wystarczy, aby spełniony był co najmniej jeden warunek (MatchAny).
trackAllCaptures
Jeżeli ma wartość true, wówczas moduł URL Rewrite będzie zapamiętywał odwołania przechwycone we wszystkich warunkach, a jeśli ma wartość false, wówczas w {C:x} używane będą tylko odwołania przechwycone w ostatnim warunku.
rule/conditions/add
Definicja pojedynczego warunku.
rule/ serverVariables/set
Ustawia zmienne serwera i nagłówki protokołu HTTP.
rule/action
Definicja akcji dla reguły. type
Definiuje typ akcji: • Redirect • Rewrite • CustomResponse • AbortRequest • None: Brak akcji.
190 CZĘŚĆ I Internet Information Services (IIS)
Warunki Warunki reguły definiuje się w elemencie konfiguracyjnym , w ramach elementu . Tabela 7.10 prezentuje atrybuty, których można używać w definicji pojedynczego warunku. TABELA 7.10. Atrybuty elementu dla warunków reguły
Atrybut
Opis
ignoreCase
Wyłącznie dla typu pattern: wskazuje, czy należy ignorować wielkość liter (upper/lower).
input
Wskazuje, które dane mają być weryfikowane w ramach warunku.
matchType
Definiuje typ testu: porównanie ze wzorcem (pattern — jest to wartość domyślna), sprawdzanie, czy obiekt jest plikiem (isFile), lub sprawdzanie, czy obiekt jest folderem (isDirectory).
negate
Wskazuje, czy warunek jest spełniony, gdy występuje zgodność ze wzorcem (false) lub brak zgodności ze wzorcem (true).
pattern
Wyłącznie dla typu pattern: wskazuje wzorzec, który ma być podstawą porównywania.
Zmienne serwera i nagłówki HTTP Zmiany w zmiennych serwera definiuje się w elemencie , wewnątrz elementu . W tabeli 7.11 opisano atrybuty elementu . TABELA 7.11. Atrybuty, za pomocą których w elemencie ustawia się zmienne serwera
Atrybut
Opis
name
Zmienna serwera, która ma podlegać zmianie. Przychodzące nagłówki protokołu HTTP mają prefiks "HTTP_", natomiast nagłówki wychodzące mają prefiks "RESPONSE_".
replace
Wskazuje, czy należy zastąpić istniejącą zmienną/nagłówek. Jeśli atrybut ma wartość false, wówczas istniejące zmienne i nagłówki pozostaną w niezmienionej postaci.
value
Wartość, którą należy ustawić dla zmiennej lub nagłówka.
Akcje Wewnątrz elementu konfiguracyjnego można zdefiniować różnorodne atrybuty dla pięciu różnych typów akcji. W tabeli 7.12 znajdują się atrybuty reguły przekierowywania, zaś w tabeli 7.13 opisano atrybuty dotyczące reguły ponownego zapisywania. Tabela 7.14 zawiera atrybuty odpowiedzi niestandardowej. TABELA 7.12. Atrybuty akcji typu redirect
Atrybut
Opis
appendQueryString
Wskazuje, czy ciąg zapytania powinien zostać dołączony do docelowego adresu URL (true, false).
redirectType
Wskazuje kod stanu HTTP, który należy wysłać. Może to być liczba lub tekst. Dozwolone są następujące wartości: 301, Permanent; 302, Found; 303, See other; 307, Temporary.
url
Docelowy adres URL, do którego ma nastąpić przekierowanie. Może to być adres bezwzględny.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 191 TABELA 7.13. Atrybuty akcji typu rewrite
Atrybut
Opis
appendQueryString
Wskazuje, czy ciąg zapytania powinien zostać dołączony do docelowego adresu URL (true, false).
url
Docelowy adres URL, do którego ma nastąpić przekierowanie (więcej informacji na ten temat znajduje się w punkcie „Akcje” wcześniej w tym rozdziale).
TABELA 7.14. Atrybuty akcji typu custom reply
Atrybut
Opis
statusCode
Kod stanu HTTP odpowiedzi.
statusDescription
Jednowierszowy opis kodu stanu, wysyłany w nagłówkach wraz z odpowiedzią HTTP.
statusReason
Powód odpowiedzi.
subStatusCode
Kod podstanu — używany tylko dla celów serwera IIS.
Mapy ponownego zapisywania Mapy ponownego zapisywania definiuje się w sekcji . W tabeli 7.15 widać, że oprócz definiowania pojedynczej mapy ponownego zapisywania można także usuwać jedną lub wszystkie zdefiniowane mapy. TABELA 7.15. Element konfiguracji
Element
Opis
rewriteMaps
Mapa ponownego zapisywania.
rewriteMaps/clear
Usuwa wszystkie wcześniej zdefiniowane mapy, w tym mapy odziedziczone.
rewriteMaps/remove
Usuwa jedną, nazwaną mapę ponownego zapisywania (na przykład ).
rewriteMaps/rewriteMap
Definiuje jedną mapę ponownego zapisywania.
Opcje konfiguracji pojedynczej mapy ponownego zapisywania opisano w tabeli 7.16. Zdefiniować można nazwę i domyślną wartość dla mapy, a także pary nazwa i wartość dla poszczególnych wpisów w danej mapie.
Reguły wychodzące Reguły wychodzące definiuje się w elemencie konfiguracyjnym . Dostępne elementy opisano w tabeli 7.17. Atrybut rewriteBeforeCache pozwala na zapisywanie w pamięci podręcznej ponownie zapisanej odpowiedzi, co może wydatnie zwiększyć wydajność działania, zwłaszcza jeśli nie są przykładane żadne filtry znaczników i do porównania ze wzorcem brana jest odpowiedź w pełnej postaci. Buforowania w pamięci podręcznej nie należy natomiast stosować, jeżeli wykonywane jest kodowanie przesyłanych fragmentów danych HTTP.
192 CZĘŚĆ I Internet Information Services (IIS) TABELA 7.16. Element konfiguracji
Element
Atrybut
rewriteMap
Opis Definiuje mapę ponownego zapisywania.
name
Nazwa mapy ponownego zapisywania.
defaultValue
Wartość domyślna na wypadek, gdy żadna z pozycji zdefiniowanych na mapie nie znajduje zastosowania.
ignoreCase
Wskazuje, czy należy ignorować wielkość liter (upper/lower).
rewriteMap/add
Definiuje pojedynczy wpis na mapie. key
Wartość oryginalna (key, name).
value
Nowa wartość.
TABELA 7.17. Element konfiguracji
Element
Atrybut
Opis
rewriteBeforeCache
Jeżeli ma wartość true, wyniki ponownego zapisywania zostaną umieszczone w pamięci podręcznej, o ile włączone jest buforowanie danych na serwerze IIS (o czym traktował rozdział 6. „Pamięć podręczna”).
outboundRules
outboundRules/customTags
Definicja własnych filtrów znaczników.
outboundRules/preConditions
Definicja warunków wstępnych.
outboundRules/rule
Reguły wychodzące.
Grupy własnych filtrów znaczników można definiować w kolekcji elementów konfiguracyjnych . Grupa filtrów znaczników sama w sobie stanowi kolekcję elementów konfiguracyjnych. Szczegółowe informacje na ten temat prezentuje tabela 7.18. TABELA 7.18. Elementy konfiguracyjne dla
Element
Opis
clear
Usuwa wszystkie wcześniej zdefiniowane i odziedziczone definicje.
remove
Usuwa grupę filtrów o nazwie wskazywanej przez atrybut name, na przykład .
tags
Definicja grupy filtrów znaczników, której nazwa jest definiowana przez atrybut name. Definicja ma charakter kolekcji elementów konfiguracyjnych.
tags/clear
Usuwa wszystkie wcześniej zdefiniowane znaczniki.
tags/remove
Usuwa znacznik wskazany przez parę nazwa i atrybut, na przykład .
tags/tag
Dodaje filtr znaczników. Nazwę elementu wskazuje atrybut name, zaś nazwa atrybutu jest definiowana bezpośrednio w tym atrybucie. Na przykład: .
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 193
Warunki wstępne są definiowane w kolekcji elementów konfiguracyjnych . Oprócz standardowych elementów i w kolekcji występuje także element , który definiuje konkretny warunek wstępny. Opis elementów i atrybutów w kolekcji znajduje się w tabeli 7.19. TABELA 7.19. Elementy konfiguracyjne dla
Element
Atrybut
Opis
name
Nazwa grupy warunków wstępnych.
logicalGrouping
MatchAll, jeśli wszystkie warunki mają być spełnione, lub MatchAny, jeśli spełniony musi być co najmniej jeden warunek.
patternSyntax
Składnia wyrażeń regularnych (ECMAScript — wartość domyślna), dopasowanie symboli wieloznacznych (Wildcard) lub dokładne dopasowanie (ExactMatch).
preCondition
preCondition/add
Definicja pojedynczego warunku wstępnego należącego do grupy. ignoreCase
Wskazuje, czy w trakcie porównywania ze wzorcem należy brać pod uwagę wielkość liter (true), czy nie (false).
input
Dane wejściowe, które mają być porównywane.
negate
Jeśli ma wartość true, wówczas warunek uznaje się za spełniony, jeśli dane wejściowe nie pasują do wzorca.
pattern
Definicja wzorca dopasowania.
Pojedyncza reguła wychodząca Pojedynczą regułę wychodzącą definiuje się w elemencie konfiguracyjnym , w kolekcji . Podstawowa struktura definicji reguły wychodzącej jest taka sama jak dla reguły przychodzącej. Szczegółowe informacje na ten temat znajdują się w tabeli 7.20. Atrybut occurrences przydaje się do zwiększenia wydajności, zwłaszcza gdy sprawdzana jest pełna treść odpowiedzi. Atrybut occurrences definiuje liczbę dopasowań, po której osiągnięciu należy przerwać ponowne zapisywanie. Jeżeli zdefiniujesz regułę ponownego zapisywania tylko po to, by za jej pomocą zmodyfikować jeden element, wówczas ustawienie occurrences="1" pomoże zwiększyć wydajność działania.
Przykłady W kolejnych punktach opiszę kilka standardowych przykładów ponownego zastosowania modułu URL Rewrite: adresy URL przyjazne dla użytkownika, strony w różnych językach, zapobieganie osadzaniu grafik na stronach zewnętrznych, kanoniczne nazwy komputerów i katalogów użytkowników, a także przekierowywanie do HTTPS. Na podstawie tych przykładów szybciej zrozumiesz sposób działania poszczególnych funkcji modułu URL Rewrite.
194 CZĘŚĆ I Internet Information Services (IIS) TABELA 7.20. Element konfiguracyjny
Element
Atrybut
rule
Opis Definicja reguły.
enabled
Wskazuje, czy reguła jest włączona (true), czy wyłączona (false).
name
Unikatowa nazwa reguły.
patternSyntax
Składnia do przetwarzania symboli zastępczych i warunków: wyrażenia regularne (ECMAScript), proste symbole zastępcze (Wildcard) lub dopasowanie dokładne (ExactMatch).
preCondition
Nazwa grupy warunków wstępnych, które należy sprawdzać przed wykonaniem reguły.
stopProcessing
Wskazuje, czy w przypadku, gdy reguła znajduje zastosowanie, należy zrezygnować z przetwarzania następnej reguły (true, false).
rule/match
Definicja wzorca reguły. customTags
Nazwa grupy niestandardowych filtrów znaczników, której należy użyć. Filtry są używane tylko wtedy, gdy opcja CustomTags ma wartość filterByTags.
filterByTags
Tablica bitów, która wskazuje, które filtry znaczników należy zastosować. Dozwolone wartości: None (0), A (1), Area (2), Base (4), Form (8), Frame (16), Head (32), IFrame (64), Img (128), Input (256), Link (512), Script (1024), CustomTags (32768).
ignoreCase
Wskazuje, czy należy zignorować wielkość liter (upper/lower).
negate
Wskazuje, czy należy wykonać akcję, gdy wzorzec pasuje do danych wejściowych (false) czy gdy wzorzec do tych danych nie pasuje (true).
occurrences
Wskazuje maksymalną liczbę dopasowań, po osiągnięciu której porównywanie ze wzorcem zostaje przerwane. Atrybut ten pozwala zwiększyć wydajność obsługi niektórych przypadków.
pattern
Wzorzec, do którego przyrównywana jest określona treść.
serverVariable
Wskazuje zmienną serwera lub nagłówek odpowiedzi HTTP, który należy dodać lub zmodyfikować. Ustawienia tego nie można łączyć z ponownym zapisywaniem treści odpowiedzi. Inaczej mówiąc, atrybutu tego nie można używać łącznie z atrybutem customTags, filterByTags i occurrences.
rule/conditions
Definicja warunków dla reguły, analogiczna jak dla reguł wychodzących. Więcej informacji na ten temat znajduje się w tabeli 7.10.
rule/action
Definicja akcji dla reguły. replace
Wskazuje, czy należy zastąpić istniejącą zmienną serwera lub nagłówek (true, false). Wpływa wyłącznie na dopasowywanie zmiennych serwera.
type
Definiuje typ akcji. Dostępne wartości to Rewrite i None.
value
Wartość, którą należy wstawić w miejscu, w którym znaleziono dopasowanie.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 195
Adresy URL przyjazne dla użytkowników Dzięki adresom URL przyjaznym dla użytkowników możesz przekierować wszystkie typy różnych adresów URL do pojedynczego skryptu PHP. Tego typu przekierowanie jest szczególnie przydatne na platformach blogów i w PHP Framework. Listing 7.3 prezentuje taką przykładową regułę: zapisuje ona wszystkie adresy URL typu http://witrynademophp.site/2011-08-12/Chomiki-i-inne-zwierzaki do adresu skryptu urlinfo.php w postaci http://witrynademophp.site/urlinfo.php?date=2011-08-12 &title=Chomiki-i-inne-zwierzaki. Ponieważ w tym samym folderze mogą też znajdować się grafiki lub inne zasoby, dodatkowo konieczne jest zdefiniowanie dwóch powiązań, które zabronią ponownego zapisywania adresu, jeśli adres URL będzie wskazywać plik lub katalog. LISTING 7.3. Definicja reguły do obsługi adresów URL przyjaznych dla użytkownika
Kanoniczna nazwa komputera Powiązanie dla witryny często uwzględnia więcej niż jedną nazwę komputera. Najprostszym przykładem jest powiązanie, które zawiera nazwę serwera z przedrostkiem www i bez tego przedrostka. Za pomocą reguły przekierowania można przekierowywać użytkowników, a przede wszystkim przeglądarki, do adresów URL zgodnych z preferowaną składnią. Jako kod stanu HTTP należy używać wartości 301 (stałe przekierowanie), ponieważ sprawi ona, że kolejne wysyłane żądania będą kierowane już bezpośrednio do nowego adresu. Na listingu 7.4 znajduje się definicja takiej przykładowej reguły. Zdefiniowałem w niej dwa warunki: pierwszy z nich sprawdza nazwę serwera, a drugi sprawdza numer portu. Na przykład jeśli nie chcesz tylko przekierowywać z adresu www.witrynademophp.site na adres witrynademophp.site, ale też przekierowywać z wszystkich nazw komputerów zastosowanych w wiązaniu do kanonicznej nazwy komputera, powinieneś najpierw sprawdzić, czy nazwa komputera różni się od nazwy kanonicznej (w sposób pokazany w definicji reguły). LISTING 7.4. Definicja reguły do obsługi kanonicznej nazwy komputera
196 CZĘŚĆ I Internet Information Services (IIS)
WAŻNE W takiej postaci, w jakiej przedstawiono regułę w powyższym przykładzie, może ona funkcjonować wyłącznie na poziomie witryny, ponieważ akcja dokleja odwołanie powrotne bezpośrednio do nazwy komputera. Aby odwołanie powrotne zawierało pełną ścieżkę URL, reguła musi funkcjonować na poziomie całej witryny (patrz punkt „Hierarchia i ścieżki adresów URL” we wcześniejszej części tego rozdziału).
Strony w różnych językach Witryny, których zawartość występuje w różnych językach, udostępniają poszczególne wersje językowe pod różnymi adresami URL. Na przykład wersja polska może być dostępna pod adresem http://witrynademophp.site/pl/, wersja angielska pod adresem http://witrynademophp.site/en/, a niemiecka może mieć adres http://witrynademophp.site/de/. Przeglądarki wskazują swój preferowany język w nagłówku HTTP o nazwie Accept-Language. Na listingu 7.5 widać, jak można przetwarzać nagłówek, aby automatycznie przekierowywać użytkownika do treści w odpowiadającym mu języku. LISTING 7.5. Definicja reguły, która przekierowuje do strony w języku wskazywanym przez przeglądarkę
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 197
Warunki reguły odpowiedni_jezyk zostały tak zdefiniowane, by najpierw sprawdzać, czy wcześniej już wywołano konkretną wersję językową (czyli katalog z dwuliterową nazwą), a następnie czy ustawiony jest nagłówek Accept-Language. Jeżeli obydwa warunki są spełnione, na podstawie mapy ponownego zapisywania mapa_jezykow wybierany jest folder (value) odpowiedni dla języka (key). Jeżeli nie można ustalić języka, reguła automatycznie przekierowuje do wersji polskiej (defaultValue). Reguła brak_jezyka jest przetwarzana tylko wówczas, gdy nie doszło do przetworzenia pierwszej reguły. W takiej sytuacji wykonywane jest automatyczne przekierowanie do polskiej wersji językowej.
Kanoniczne nazwy katalogów użytkownika Aby na serwerze skonfigurować witryny osobiste, przeznaczone dla wielu użytkowników, można użyć jednego z dwóch powszechnie stosowanych formatów adresów URL: składni z tyldą lub poddomen. W niektórych okolicznościach fizyczny układ katalogów użytkownika jest taki sam: wewnątrz danego folderu każdy użytkownik posiada własny podfolder, który z kolei zawiera osobisty katalog użytkownika. Na listingu 7.6 znajduje się reguła ponownego zapisywania, która obsługuje składnię ze znakiem tyldy. Dodatkowo za pomocą katalogu wirtualnego można dodawać ścieżkę /user do każdej lokalizacji na dyskach serwera. LISTING 7.6. Definicja reguły, która zapewnia adresy URL do kanonicznych nazw katalogów użytkowników za pomocą składni ze znakiem tyldy
Z kolei na listingu 7.7 widnieje reguła, która przekształca katalogi użytkowników w poddomeny. Ważne jest przy tym, aby wszystkie poddomeny wskazywały na adres IP serwera oraz aby witryna serwera IIS posiadała zdefiniowane powiązania dla tych poddomen. W porównaniu z poprzednim przykładem w regule z listingu 7.7 wprowadzono trzy zmiany:
Pierwsza reguła zapobiega bezpośredniemu wywoływaniu ponownie zapisanego adresu URL /user. Jest to konieczne, ponieważ w przeciwnym razie za pomocą obcych domen innych użytkowników można by wywoływać należące do nich zasoby. Reguła ta musi występować przed drugą regułą, bo jeśli tak się nie stanie, wszystkie żądania będą anulowane.
Wyboru katalogu użytkownika dokonuje się na podstawie warunku, ponieważ we wzorcu wyszukiwania reguły nie można używać nazwy komputera.
Wzorzec warunku odczytuje pierwszą literę nazwy i na jej podstawie wprowadza dodatkowy podfolder. Opcja taka przydaje się w sytuacji, gdy na serwerze mają być udostępniane katalogi osobiste znacznej liczby użytkowników. Wówczas za pomocą katalogów wirtualnych można rozkładać takie podfoldery na różnych dyskach serwera.
198 CZĘŚĆ I Internet Information Services (IIS) LISTING 7.7. Definicja kanonicznych katalogów użytkowników, która wykorzystuje poddomeny
UWAGA Serwer IIS 7 nie obsługuje jeszcze symboli zastępczych w poddomenach w definicjach powiązań. Transferu katalogów użytkowników opartych na domenach można dokonywać tylko na dwa sposoby: każdą taką domenę należy wstawić do powiązań witryny albo edytowana witryna musi być witryną domyślną, która posiada standardowe powiązanie bez wskazanej nazwy komputera. Jeżeli użyjesz standardowego powiązania, powinieneś też dodać kolejną regułę, która ze względów bezpieczeństwa będzie blokować wszystkie żądania do nieznanych domen głównych.
Zależnie od tego, czy katalogi użytkowników są przekształcane na podstawie składni z tyldą, czy za pomocą poddomen, nieco inaczej zachowywać się będą zmienne $_SERVER używane w programach PHP: Ze znakiem tyldy: http://witrynademophp.site/~daniel/urlinfo.php Nazwa serwera (SERVER_NAME): "witrynademophp.site" Adres URL żądania (REQUEST_URI): "/~daniel/urlinfo.php" Ścieżka URL skryptu (SCRIPT_NAME): "/user/daniel/urlinfo.php" Folder główny (DOCUMENT_ROOT): "C:\inetpub\witrynademophp" Fizyczna ścieżka do skryptu (SCRIPT_FILENAME): "C:\inetpub\user\daniel\urlinfo.php" Z poddomenami: http://daniel.witrynademophp.site/urlinfo.php Nazwa serwera (SERVER_NAME): "daniel.witrynademophp.site" Adres URL żądania (REQUEST_URI): "/urlinfo.php" Ścieżka URL skryptu (SCRIPT_NAME): "/user/d/daniel/urlinfo.php" Folder główny (DOCUMENT_ROOT): "C:\inetpub\witrynademophp" Fizyczna ścieżka do skryptu (SCRIPT_FILENAME): "C:\inetpub\user\d\daniel\urlinfo.php"
W przedstawionym przykładzie foldery użytkowników znajdują się w folderze C:\inetpub\user, a jako domeny użyto witrynademophp.site. Katalog wirtualny /user znajduje się poza głównym folderem witryny.
Zapobieganie osadzaniu grafik na obcych witrynach HTML pozwala osadzać i wyświetlać obiekty graficzne pochodzące z innych źródeł — na przykład z innych serwerów. Możliwość ta może być niezwykle przydatna (na przykład gdy wyświetla się w ten sposób reklamy), jednak trzeba też zauważyć, że wiąże się ona z osadzaniem obiektów graficznych na obcych witrynach bez zgody właściciela tych grafik.
ROZDZIAŁ 7. Ponowne zapisywanie adresów URL 199
Reguła zaprezentowana na listingu 7.8 pozwala zapobiegać takiemu osadzaniu grafik na obcych witrynach. Reguła opiera się na nagłówku HTTP o nazwie Referer. Większość przeglądarek wysyła ten nagłówek, aby pokazać, która strona osadza obiekt graficzny. LISTING 7.8. Definicja reguły, która zapobiega osadzaniu obiektów graficznych na obcych witrynach
Wzorzec wyszukiwania ma postać wyrażenia regularnego, które sprawdza, czy ścieżka URL kończy się sekwencją .jpg, .gif lub .png. Dodatkowo w regule znajdują się dwa warunki, z których jeden musi być spełniony: odwołanie musi pochodzić z własnej witryny lub musi być puste — w przeciwnym razie wykonywana jest akcja, która polega na zablokowaniu żądania z kodem stanu 403. Sprawdzenie, czy odwołanie jest puste, jest konieczne dlatego, że niektóre zapory sieciowe i programy antywirusowe zatrzymują ten nagłówek, aby chronić dane prywatne. Zamiast blokować żądanie, możesz też ponownie zapisać adres URL do standardowego obrazka, który może na przykład zawierać informację, że osadzanie grafik z witryny, której używasz, jest zabronione.
Przekierowywanie do HTTPS Jeżeli chcesz zyskać pewność, że użytkownicy będą korzystać z niektórych sekcji witryny tylko przez szyfrowane połączenie HTTPS, możesz użyć reguły przedstawionej na listingu 7.9. Reguła jest zdefiniowana w katalogu obszar-zabezpieczony. LISTING 7.9. Wymuszanie szyfrowanego połączenia HTTPS
200 CZĘŚĆ I Internet Information Services (IIS)
Dodawanie informacji na każdej stronie Listing 7.10 pokazuje, w jaki sposób do każdej odpowiedzi można dodawać kod HTML, który na przykład wyświetla jakąś informację. Ponieważ informacja taka powinna być wstawiana zawsze tylko jeden raz, w regule ograniczono liczbę dopasowań przez zdefiniowanie ustawienia occurrences="1". LISTING 7.10. Dodawanie informacji na każdej stronie Informacje prezentowane na tej stronie są już dawno nieaktualne.
" />
W identyczny sposób można też dodawać inne fragmenty kodu HTML. Kod taki może na przykład dołączać narzędzia mierzące natężenie ruchu na witrynie. Wówczas odpowiedni kod HTML należy dołączać na końcu elementu body (czyli trzeba porównywać ze wzorcem