Czy jesteś udręczonym, przepracowanym webmasterem, który właśnie stanął przed zadaniem dokonania tych samych zmian na kilku tysiącach stron jednej witryny? Zadanie to może być znacznie prostsze dzięki wykorzystaniu Server Side Includes czyli SSI.
o autorach
Michał Paluchowski CEO, właściciel i redaktor vortalu NetHut.pl. Jego ulubionym tygodnikiem jest Wprost, a na co dzień z przyjemnością czyta Gazetę Wyborczą. Jest zakochany w muzyce i komputerach, czasem nieco ekscentryczny. Zawsze otwarty na nowe znajomości.
Łącznie napisał dla nas 45 artykułów.tych samych autorów
- IMAP w stylu PHP [MP]
- Własne RSS [MP]
- Rodzina XSL [MP]
- Wprowadzenie do XML [MP]
- Rozszerzenia XSSI [MP]
zobacz również
Czym są SSI?
SSI działają na większości, ale nie wszystkich serwerach. Po raz pierwszy pojawiły się na serwerze NCSA. Dalszego ich rozwoju dokonano w serwerze Apache, który obsługuje eXtended SSI. Niestety nie działają na serwerach CERN. Nie działają także na większości darmowych kont.
Polecenie lub dyrektywa SSI jest umieszczana w zwykłym pliku HTML wewnątrz linii komentarza. Tuż przed wysłaniem strony do przeglądarki internauty wszystkie polecenia są zamieniane przez serwer na odpowiednie dane. Dzięki nim można szybko zmienić wygląd wielu stron, wstawić aktualną datę, czas, wywołać skrypt CGI i nie tylko.
Uruchamianie SSI
Jeżeli posiadasz konto na innym serwerze skieruj pytania o dostępność SSI do swojego administratora. On też będzie mógł uruchomić SSI.
Jeżeli natomiast sam administrujesz serwerem, musisz zmienić kilka danych w jego pliku konfiguracyjnym. Znajdź w nim sekcję z poleceniami AddType i sprzed linii
#AddType text/x-server-parsed-html .shtml
usuń znak #. Ewentualnie dopisz powyższą linię.
Najczęściej pliki zawierające polecenia SSI maja rozszerzenie .shtml ale możesz też użyć rozszerzeń .html. Wystarczy dopisać to rozszerzenie do linii powyżej.
Składnia SSI
Ogólny wzór poleceń SSI wygląda tak:
<!--#dyrektywa parametr="wartość" -->
Piękne, prawda? Ale po kolei. Dyrektywa to polecenie dla serwera aby wykonał odpowiednie zadanie. Parametr określa na jakim elemencie ma to zadanie być wykonane. Wartość jest rezultatem jaki chcesz osiągnąć.
Ważne jest też umiejscowienie spacji. Pomiędzy znakami <!--# oraz dyrektywą nie może być żadnych spacji. Szczególnie dotyczy to znaków - i #, ponieważ jeżeli je oddzielisz serwer potraktuje linię jako zwykły komentarz i nie zrobi nic. Ważne jest też aby w ciągu znaków parametru i wartości nie było przerw. Natomiast zaraz po nim wstawiamy spację i znak zakończenia -->.
Dyrektyw i parametrów jest naprawdę niewiele. Oto one:
| Dyrektywy | Parametry |
|---|---|
| config | errmsg, timefmt, sizefmt |
| include | virtual, file |
| echo | var |
| fsize | file |
| flastmod | file |
| exec | cmd, cgi |
Dyrektywa ta zmienia domyślne zachowanie SSI.
errmsg
Ustawia inny niż domyślny komunikat o błędzie. Najlepiej umieścić go na samej górze dokumentu.
Przykład:
<!--#config errmsg="Znowu błąd SSI. Napisz do administratora root@serwer.pl" -->
timefmt
Określa format w jakim przedstawiana będzie data i czas. Musi być umieszczone przed dyrektywą echo. Przykład:
<!--#config timefmt="%A, %B %d, %Y" -->
<!--#echo var="LAST_MODIFIED" -->
wyświetli
Wednesday, April 12, 2000 (niestety po angielsku)
Symboli pozwalających dostosować format czasu jest sporo, więc proponuję wydrukować sobie ich listę.
sizefmt
Określa format w jakim podawana jest wielkość pliku. Użyj "bytes" dla bajtów i "abbrev" dla kilobajtów oraz megabajtów. Musi występować przed dyrektywą fsize. Przykład:
<!--#config sizefmt="abbrev" -->
<!--#fsize file="download.zip" -->
Include
To zdecydowanie najbardziej pożyteczna i najczęściej wykorzystywana dyrektywa SSI. Pozwala wstawić zawartość jednego pliku do drugiego. Jest to szczególnie przydatne gdy na wielu stronach znajdują się te same elementy (np. nagłówek czy menu) i trzeba je zmienić na inne. Wystarczy zapisać całe menu jako osobny plik a w pozostałych wstawić dyrektywy SSI.
Parametry są tylko dwa, ale ważne jest abyś użył właściwego.
virtual
Podaje wirtualną ścieżkę do dokumentu na serwerze.
<!--#include virtual="/includes/naglowek1.html" -->
Najlepiej stworzyć osobny katalog z plikami do wstawiania w inne strony. Należy pamiętać, że wstawiona zostanie cała zawartość pliku źródłowego, więc umieść w nim dokładnie to co chcesz mieć na stronie docelowej.
Na przykład możesz stworzyć stopkę dla każdej strony, gdzie będzie informacja o prawach autorskich i Twój adres e-mail. Może wyglądać tak:
<p>Wszystkie prawa zastrzeżone.</p>
<p>Kontakt <a href="mailto:adres@email.pl">Autor strony</a></p>
Zapisz to jako stopka.html i we wszystkich dokumentach w odpowiednim miejscu (prawdopodobnie na dole strony) umieść dyrektywę include wskazującą na ten plik.
file
Podaje ścieżkę w obecnym katalogu. Nie można przejść do poprzedniego ani przez użycie ../ ani ścieżek bezwzględnych.
<!--#include file="naglowek1.html" -->
Używając tego parametru musiałbyś mieć plik nagłówka w każdym katalogu, co nie poprawiłoby sytuacji uaktualnień. Może to być jednak przydatne jeżeli chcesz wstawić plik tylko na jednej stronie.
Wyświetla zmienne środowiskowe.
DOCUMENT_NAME
Wyświetla nazwę pliku aktywnego dokumentu.
<!--#echo var="DOCUMENT_NAME" -->
wyświetli
index.html
DOCUMENT_URI
Wyświetla wirtualną ścieżkę dokumentu.
<!--#echo var="DOCUMENT_URI" -->
wyświetli
/katalog/katalog2/plik.html
Aby wyświetlić adres z domeną, umieść ją przed dyrektywą:
http://www.domena.pl<!--#echo var="DOCUMENT_URI" -->
DATE_LOCAL
Pokazuje datę i czas, ustawione na serwerze.
<!--#echo var="DATE_LOCAL" -->
wyświetla
Saturday, 14-Oct-2000 12:54:06 EET
Domyślnie wyświetla to w dosyć nieciekawym formacie, ale można to łatwo zmienić stosując dyrektywę config w sposób opisany nieco wyżej.
DATE_GMT
Działa tak samo jak DATE_LOCAL ale wyświetla czas Greenwich (GMT = Greenwich Mean Time).
LAST_MODIFIED
Wyświetla datę kiedy dokument został ostatnio zmodyfikowany.
<!--#echo var="LAST_MODIFIED" -->
SERVER_SOFTWARE
Nazwa i wersja oprogramowania serwera
<!--#echo var="SERVER_SOFTWARE" -->
SERVER_NAME
Nazwa serwera, aliasu DNS lub adres IP
<!--#echo var="SERVER_NAME" -->
GATEWAY_INTERFACE
Zmiany specyfikacji CGI, którą stosuje dany serwer
<!--#echo var="GATEWAY_INTERFACE" -->
SERVER_PROTOCOL
Nazwa i zmiany protokołu informacji, z którym przyszło to zapytanie, np. HTTP/1.0
<!--#echo var="SERVER_PROTOCOL" -->
SERVER_PORT
Port, pod którym serwer odpowiada
<!--#echo var="SERVER_PORT" -->
REQUEST_METHOD
Sposób zapytania dla obecnego dokumentu. Dla HTTP jest to GET, HEAD i POST.
<!--#echo var="REQUEST_METHOD" -->
PATH_INFO
Skrypty mogą być dostępne przez ich wirtualną ścieżkę, (bazującą na katalogu głównym), na końcu której klient może podać dodatkowe informacje.
<!--#echo var="PATH_INFO" -->
PATH_TRANSLATED
Podaje te same informacje co zmienna wyżej, ale zamienia je z lokalizacji wirtualnej na fizyczną.
<!--#echo var="PATH_TRANSLATED" -->
SCRIPT_NAMEWitrualna ścieżka do aktualnie wykonywanego skryptu.
<!--#echo var="SCRIPT_NAME" -->
QUERY_STRING
To jest tekst z końca adresu internetowego, po znaku ?, np.:
http://www.serwer.pl/katalog/plik.html?tekst_query_string<!--#echo var="QUERY_STRING" -->
Wygląda to całkiem nieĄle, ale gdzie zastosowanie praktyczne? Podam jeden przykład, niezbyt użyteczny, ale na początek musi wystarczyć.
Na jednej stronie ustaw odnośnik do pliku color.html w ten sposób:
<a href="color.html?green">color</a>
Teraz stwórz plik color.html wstawiając w niego poniższy kod. Dyrektywy wstawiaj do pliku color.html a nie tego, w którym masz odnośnik.
<!--#set var="color" value="QUERY_STRING" --><font size=" 2" face="Verdana, Tahoma" color=
"<!--#echo var="color" -->">
<!--#echo var="QUERY_STRING" --></font>
Gdy teraz wywołasz plik color.html przez odnośnik na innej stronie zobaczysz słowo "green" w kolorze zielonym. Gdybyś wywołał ten plik bez żadnych parametrów nie zobaczyłbyś nic. Zawartością tej strony jest jedno słowo występujące po znaku zapytania w adresie. Gdyby adres był <a href="color.html?blue"> zobaczyłbyś słowo "blue" w kolorze niebieskim.
REMOTE_HOST
Nazwa komputera klienta wysyłającego zapytanie.
<!--#echo var="REMOTE_HOST" -->
REMOTE_ADDR
Adres IP klienta wysyłającego zapytanie.
<!--#echo var="REMOTE_ADDR" -->
AUTH_TYPE
Metoda sprawdzania tożsamości wykorzystana do rozpoznania użytkownika
<!--#echo var="AUTH_TYPE" -->
REMOTE_USER
Jeżeli strona jest chroniona, to jest to nazwa użytkownika, który się zalogował.
<!--#echo var="REMOTE_USER" -->
REMOTE_IDENT
Dla serwerów, które obsługują metodę autoryzacji RFC 931 ta zmienna zwraca nazwę użytkownika klienta, wysłaną z serwera. Użycie tej zmiennej powinno być ograniczone tylko do logowania.
<!--#echo var="REMOTE_IDENT" -->
CONTENT_TYPE
To jest typ zawartości danych dla zapytań, które mają dołączone informacje takie jak HTTP POST i PUT.
<!--#echo var="CONTENT_TYPE" -->
CONTENT_LENGTH
Długość dołączonych informacji, podana przez klienta.
<!--#echo var="CONTENT_LENGTH" -->
HTTP_ACCEPT
Lista typów MIME, które przyjmie klient.
<!--#echo var="HTTP_ACCEPT" -->
HTTP_USER_AGENT
Oprogramowanie przeglądarki, której używa klient. Zwraca dane w formacie software/wersja biblioteka/wersja, np. MS Internet Explorer/5.50.4134.0600
<!--#echo var="HTTP_USER_AGENT" -->
HTTP_REFERER
URL dokumentu, który zawierał odnośnik do tej strony.
<!--#echo var="HTTP_REFERER" -->
OK, tyle tego wystarczy bo sam zanudzę się na śmierć. Dobrze jednak mieć całą listę by w odpowiednim momencie móc znaleĄć potrzebna zmienną. Czas na dalsze dyrektywy.
Fsize wyświetla rozmiar określonego pliku. Format w jakim rozmiar zostanie wyświetlony może być określony przez użycie dyrektywy config w połączeniu z parametrem sizefmt. Fsize jest podobny do polecenia include ponieważ przyjmuje zarówno parametr file jak i virtual. Pamiętaj, virtual pozwala wyświetlić rozmiar pliku umieszczonego gdziekolwiek na serwerze, nie tylko tego nad którym obecnie pracujesz.
<!--#fsize file="index_temporary.html" -->
flastmod
Flastmod wyświetla datę kiedy określony plik został ostatnio zmodyfikowany. Format w jakim data zostanie wyświetlona może być określony przez użycie dyrektywy config w połączeniu z parametrem timefmt. Fsize jest podobny do polecenia include ponieważ przyjmuje zarówno parametr file jak i virtual. Pamiętaj, virtual pozwala wyświetlić datę pliku umieszczonego gdziekolwiek na serwerze, nie tylko tego nad którym obecnie pracujesz.
<!--#config timefmt="%A, %d %B, roku %Y" -->
<!--#flastmod file="file.html" -->
Oto pozyteczny trick, który pozwoli wyświetlić daty ostatnich modyfikacji plików ze spisu treści. Po prostu dodaj poniższą linię z odpowiednią ścieżką po każdym odnośniku.
<!--#config timefmt=" %B %d, %Y" -->
<a href="/katalog/plik.html">Plik</a>
<!--#flastmod virtual="/katalog/plik.html" --><br>
<a href="/inny_katalog/inny_plik.html">Inny Plik</a>
<!--#flastmod virtual="/inny_katalog/inny_plik.html" -->
Co wyświetli:
Plik April 19, 2000
Inny Plik January 08, 2000
Wygląda to na mnóstwo pracy przy dwóch odnośnikach ale pomnóż odnośniki razy dwadzieścia i pomyśl, że wszystkie są modyfikowane regularnie, i trzeba zmieniać daty. Łatwo więc zorientować się jak wykorzystanie flastmod ułatwia życie.
exec
To polecenie wykonuje skrypt CGI lub polecenia shella. Musi zostać uruchomione aby być wykorzystywane. Dostępne parametry to:
cmd wykona polecenie shella wykorzystując /bin/sh.
cgi wykonuje skrypt CGI. Poniższe polecenie umieści w tym miejscu licznik na stronie, przyjmując, że counter.pl to skrypt licznika znajdujący się w katalogu cgi-bin.
<!--#exec cgi="/cgi-bin/counter.pl" -->
To właściwie wszystko jeśli chodzi o podstawową wersję SSI. Jednakże eXtended SSI Apache'a to zupełnie nowy świat, czekający na odkrycie. Oto kilka miejsc, gdzie można go znaleĄć.
Apache Week - Using Server Side Includes
W3C - Server Side Include commands
Apache: The Definitive Guide Chapter 10: Server Side Includes
Webmonkey - The Fundamentals of XSSI
Webmonkey - Using XSSI Variables
Webmonkey - Backend Apache/XSSI