יום ראשון, 17 באוגוסט 2008

mod_rewrite

אחת האפשרויות המעניינות בשרתים מסוג apache (אני לא יודע מאיזה גרסה בדיוק, אבל רוב השרתים כבר תומכים בזה)
היא mod_rewrite.
אני לא מכיר ולא מתיימר להכיר את כל הדברים שניתן לעשות עם זה, אבל אחד הדברים המעניינים הוא שינוי הכתובת למשהו אחר. למה הכוונה? לדוגמה:
יש לי נניח אתר שצריך להציג פרטים אודות מוצרים, העמוד מקבל בכתובת את הקטגוריה, שם הפריט ושם החנות (כדי לראות אם המוצר קיים במלאי...) אז זה יכול להיות כתובת כזו:
www.mystore.com/index.php?do=show_product&store=store_name&cat=cat_name&product=product_name
כמו שאתם וודאי שמים לב, זה לא נוח לקריאה, לא נוח לשימוש - וסוד קטן, זה גם לא נוח למנוע החיפוש..
מנועי חיפוש אוהבים אתרים סטטיים (יעני אתרים לא משתנים - html) על פני אתרים דינאמיים (אתרים משתנים... php, asp, asp.net).
אז למה שלא נהפוך את הכתובת לידידותית למשתמש ולמנוע החיפוש? מה אם אני אגיד לכם שניתן לעשות כתובת כזו במקום:
www.mystore.com/products/store_name/cat_name/product_name.html
אתם בטח שואלים איך... אז זה איך:
יש אפשרות לקבוע כללים. למשל:
אם תופיע הכתובת הזו:
www.mystore.com/products/x/y/z.html
תעביר את הנתונים x, y וz לכתובת:
www.mystore.com/index.php?do=show_product&store=x&cat=y&product=z
יפה מאוד, עכשיו איך עושים את זה?
ניצור קובץ .htaccess חדש. ראשית נדאג לכך שלא תוצג שגיאה, ושהקוד יתבצע רק אם השרת תומך בmod_rewrite.
<IfModule mod_rewrite.c>
</IfModule>
עכשיו נפעיל את מנוע הrewrite
RewriteEngine On
עכשיו נוסיף את ה"חוק" הזה... הסבר קצר.
אם אני ארצה למשל, שכל פעם שיכנסו לכתובת "index.html" זה יכנס למשל לכתובת "index.php"
אני אכתוב
RewriteRule ^/?index\.html$ index.php [L]
לטובת כל מי שלא מבין בזה, אלה ביטויים רגולריים.. הסימן ^ מסמל תחילת מחרוזת, הסימן $ מסמל סוף מחרוזת.
עשיתי \. בגלל שלסימן "." יש משמעות - כל תו שהוא. אז \. מבטל את ההשפעה שלו.

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

RewriteRule ^/?products/(.*)/(.*)/(.*)\.html$ index.php?do=show_product&store=$1&cat=$2&product=$3 [L]

ולסיום, הקוד שלנו צריך להראות ככה:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^/?products/(.*)/(.*)/(.*)\.html$ index.php?do=show_product&

store=$1&cat=$2&product=$3 [L]


</IfModule>


אלה דברים שיותר קל ללמוד מהקודים עצמם מאשר מהסברים לדעתי.

הקוד לא נוסה, אז אולי יש בו שגיאות. אם אתם מוצאים שגיאה שלחו תגובה ואני אתקן.
אני ממליץ לקרוא עוד על הנושא הזה, אין הרבה מידע בעברית אבל יש עוד הרבה דברים שניתן לעשות עם זה.


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

אני מצטער אם זה קצת מתבלגן עם הימין ושמאל.. זה מה יש :)

עד הפעם הבאה, להתראות.

אין תגובות: