xhtml apache מפת האתר דף ראשי

«
«
«
«
«
«
«
«
«
«
«
«
«
«

SSI הרחבות  « SSI  « ראשי

מאמר 9: הרחבות SSI / פנקג' קמת'ן.

9.1 הקדמה

ישנם מקרים שונים בהם רוצים ליצור מסמך עם כמות מינימלית של מידע דינמי, למשל הצגת השעה והתאריך הנוכחיים.
קיימות דרכים רבות לעשות זאת בעזרת אינטראקציות עם השרת. אופציה אחת היא כתיבת CGI script - אך אין צורך בכך. ניתן להשתמש ב - SSI, או הרחבותיה - XSSI.

הערה: כאשר מסומן X) SSI) הכוונה לתכונות התקפות הן ב- SSI והן ב- XSSI .

9.2 תוספות בצד השרת ( SSI )

ה- SSI הראשונים הוצגו בשרת NCSA, שקדם לאפאצ'י. מדובר בפקודות שניתן למקם בתוך מסמכי ה- HTML שלך כדי להריץ תוכניות אחרות או פלטים של נתונים, כגון משתני סביבה ונתונים סטטיסטיים על הקבצים.
לדאבוננו, לא כל השרתים תומכים בפקודות אלו. למשל שרת ה - CERN אינו תומך ב- SSI.

9.2.1 היתרונות לתוספות-שרת

* "אין תפרים" - השימוש בתוספות שרת הוא נעדר כל תפר מבחינת המשתמש. כמו כן, כיוון שהתוספות מתבצעות בצד השרת, הצפיה במסמך המקור אינה חושפת את השימוש בהן.
* קלות ועלות הפיתוח - במקרים רבים, תוספות שרת הן חלופה טובה ל- CGI וזאת משני טעמים:
1. קל יותר לפתח ולתחזק תוספות והדבר דורש פחות זמן.
2. השימוש בתוספות שרת עשוי לצמצם עלויות תחזוקה ופיתוח של הקוד.
* ניהול האתר - יש מידע מגוון שבד"כ כלול במסמכי HTML, אם ע"י הכרח או על-פי סטנדרטים מקובלים, כמו: הודעה על זכויות יוצרים, קישור לשמו ולכתובת ה - e-mail של הכותב וכן שם הארגון. מידע כזה בד"כ חוזר על עצמו ואם מדובר באתר גדול, דרושה עבודה רבה להכניס מידע זה לכל עמוד. כמו כן, כשהמידע משתנה, יש לשנותו בכל עמוד- עבודה רבה ומיותרת, וכן הדבר מגדיל את הסיכויים
לשגיאות.
בעזרת שימוש ב- SSI, ניתן לעשות מטלות אלה אוטומטית, וכן לצמצם את הבעיות הנלוות להן.

9.2.2 עריכת SSI

אפשר להשתמש ב- Emacs with html-helper-mode כדי לערוך HTML וקבצים הכוללים פקודות SSI, אך אין בו תמיכה
ספציפית ל - SSI.

9.2.3 משתני הסביבה של SSI

כל משתני הסביבה הזמינים לתוכניות CGI , זמינים גם לשימוש בפקודות SSI. כמו כן ישנם שישה משתני סביבה נוספים הזמינים
בלעדית לפקודות SSI:

משתנה הסביבהתיאור
DATE_GMT התאריך והזמן הנוכחיים לפי שעון גריניץ
DATE_LOCAL התאריך והזמן הנוכחיים לפי אזור הזמן המקומי
DOCUMENT_NAME שם הקובץ הנוכחי
DOCUMENT_URIנתיב וירטואלי למסמך (יחסית לשורש (root) המסמך)
LAST_MODIFIEDהתאריך והזמן האחרונים בהם שונה המסמך הנוכחי
QUERY_STRING_
UNESCAPED
מחרוזת שאילתא לא מפוענחת עם כל תווי העל של
"\" - תחומים ב shell - ה
9.2.4 פקודות SSI

המסמך מנותח כמו מסמך HTML, כשכל פקודות התוספת משובצות בהערות SGML בתוך המסמך (זאת במקרה שהמסמך ישלח
אי פעם מבלי שיחולק וינותח).
לכל פקודה יש הפורמט הבא:
<!--#command parameter="argument"-->

כל פקודה מקבלת פרמטרים שונים ורובן יכולות לקבל פרמטר אחד בלבד בכל פעם. כל פקודת SSI מתחילה ב- #. כל פרמטר לפקודה, המכונה תג או ארגומנט, מסתיים בסימן = ואז מופיע ערכו. להלן נדון בתחביר ובמשמעות של כל פקודת SSI.

9.2.4.1 פקודת config

פקודה זו מפקחת על היבטים שונים בחלוקת הקובץ ומאפשרת לבחור את שיטת ההצגה של הודעות השגיאה, מידע על גודל
הקובץ, הזמן והתאריך הרלוונטיים.
יש שלושה ארגומנטים תקפים לפעולה זו:
errmsg מפקח על ההודעה שנשלחת חזרה ללקוח אם מתרחשת שגיאה בעת חלוקת וניתוח הקובץ. כששגיאה מתרחשת, היא
נרשמת ב - error log של השרת.
sizefmt קובע את הפורמט להצגת גודל הקובץ, האפשרויות הן: bytes או abbrev עבור גרסה מקוצרת (ב- KB או MB).
timefmt מעניק לשרת פורמט חדש עבור תאריכים. זוהי מחרוזת התואמת לקריאה לספריית strftime ברוב הגרסאות של UNIX.

דוגמאות:
אם נשתמש בפקודת include כדי להוסיף קובץ שאינו קיים, השרת יפיק פלט (ברירת המחדל) של הודעת שגיאה בצורה הבאה:
[an error occurred while processing this directive]
ניתן לשנות הודעה זו בעזרת פקודת config. אם נרצה לשנות את ההודעה לנוסח הבא:
"Error. Please contact einstein@ias.edu", נבצע:
<!--#config errmsg="Error. Please contact einstein@ias.edu."-->

ניתן להגדיר את הפורמט להצגת גודל הקובץ ע"י השרת, בעזרת פקודת fsize.
למשל:
<!--#config sizefmt="abbrev"-->
פקודה זו תגרום לשרת להציג את גודל הקובץ, מעוגל לקילובית (K) הקרוב. כדי להציג את גודל הקובץ בצורת בתים ניתן להשתמש בארגומנט "bytes", בצורה הבאה:
<!--#config sizefmt="bytes"-->

9.2.4.2 פקודת echo

פקודה זו מחזירה את הערך של משתני SSI מיוחדים וכן משתני סביבה אחרים. כל התאריכים הרלוונטיים יודפסו בכפוף לפורמט
הקיים של timefmt. לפקודה זו יש רק פרמטר אחד, var, אשר ערכו הוא שם המשתנה עליו רוצים לבצע echo.

דוגמאות:
<!--#echo var="DOCUMENT_NAME"-->
<!--#echo var="DOCUMENT_URI"-->
<!--#echo var="LAST_MODIFIED"-->

בחלק זה של המסמך, בו מופיע הטקסט הנ"ל, יוצג שם המסמך, ה - URL .(אף שהמשתנה מכונה DOCUMENT_URI)
והתאריך האחרון בו עודכן המסמך.
בדוגמא הבאה, מוצגים שם ה - IP או כתובת השרת, שם המארח (host) המרוחק והזמן המקומי:
<!--#echo var="SERVER_NAME"-->
<!--#echo var="REMOTE_HOST"-->
<!--#echo var="DATE_LOCAL"-->

9.2.4.3 פקודת include

פקודה זו משבצת טקסט של מסמך לתוך מסמך מנותח. כל קובץ שהתווסף כפוף לבקרת הגישה הרגילה. פקודה זו ממלאת את אותה הפונקציה ב- HTML כפי שהיא עושה בשפות כגון C או ++C, דהיינו, היא תורמת למודולריות ולתחזוקת הקוד ע"י קביעת כל הפריטים שאמורים להופיע כמעט בכל עמוד, בקבוצה קטנה של קבצים והכללת הפנייה לקובץ המתאים, במקום לחזור על תוכן הקובץ בכל עמוד.

לפקודה זו יש שני ארגומנטים תקפים:
1. file - ארגומנט זה משמש להוספת קובץ שנמצא באותה ספרייה כמו המסמך. הוא מגדיר את שם הנתיב יחסית לספריה הנוכחית.
אמנם קל להשתמש בו אך הוא מחייב זהירות יתרה. אסור להשתמש בשמות נתיב כגן "/.." או נתיבים אבסולוטיים.
אפשר לשלוח מסמכים מנותחים אחרים, אך אי אפשר לשלוח CGI scripts.
2.vitrual - ארגומנט זה משמש לתת גישה לנתיב וירטואלי למסמך על השרת. אם הארגומנט לא מתחיל ב - "/" אזי מתייחסים אליו
יחסית למסמך הנוכחי.
ניתן לגשת למסמך רגיל או למסמך מנותח אחר באמצעות ארגומנט זה, אך לא ניתן לגשת ל - CGI script בצורה זו.

דוגמא:
<!--#include file="foo.txt"-->
<!--#include virtual="/path_to/foo.txt"-->

9.2.4.4 פקודת exec

פקודות exec מריצות תוכניות חיצוניות ומכניסות את הפלט לתוך המסמך הנוכחי.
חייבים להפעיל את הפקודה כדי להשתמש בה. יש לפקודה שני ארגומנטים תקפים:
1 .cmd - ארגומנט זה משמש להריץ פקודה באמצעות /bin/sh. כל המשתנים הנתונים להלן מוגדרים וניתן להשתמש בהם בפקודה.
אם משתמשים במשתני סביבה כחלק מארגומנט, יש לשים לפניהם סימן "$". הסיבה לכך היא שהשרת יוצר תהליך מעטפת
(shell) כדי להריץ את הפקודה, וכך ניגשים למשתני הסביבה אם מתכנתים ב - shell.

2 .cgi - ארגומנט זה משמש להריץ CGI script ולהוסיף את הפלט שלו. השרת מחפש את הקובץ אשר שמו מפורט בנתיב הוירטואלי לספריית CGI נתונה (cgi-bin). אם התוצאה של ה - script היא תג מיקום, השרת ייצור קישור אליו. אחרת, תוצאת ה - script תשובץ
אל תוך קובץ ה - HTML. השרת לא מבצע בדיקת שגיאות לוודא שה- script פלט טקסט בלבד, אך השרת כן יפרש כל
URL LOCATION: header ויהפוך אותו לעוגן HTML.
לכן, חשוב לציין שתוכנית CGI אשר הופעלה ע"י פקודת SSI חייבת להפיק פלט טקסט בלבד כי נתונים אלה משובצים בתוך
מסמך HTML או מסמך רגיל שהפעיל את הפקודה.
כתוצאה מכך, לא משנה אם נפיק פלט מסוג text/plain או text/html, כיוון שהדפדפן יפרש את הנתונים בתוך הטווח של המסמך הקורא.

דוגמאות:
בדוגמא הבאה, נשתמש בפקודת UNIX finger כדי לאחזר מידע אודות המשתמש:
<!--#exec cmd="/path_to/finger $REMOTE_USER@$REMOTE_HOST"-->
יש לתחום את הפלט מפקודה חיצונית בתוך גוש של <PRE> . . . </PRE> כדי לשמור על רווחים לבנים, ואז, אם קיים קוד
HTML בתוך פלט הנתונים של התוכנית החיצונית, הדפדפן יפרש אותו.

הדוגמא הבאה מראה מונה הסופר כניסות משתמשים בעזרת שימוש בפקודת cmd exec. יש ליצור קובץ בשם counter.txt ולבצע את הפעולות הבאות:
$echo "0" > path_to/counter.txt
$chmod 777 path_to/counter.txt
הוסף ל- HTML שלך:
<!--#exec cmd="path_to/perl -pi -e
      '$_++' path_to/counter.txt;cat path_to/counter.txt"-->

יש להגדיר את הקונפיגורציה של פקודת ה- path_to - Perl וקובץ המונה בדוגמא לעיל, ע"מ שיתאים למערכת.
יש לכך שתי הגבלות:
1. קובץ נתוני המונה (counter.txt) חייב להתקיים יחד עם הרשאות קריאה וכתיבה מתאימות.
2. אין זה נועל את קובץ counter.txt, מה שחיוני כדי לטפל בגישות בו זמניות לעמוד.

9.2.4.5 פקודת fsize

פקודה זו מכניסה גודל של קובץ מצוין (יחסית ל שורש המסמך בשרת) בבתים. הארגומנטים (התקפים) זהים לארגומנטים בפקודת include.
ניתן לפרמט את גודל הקובץ באמצעות הפרמטר sizefmt בפקודת config.
דוגמאות:
<!--#fsize file="foo.txt"-->>
<!--#fsize virtual="/path_to/foo.txt"-->>
<!--#config sizefmt="bytes"-->

9.2.4.6 פקודת flastmod

פקודה זו מכניסה את תאריך וזמן העדכון האחרון של קובץ. ארגומנטים תקפים זהים לארגומנטים של פקודת include.
ניתן לפרמט את הזמן בעזרת הפרמטר timefmt בפקודת config.
ההבדל בין משתנה הסביבה ב- SSI בשם LAST_MODIFIED לבין פקודה זו הוא ש - flastmod מאפשרת לבחור כל קובץ שהוא
ואילו LAST_MODIFIED מציג מידע המתייחס לקובץ הנוכחי.
דוגמא:
<!--#flastmod file="foo.txt"-->
<!--#flastmod virtual="/path_to/foo.txt"-->

9.2.5 קונפיגורציה

דרושים שלושה מאפיינים כדי שעיבוד באמצעות SSI יעבוד:
1. אילו ספריות מאפשרות שימוש ב - SSI.
2. האם מותר לבצע exec מספריות אלה.
3. איזו סיומת קבצים אומרת לשרת לבצע חלוקה וניתוח לקובץ.

עתה נדון באלה בהרחבה, תוך התייחסות לשרת המבוסס על UNIX כגון אפאצ'י (או NCSA). לאחר מכן נדון בקצרה ב - SSI בשרתים המבוססים על חלונות או מקינטוש.

9.2.5.1 ספריות: האם להוסיף include או לא?

קודם כל, כדי ש - SSI יפעלו, יש לדאוג שהשרת יוכל לקבל תוספות אלו. ראשית יש להחליט באילו ספריות ניתן יהיה לאפשר את התוספות. ניתן לקבוע שהאתר כולו יקבל תוספות או רק ספריות מסוימות. כמו כן ניתן לעצב את האתר כך שיאפשר תוספות אך לא יאפשר שימוש ב - exec. לבסוף, ניתן להפעיל את התוספות ביחס לכל הקבצים או רק קבצים בעלי סיומת מיוחדת (בדר"כ shtml).
בגלל בעיות בטיחות אפשריות, יש לנקוט משנה זהירות בקבלת החלטות אלו. עדיף לא לכלול שימוש ב - exec בספריות שאינן בטוחות
מספיק.

9.2.5.2 שם הקובץ

כעת, יש להורות לשרת מהי סיומת שם הקובץ בה משתמשים לקבצים המחולקים והמנותחים. קבצים אלה אומנם דומים ל - HTML, אך ההתייחסות אליהם שונה. בתוך השרת, השרת משתמש בסוג MIME : text/x-server-parsed-html כדי לזהות מסמכים מנותחים, ואז מבצע המרות כדי להפוך קבצים אלה ל - HTML עבור הלקוח.

זה נעשה על פי המידע בקבצי הקונפיגורציה של השרת. בשרת אפאצ'י, קובץ זה הוא srm.conf. קבצי קונפיגורציה דומים מצויים
בשרתים אחרים. כדי להורות לשרת מהי הסיומת בה מעונינים להשתמש לקבצים מנותחים, יש להשתמש בפקודת AddType.
למשל, השורה הבאה תחייב את השרת לבצע חלוקה וניתוח על כל הקבצים המסתיימים
ב- shtml. :

AddType text/x-server-parsed-html .shtml
נקודה שחשוב לציין כאן היא שלא ניתן לכלול פקודות SSI בתוך תוכנית ה- CGI כי השרת אינו מחלק ומנתח פלט של תוכנית.

9.2.5.3 סוגי פקודות SSI

יש לקבוע שתי אופציות לקונפיגורציה בקובץ הגדרת הגישה (access.conf), והן מכתיבות אילו פקודות SSI יכולות להיכנס
לתוך קובץ ה - HTML:
1. על מנת לשבץ פקודות SSI אשר יציגו את משתני הסביבה ונתונים אודות הקבצים בתוך מסמכי ה - HTML , יש להפעיל מאפיין
המכונה includes.
2. כדי לאפשר הרצת תוכניות חיצוניות מתוך מסמכי ה - HTML, יש להפעיל את מאפיין ה - exec.
כדי להפעיל את שתי התכונות הנ"ל ניתן לכתוב:
Options Includes ExecCGI
גם כאן, לפני הפעלת התכונות הללו, יש לשקול היטב את נושא הבטיחות והביצועים.

כדי לקבוע את הקונפיגורציה של SSI לכל ספרייה בנפרד, יש להכניס את אותה פקודה בקובץ htaccess. בספריה בה רוצים לאפשר SSI.

9.2.5.4 SSI מקוננים

כיום אפאצ'י מעוצב כך שכל הקבצים בעלי סיומת shtml., אפילו קבצים עם SSI, יעברו חלוקה וניתוח ע"י השרת וייבדקו פקודות
SSI. אם רוצים להוסיף גושי קוד HTML אשר יכללו בתוכם פקודות SSI אחרות - יש לתת לקבצים אלה סיומת shtml.

9.2.5.5 SSI בשרתים המבוססים על חלונות או מקינטוש

הרבה שרתי אינטרנט מבוססי חלונות תומכים ב- SSI. למשל: Microsoft IIS ושרת
ה - Netscape's FastTrack ל - Windows NT 4.0. אך, לא כולם תומכים בפקודת exec והם פועלים באופן השונה מאופן פעולתו
של שרת המבוסס על UNIX. בשרת IIS של Microsoft, שמות הקבצים לחלוקה וניתוח ע"י השרת חייבים לשאת סיומת של stm. רק כאשר מריצים את ה - script ב- DOS ניתן לקשר סיומת pl. של Perl script ל - perl.exe. יתרה מזו, כדי להריץ את perl.exe
בדפדפן ברשת, צריך להגדיר את הקשר ביניהם ב - Nt registry.

WebSTAR הוא שרת אינטרנט פופולארי המבוסס על מקינטוש והוא תומך ב- SSI באמצעות "server plug-ins".

9.2.6 יישומי SSI

לתוספות אלה מגוון יישומים. הם מאפשרות למשתמשים ליצור מסמכים שמספקים מידע הנוצר באופן דינמי. מידע כזה עשוי להיות
התאריך הנוכחי, תאריך העדכון האחרון של הקובץ והגודל או תאריך עדכון אחרון של קבצים אחרים. בשימושים מתקדמים יותר, מהוות התוספות ממשק רב עוצמה ל - CGI scripts ותוכניות bin/sh/ , ואלה יכולים לספק מוני גישה פשוטים או כותרות מתחלפות.

9.2.6.1 תבניות מסמך ו - Boilerplates

מבקרים באתר בד"כ מחפשים את התוכן המעודכן ביותר. אם הם רואים עמוד מיושן שאינו מעודכן, הם עלולים להתעלם ממנו, או אם נתקלים בעמוד ללא תאריך, הם עלולים לחשוב שהוא מיושן. לכן כדאי להוסיף למסמכים תאריך עדכון אחרון.
יישום שימושי של SSI הוא הכנסה אוטומטית של תאריך העדכון האחרון של המסמך שנתבקש.
זה נעשה ע"י הכנסת
<!--#echo var="LAST_MODIFIED"-->
לתוך המסמך, כדי שתאריך העדכון האחרון יופיע.
פקודה זו מחקה פורמט של שדה כותרת עליונה של HTTP. כאשר מסתכלים על המידע הנוגע לעדכון האחרון, פירוט השניות בזמן
אינו כ"כ משמעותי. ניתן לשנות את הפורמט הזה ע"י הוספת:
<!--#config timefmt="time-format"-->
לפני הכנסת תאריך העדכון האחרון.


time-format היא מחרוזת שמתאימה לפונקציה הקוראת לספרייה (3)Strftime ברוב הגרסאות של UNIX. מחרוזת זו כוללת פקודות המתחילות בסימן % וכן תווים אחרים. למשל:
<!--#config timefmt="%A, %B %d, %Y"-->
דוגמא זו תוצג בצורה הבאה: Friday, May 9, 1999.
בדוגמא זו, במקום A% יופיע היום בשבוע, במקום B% יופיע שם החודש; d% הוא היום בחודש, Y% יוחלף בשנה. במערכות הפעלה אחרות צורות אלו יכולות להופיע קצת אחרת.
כמו כן, ניתן להכניס את תאריך העדכון האחרון של מסמכים אחרים. למשל בדוגמא הבאה:
<!--#flastmod virtual="/path_to/foo.html"-->
אפשרות זו תהיה שימושית במקרה של אינדקס או תוכן עניינים אשר מציג את רשימת המסמכים הזמינים וגם את תאריך העדכון האחרון שלהם:
<HTML>
<HEAD>
<TITLE>Table of Contents</TITLE>
</HEAD>
<H1>Table of Contents</H1>
We have the following information for you:
<UL>
  <LI>Document 1 (Last Modified : <PRE><!--#flastmod virtual="/path_to/1.html"--></PRE>)
  <LI>Document 2 (Last Modified : <PRE><!--#flastmod virtual="/path_to/2.html"--></PRE>)
.
.
.
</UL>
.
.
.
<PRE>
<!--#echo var="LAST_MODIFIED"-->
</PRE>
</BODY>
</HTML>

יישום נוסף של SSI הוא להעניק זהות ועקביות לאתר. את זאת אפשר לעשות ע"י יצירת תבניות למסמכים והכללת מידע החוזר על עצמו במסמכים באופן דינמי.

דוגמאות:

מידע על כותרת עליונה - הכותרת העליונה יכולה להכיל תג <BODY> כדי לשמור על עקביות הצבעים ברקע, הצבעים לטקסט והצבעים לקישורים. כמו כן, ניתן להוסיף כפתורי ניווט בחלקו העליון (או התחתון) של כל עמוד באתר. אופציה נוספת היא לכלול CSS
( גליונות סגנון מדורגים).
מידע על הכותרת התחתונה - ניתן להוסיף מידע כגון זכויות יוצרים, תאריך עדכון אחרון, שם הכותב וכתובת ה - e-mail שלו,
קישור לעמוד הבית של האתר וכו' - בתחתיתו של כל עמוד ועמוד.

למען היעילות, עדיף לשמור את כל המידע החוזר בתוך קובץ. אפשר לתת לקבצים שיתווספו סיומת שונה מ- html (למשל incl) , כיוון שקבצים אלה כוללים סימונים של HTML אבל הם לא עמודים מלאים בזכות עצמם.
ע"י שימוש בסיומות שונות כמפתח לתוכן הקבצים, יהיה קל יותר לעקוב אחריהם.

ועתה, באמצעות פקודת ה- include של SSI, עם הפרמטר virtual (אשר יאפשר לנו להכניס את הקבצים עם המידע שברצוננו להוסיף בכל מקום שהוא באתר), נוכל ליצור את התבנית (המינימלית) הרצויה:
<HTML>
<HEAD>
<TITLE>Template</TITLE>
</HEAD>
<PRE>
<!--#include virtual="header.incl"-->
</PRE>
<H1>Template</H1>
.
.
.
<PRE>
<!--#include virtual="footer.incl"-->
</PRE>
</BODY>
</HTML>

9.2.6.2 מונה לספירת כניסות משתמשים

תוספות שרת מאוד שימושיות במקרה שרוצים להוסיף מידע "דמוי-CGI" וכן פלט מתוכניות CGI אל תוך מסמכים ברשת. באמצעות תוספות שרת עם פקודת cgi exec, ניתן לשבץ את התוצאות של CGI script שלם אל תוך מסמך HTML סטטי. נדגים זאת באמצעות דוגמא של מונה לספירת כניסות משתמשים.
בדוגמא הבאה נתבונן ב - CGI script פשוט (counter.cgi) בשרת אשר עוקב אחרי מספר הכניסות של מבקרים לאתר.

#!/path_to/perl -w
print "Content-type: text/plain", "\n\n";
$counter_file = "path_to/counter.txt";
open(FILE, ">>$counter_file");
close(FILE);
chmod(0777,"counter.txt");
open (FILE, "<" . $counter_file) || die "Can not read from the counter file.\n";
flock (FILE, 2);
$number_accesses = <FILE>;
flock (FILE, 8);
close (FILE);
open (FILE, ">" . $counter_file) || die "Can not write to the counter file.\n";
flock (FILE, 2);
$number_accesses++;
print FILE $number_accesses;
flock (FILE, 8);
close (FILE);
print $number_accesses;
exit (0);
כמו כן ישנו גם ישנו קובץ counter.txt המאותחל ל - 0. יש להגדיר תחילה את הקונפיגורציה של ה - path_to של ה - Perl
וקובץ המונה המתואר לעיל במערכת. לאחר מכן אפשר לקרוא למונה ה - scriptבאמצעות פקודת execcgi במסמך HTML בשם: foo.shtml
בצורה הבאה:
This page has been accessed <!--#exec cgi="/cgi-bin/counter.cgi"--> times.

התהליך שמתרחש הוא כדלקמן: כל פעם שמשתמש נכנס למסמך foo.shtml, פקודת
ה - SSI בו קוראת ל - script counter.cgi, אשר קורא את הערך המספרי המאוחסן בקובץ נתוני המונה counter.txt, מגדיל אותו
ב - 1 , כותב את הערך החדש חזרה לקובץ ומציג אותו כפלט.

יש לציין שהמונה בדוגמא לעיל הוא לצורך הדגמה בלבד. כיוון שהוא אינו מנצל טכניקות מכוונות-עצמים של Perl, ניתן להעבירו על פני גרסאות שונות של Perl אבל הוא עלול לסבול מחסרונות, לדוגמא חולשה בניידות על פני פלטפורמות, וזאת בגלל השימוש בפונקציית flock. למשל הוא אינו נתמך בגרסה האחרונה לחלונות 95
(Perl עבור Win32 Build 316). קיימים פתרונות חלופיים אפשריים:

1. אם משתמשים באפאצ'י אפשר לנצל מודולי מונה קיימים (ניתן לבדוק ב - module registry) או להוסיף מודול שמתאים לצרכים הנדרשים. פתרון זה הוא בדר"כ יעיל יותר משימוש בתוספות שרת.
2. קיימים שירותים ציבוריים רבים, חלקם בחינם (לשימוש לא מסחרי ומוגבל במספר הכניסות ביום - כגון NedStat) אשר עשויים
להעניק חלוקה וניתוח מקיף לעמודים הרשומים אצלם.
3. אין טעם לשים מונה בכל עמוד. כדי לקבל תוצאות מקיפות יותר ובעלות משמעות, ניתן להשתמש באחת מהתוכניות הסטטיסטיות הרבות (כגון Analog, בעל יציאות ל - UNIX, מקינטוש וחלונות) כדי לנתח קבצי log של השרת, אם קיימת ההרשאה הדרושה לכך.

9.2.7 ניפוי שגיאות (Debugging) ב-SSI

כאשר משתמשים בתוספות שרת, יש לזכור מספר דברים.
קודם כל, לא לשכוח את סימן ה - # ולא להשאיר רווחים בין סימן ה - "-" לבין ה - "#".

<!--echo var="REMOTE_USER"-->
<!-- #echo var="REMOTE_USER"-->

אם מבצעים אחת משתי שגיאות אלו, השרת לא יודיע על שגיאה אלא יתייחס לכל הביטוי כהערת HTML.
הערות תחביר שיש להתייחס אליהן:

* לא להשאיר רווחים בין סימן ה - "=" לבין הקובץ שהוא מציין. ביצוע שגיאה מסוג זה יגרור הודעת שגיאה.
* לא לשכוח להשתמש במרכאות כפולות מסביב לארגומנטים.
* כל שמות הפרמטרים והפקודות חייבים להיות באותיות קטנות.
* בערכי הארגומנטים מותר להשתמש באותיות גדולות וקטנות אך יש לזכור ש - UNIX רגיש להבדל בין אותיות גדולות וקטנות והוא מחשיב אותם כשתי ישויות שונות.
* כל קובץ שמוסיפים (included) כפוף לבקרת הרשאות הגישה הרגילות.
* אם משתמשים בשם domain, יש להשתמש בפרמטר virtual.
* תהליך עיבוד ה- SSI מתבצע כך: נניח שאפשרו לשרת לקבל תוספות שרת בכל קובץ אשר שמו מסתיים ב - shtml. בכל פעם
שהשרת רואה בקשת GET מלקוח, הוא בודק האם הקובץ המבוקש מסתיים ב - shtml. אם כן, השרת בודק אם בקובץ נמצאים
תוספות (SSI), בגלל הסיומת. כשהשרת מאתר פקודות, הוא מעבד אותם ומחזיר את המסמך השלם, כשסוג התוכן מוגדר כ- text/html. אם קבצי הקונפיגורציה אינם מוגדרים נכון, תהליך זה ייכשל.

 

9.3 הרחבה לתוספות שרת (eXtended Server-Side Includes - XSSI)

XSSI הם חלק משרת האפאצ'י (גרסה 1.2 ומעלה), והם הרחבה של תוספות השרת של NCSA. אפאצ'י מכיל מודול
של mod_include ,XSSI, אשר מגדיר קבוצת פקודות למטרה זו.

9.3.1 יתרונות XSSI

בנוסף ליתרונות (שהזכרנו לעיל) של תוספות שרת, יש כמה יתרונות ספציפיים ל - XSSI וביניהם:
* ישנן אפליקציות שאפשר לבצע כיום בעזרת XSSI אשר עד עכשיו היו אפשריים רק בעזרת שפות כגון JavaScript. אך להבדיל
מ - Java Script (שאפשר "לכבות" אותה), XSSI אינו תלוי ביכולות של הדפדפן.
* להבדיל מ - CGI scripts, XSSI הם מאוד "זולים" לשרת. פקודות אלה מגבירות את הביצועים כי הם מאפשרות להוסיף מודולים
של מידע בשרת, אשר מצמצמים את מספר החיבורים הדרושים כדי ליצור עמוד. פירוש הדבר הוא שאם מריצים אלמנטים בעמוד
בעזרת תוספת, הלקוח מקבל את המידע בבקשה אחת ולא במספר בקשות (מה שהיה קורה בשימוש בקריאת CGI).

9.3.2 עריכת XSSI

חבילת XSSI של WebMonkey מרחיבה את עורך ה- HTML Macromedia Dreamweaver 2.0, כך שניתן להשתמש
ב - XSSI בתוך העורך.

הקבצים מהווים ממשק גרפי להכנסת פקודות XSSI ולעריכת שינויים בהם. בנוסף, ניתן להגדיר משתני סביבה המאפשרים לראות
כיצד ייראה העמוד בתנאים שונים (למשל, בדפדפנים שונים). לאחר התקנת החבילה, ניתן להוסיף פקודות XSSI, מתוך קטגוריית
XSSI בפלטת הצבעים של האובייקטים הצפים של Dreamweaver.

9.3.2.1 המודול mod_include באפאצ'י

מודול זה נמצא בקובץ mod_include.c ומקומפל בברירת מחדל. ניתן להיעזר ברכיבי בקרת זרימה של XSSI כדי להגדיר פקודות המבוססות על משתני הסביבה של המשתמש. כמה פקודות, מעבר להגדרות המקוריות של NCSA, הוצגו באפאצ'י 1.2, במיוחד
פקודות חדשות לבקרת הזרימה. בחלק זה נדון רק במושגי XSSI אשר מהווים שינוי או תוספת ל - SSI.
מושגים אשר קיימים גם ב - XSSI וגם ב - SSI יזכו רק לאזכור.

9.3.3 משתני סביבה של XSSI

משתני הסביבה של XSSI הם כמו משתני הסביבה של SSI.

9.3.4 פקודות XSSI

לפקודות אלו יש הפורמט הבא:
<!--#command parameter=argument ... -->
הארגומנט לרוב תחום במרכאות כפולות. פקודות רבות אינן מאפשרות יותר מזוג אחד של פרמטר-ארגומנט. כמו כן, יש רווח לבן
לפני סימן סיום ההערה (<--).
תוספות XSSI כוללות את כל הפקודות של SSI, השינויים/התוספות הם כדלקמן:

9.3.4.1 פקודת include

פקודה זו בעלת הפרמטר virtual הורחבה ועתה כוללת גם exec. לכן אפשר להשתמש
ב -
<!--#include virtual="/cgi-bin/bar/foo.cgi"-->
ניתן אפילו להוסיף מחרוזת שאילתא ל - CGI script בצורה הבאה:
<!--#include virtual="/cgi-bin/bar/foo.cgi?query_string"-->
מומלץ להשתמש באלמנט ה - include virtual במקום exec cgi.

9.3.4.2 פקודת Printenv

פקודה זו מדפיסה רשימה של כל משתני הסביבה הקיימים וערכיהם. פקודה זו מתבצעת ללא פרמטרים. לדוגמא:
<!--#printenv -->
הפלט ייראה כך:
HTTP_USER_AGENT = Mozilla/4.0 [en] (Win95; I)
החלק הראשון (באותיות הגדולות) הוא שם המשתנה. החלק השני (אחרי הסימן ה - "=") הוא ערכו.

9.3.4.3 פקודת set
פקודה זו קובעת את ערכו של משתנה.
הפרמטרים הם var, שם המשתנה שיש לקבוע את ערכו, ו - value, הערך של המשתנה.

<!--#set var="some_variable" value="its_value" -->

לדוגמא, נניח כי קיים מסמך בשם foo.shtml שיש לו:

<!--#set var="size" value="$QUERY_STRING" -->
<FONT face="Verdana" size="<!--#echo var="size"
-->"><!--#echo var="QUERY_STRING" -->Text</FONT>

(יש לשים לב ש - QUERY_STRING הוא משתנה סביבה של CGI אשר זמין ל - XSSI).
אם ניגש ל - foo.shtml בצורה:
http://some_domain/path_to/foo.shtml?+n

כאשר 1,2,3=n והלאה, ניתן יהיה לראות שגודל "Text" משתנה (אם הדפדפן תומך בתג <font>). באופן דומה ניתן לשנות את
מאפייניו האחרים של "Text" , למשל את הפונט face.

9.3.4.4 פקודות if, elif, else, endif

פקודות בקרת הזרימה מאפשרות למסמכים להציג בצורה שונה, תלוי במשתנה.

<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->

פקודת if פועלת כהוראת if בשפת תכנות. בודקים את תנאי המבחן (test condition) ואם הוא נכון (true), אזי הטקסט המופיע עד לפקודת elif, else או endif ייכלל בתזרים הפלט. אם תנאי המבחן המקורי אינו נכון (false), פקודות ה - elif או else מכניסות את הטקסט לפלט. פקודות אלה הן אופציונליות. פקודת endif מסיימת את פקודת ה- if.

אפאצ'י מעריך את תנאי המבחן ואם הוא נכון, מתבצע הקוד המופיע אחריו (אם יש הוראות XSSI אחריו) או מודפס
(אם text/html מופיע אחריו). כל אפשרויות תנאי המבחן מופיעות בטבלה הבאה:

תנאי המבחןערך אמת תיאור
stringtrueאם המחרוזת לא ריקה
string1 = string2
string1 != string2
string1 < string2
string1 > string2
string1 <= string2
string1 >= string2
trueהשוואת string1 עם string2
אם string2 היא מהצורה /string
אז היא מושווה כביטוי רגיל (שיש לו
אותו תחביר כמו התחביר בפקודת
egrep ב - UNIX
test_conditiontrueאם תנאי המבחן (test_condition) נכון (true)
!test_conditiontrueאם תנאי המבחן (test_condition) לא נכון (false)
test_condition1
test_condition2 &&
trueאם תנאי מבחן 1 (test_condition1) וגם תנאי
מבחן 2 (test_condition2) נכונים (true)
test_condition1
test_condition2 ||
trueאם תנאי מבחן 1 (test_condition1) או תנאי
מבחן 2 (test_condition2) נכונים (true)
"=" ו- "=!" קודמים ל - "&&" ו- "||".
ל - "!" יש את הקדימות הגבוהה ביותר.
מאוחר יותר נראה יישום שימושי של פקודות לבקרת זרימה בעזרת כמה מתנאי המבחן המופיעים בטבלה זו.

9.3.4.5 החלפת משתנים

ב- XSSI, ניגשים אל המשתנה בשמו או עם סמן $ לפניו (בהקשרים בהם לא ברור אם הוא משתנה או לא). החלפת משתנים
תתבצע בתוך מחרוזות התחומות במרכאות, ברוב המקרים בהם הן עשויות להופיע כארגומנט לפרמטר של פקודת XSSI.
אלה כוללים את הפקודות: echo, config, exec, flastmod, fsize, include, set ופקודות לבקרת זרימה.

ניתן להגדיר משתנים בשתי צורות שונות: ניתן להגדיר משתנים לבד בעזרת פקודת set, או ניתן להשתמש באחד המשתנים המוגדרים אוטומטית לכל דפדפן כשהוא מבקש עמוד (כדי לראות רשימת משתנים כאלה לדפדפן מסוים, יש להשתמש בפקודה
<--printenv #--!>).
אפשר להוסיף סמן $ אל תוך המחרוזת כשלפניו יבוא / . למשל:
<!--#if expr="$x = \$test" -->

דוגמא:
דוגמא זו מדגימה החלפת משתנים בפקודות לבקרת זרימה.
יודפס "in A" אם ה - DOCUMENT_URI הוא foo/file.html/.
יודפס "in B", אם ה - DOCUMENT_URI הוא bar/file.html/ .
אחרת, ידפיס "B או A in neither".
<!--#if expr="\"$DOCUMENT_URI\" = \"/foo/file.html\"" -->
in A
<!--#elif expr="\"$DOCUMENT_URI\" = \"/bar/file.html\"" -->
in B
<!--#else -->
in neither A or B
<!--#endif -->

9.3.5 קונפיגורצית XSSI

אם נותנים למסמכים המכילים פקודות XSSI את הסיומת shtml., הפקודות הבאות יגרמו לאפאצ'י לבצע בהם חלוקה וניתוח ולייחס למסמך שנוצר סוג MIME של text/html :
AddType text/html .shtml
AddHandler server-parsed .shtml
כשיש ספריות הכוללות קבצי shtml. (בדר"כ בקטע ), יש לתת את הפקודה הבאה (פקודה זו תקפה גם בקבצי htaccess.
אם נקבעה AllowOverride Options):
Options +Includes

9.3.5.1 פקודת XbitHack

ישנם מקרים בהם רוצים להשתמש ב - XSSI אבל לא להחליף את שמות העמודים מ - html.* ל - shtml.*. פקודת XBitHack
באפאצ'י מבצעת זאת. הפקודה משפיעה רק על קבצים הקשורים לסוג MIME text/html. כל שצריך לעשות כדי שהשרת יחלק
וינתח את העמוד הוא להפעיל את ביט ה - user-execute. כדי לעשות זאת, יש להוסיף את השורה הבאה
לקובץ ה - htaccess. -
XBitHack On

כל קובץ אשר מופעל בו ביט זה, יזכה לטפול כמו מסמך html המנותח ע"י השרת. כך, אם נקבע את הרשאות הקובץ המתאימות (באמצעות chmod 744 ב - UNIX) השרת יחלק את העמוד. (משיקולי אבטחה, אין לתת הרשאות אלה לקבצים אחרים אשר לא
יחולקו). בעיה פוטנציאלית בשיטה זו היא העובדה שקובץ זה באמת יהפוך להיות מוכן להרצה. אם בטעות מריצים אותו משורת
הפקודות, עם כל תווי ">" ו - "<", עלולים להרוס את האתר כולו.

9.3.6 אפליקציות XSSI

XSSI מרחיבים את מגוון האפליקציות האפשריות בעזרת SSI. חלקן, כמו למשל להציג דפים ספציפיים שונים למבקרים באתר
המגיעים ממקומות שונים, (בהתבסס על סוג הדפדפן או על התאריך והשעה ביום) התאפשרו קודם רק בעזרת שפות כגון
JavaScript.
להלן דוגמא של אפליקציה כזו.

9.3.6.1 שירות המציג עמודים שונים למבקרים ממקומות שונים

בעזרת פקודות בקרת הזרימה של XSSI, ניתן להציג עמודים שונים, לפי ה - domain של המשתמש. למשל, אם רוצים להציג עמודים ספציפיים כשמבקרים באים משלושה מקומות שונים, ועמוד זהה לכל המבקרים שבאים מכל מקור אחר:
עמוד הכולל פרטי השכלה יוצג למבקר מבריטניה;
עמוד הכולל פרטי השכלה ונסיון מקצועי יוצג לנציג ממשלת קנדה;
עמוד הכולל נסיון מקצועי לנציג מאוניברסיטה באוסטרליה;
עמוד כללי משותף לכל המבקרים האחרים.

קודם כל צריך לפתח שלושה מסמכים שונים, למשל edu.incl, prof.incl, gen.incl, בהם יכללו מידע כללי, פרטי השכלה ונסיון מקצועי, בהתאמה. יש לשמור אותם באותה ספריה יחד עם עמוד ה - index.shtml אשר יכלול את כל התוספות. בעמוד ה - shtml.index , יש ליצור את הכותרת (title), ומרכיבי התצוגה (צבעים, פורמט). כשמישהו מבקש לגשת לעמוד זה, השרת יבצע חלוקה וניתוח, ואז העמוד המותאם אישית לאותו מבקר יוצג לו מבלי שידע על כך.

בעזרת XSSI, ניתן להתאים אישית את ה - index.shtml, על פי ה - domain של המבקר: סיומת של uk. למבקר מבריטניה; gc.ac למבקר מממשלת קנדה; edu.ac למבקר מאוניברסיטה באוסטרליה. ניתן להיעזר במשתנה REMOTE_HOST כדי לבדוק את שם
ה - domain. כעת, ניתן לכלול את השורות הבאות ב - index.shtml :

<!--#if expr="\"$REMOTE_HOST\" = /.*uk/" -->
  <p><!--#include virtual="edu.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*gc.ca/" -->
  <p><!--#include virtual="edu.incl" -->
  <p><!--#include virtual="prof.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*edu.au/" -->
  <p><!--#include virtual="prof.incl" -->
<!--#else -->
  <p><!--#include virtual="gen.incl" -->
<!--#endif -->

אין צורך לכתוב את השורות המורחקות מהשוליים - כאן מופיעות שורות אלו רק כדי להקל על הקריאה. ניתן לשנות את הדוגמא לעיל בקלות ולהתאימה לצרכי המשתמש. למשל, אם רוצים להציג את המסמכים רק בינואר עבור מבקרים מבריטניה; בכל החודשים מלבד
יולי עבור מבקרים מממשלת קנדה; ללא כל הגבלת זמן למבקרים מאוניברסיטה באוסטרליה או למשתמש בשם Einstein, וללא כל הגבלת זמן בכל מקום אחר, ניתן לבצע את הדוגמא הבאה:

<!--#config timefmt="%B" -->
<!--#if expr="$DATE_GMT = /January$/ && \"$REMOTE_HOST\" = /.*uk/" -->
  <p><!--#include virtual="edu.incl" -->
<!--#elif expr="$DATE_GMT != /July$/ && \"$REMOTE_HOST\" = /.*gc.ca/" -->
  <p><!--#include virtual="edu.incl" -->
  <p><!--#include virtual="prof.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*edu.au/ || \"$REMOTE_USER\" = /einstein/" -->
  <p><!--#include virtual="prof.incl" -->
<!--#else -->
  <p><!--#include virtual="gen.incl" -->
<!--#endif -->

9.3.7 ניפוי שגיאות ( Debugging ) ב-XSSI

מעבר לנושאים שהוזכרו בקשר ל - SSI, יש להתחשב בשיקולים נוספים:
* הסימן המסיים הערות (<--) בפקודת XSSI בא אחרי רווח לבן.
* אם מוסיפים את הטקסט הבא:

<PRE>
<!--#printenv -->
</PRE>
למסמך, הוא ידפיס את משתני הסביבה וערכיהם, בהתאמה. כך ניתן לראות את רשימת המשתנים המלאה כדי שיהיה ניתן לבדוק
האם XSSI נקבע עבור משתנה שאינו תקף.

9.3.8 המעבר ל - X)SSI)

נניח וקיימים קבצי HTML בהם נרצה להשתמש ב - SSI.
במקרה כזה, הפיכת קבצי html.* אלו לקבצי shtml.* הופכת להיות מטלה אדירה.
בעזרת Perl script, אפשר לעשות זאת בקלות, בצורה הבאה:
יש להעתיק (תוך שמירה על זכויות היוצרים) את ה - script הבא לקובץ, ולכנות אותו rename ואז יש לשנות את הנתיב ל - usr/bin/perl )Perl/!#):

#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
  $was = $_;
  eval $op;
  die $@ if $@;
  rename($was,$_) unless $was eq $_;
}

ב - prompt של ה- shell (בפלטפורמות של UNIX, בפלטפורמות אחרות, יש להשתמש בגרסה של find), יש להקליד את הטקסט
הבא, כששם הספריה (directory_name) מציין את הספריה ברמה הגבוהה ביותר (עם ספריות משנה במקום שבו מצויים
קבצי html.*):
find ./directory_name -name '*html' -print | rename 's/html/shtml/'

9.3.9 חסרונות

XSSI יכולים להיות מאד שימושיים אך בעלי חסרונות רבים:

1. ביצועים - באופן כללי, ביצוע חלוקה וניתוח שוטפת של הקבצים לפני שליחתם ללקוח מהווה מעמסה על השרת. בדומה ל - SSI,
ניתן לקבוע את הקונפיגורציה כך שהשרת יחלק וינתח את כל מסמכי ה - HTML (בין אם יש בהם או אין בהם פקודות SSI). אך
פעולות אלה פוגעות מאוד בביצועי השרת כיוון שהוא צריך לחלק את כל מסמכי ה - HTML . כמו כן, השימוש בפקודת exec עלול
להיות לא יעיל, לפעמים.
2. אבטחה - השימוש בפקודות exec יוצר סיכון בטחוני פוטנציאלי. הסיכון הוא מתן אישור למשתמשים בעלי יכולת ממוצעת לשמש
כשרת. משתמשים טירונים עלולים לשבץ פקודות להרצת פקודות מערכת שמציגות מידע חסוי. ניתן להשתמש בפקודה זו גם כדי
לתקוף אבטחה של אתר.
לדוגמא, נניח שקיים scriptשל יומן מבקרים, המאפשר למבקרים להכניס קוד HTML כחלק מההערות שלהם. נניח כי ה-script
מאפשר SSI בשרת. אם ה - script לא יסנן את פקודות ה - SSI מהקלט, אזי הקלדת:
<--#exec cmd="/bin/rm -fr /"-->
ב - form field (אזור במסמך HTML הכולל אפשרויות לקליטת קלט מהמשתמש) עלולה להוות בעיה חמורה. בדומה לכך, הקצאה רשלנית של הרשאות קובץ, בעת שימוש בפקודת XBitHack, עלולה להוביל לבעיות שונות. יש לקחת פרטים אלה בחשבון לפני הרצת XSSI על השרת. למרות חסרונות אלה, X)SSI) עשוי להיות כלי רב עוצמה אם משתמשים בו בזהירות.

9.3.10 המסקנה

בעתיד הקרוב כולנו נכתוב כך.
X)SSI) מהווים חלופה שימושית ל - CGI ובמקרים מסוימים גם ל - JavaScript, בביצוע מטלות שגרתיות. יש בהם יתרונות שונים, אם משתמשים בהם בזהירות ובתבונה, במיוחד לניהול אתרים בקנה מידה גדול.