htaccess ומוד rewrite
mod_rewrite
mod_rewrite זו הרחבה לשרת ה-Apache כאשר המוד מופעל הוא גורם לכך ששהשרת ידע לנתח כתובות מסויימות שמוגדרות לו בקובץ htaccess שזה קובץ ללא שם עם סיומת htaccess. לא ניתן ליצור קובץ כזה דרך מערכת ההפעלה. יש לפתוח עורך טקסט ולבחור באפשרות "Save as" עם שם ריק וסיומת.htacces
ולהפנות את הגולש לעמוד אחר כאשר בעצם הכל קורה מאחרי הקלעים
לדוגמא גולש נכנס לכתובת
http://support.netjos.com/test
ובעצם הכתובת האמיתית של השרת לפני ההפניה היתה זו
http://support.netjos.com/test
הדבר גורם ל SEO טוב יותר ויש עוד כמה שימושים נוספים שעליהם נדון בהמשך.
במערכת וורדפרס השינוי מתבצע בהגדרות מבנה קישורים.
דוגמא לכלל בקובץ .htaccess
RewriteEngine On RewriteRule wp-login_security wp-login.php RewriteRule contact_us index.php?p=3
השורה הראשונה מפעילה את מנוע שִכתוב הכתובות.
כל פקודה מתחילה מהמילה RewriteRule – "כלל שכתוב", כאשר הכתובת שהשרת מצפה לקבל מופרדת ברווח מהכתובת שהשרת יבצע
בדוגמא הראשונה כל מי שיכנס לשרת ויכתוב
wp-login_security זה יהיה כיאילו הוא כתב wp-login.php הדוגמא הזאת למשל טובה כדי להחביא login אם כי צריך גם לבטל את האפשרות של הכניסה מה login
בדוגמא השניה אנחנו רואים פשוט כתובת מקוצרת ונוחה יותר
המוד מבוסס על ביטויים רגולריים. כדאי לחזור כדי לשלוט בו היטב.
דגלים.
השימוש בדגלים נעשה ע"י הוספת סוגריים מרובעים [] בסוף שורת הפקודה.
NC – no case
דגל מוכר וידוע משפות אחרות. הוספה שלו גורמת שלא יהיה הבדל בין אותיות קטנות לאותיות גדולות.
למשל Netjos יהיה זהה ל netjos
דוגמא:
RewriteRule page/([a-z0-9_]+) page.php?id=$1 [NC]
הכלל אומר שכאשר אנחנו נכנס לכתובת page/2 אזי אנחנו ננותב כיאילו נכנסנו לכתובת page.php?id=1 הוספת הדגל גורמת לזה שגם נוכל לכתובת Page באותיות גדולות וזה יפרש את זה אותו דבר.
QSA – Query String Append
הדגל QSA דואג לשמר את הפרמטרים בכתובת (http://support.netjos.com/exp?post=43&operation=edit) , מכיוון שהם עשויים להיעלם הי השרת כביכול מעביר בקשה חדשה.
RewriteRule exp index.php?page=exp [QSA]
כשנגלוש אל
http://example/exp?post=43&operation=edit
הפרמטרים יישמרו, והבקשה תועבר אל
http://example/index.php?page=exp&post=43&operation=edit.
L – Last
לכתובת http://example.com/abcmus יכולים להתאים כמה תנאים במקביל.
RewriteRule a index.php?action=a
RewriteRule ab index.php?action=ab
RewriteRule abc index.php?action=abc
abcmus מתאימה לכל שלושת התנאים. השרת יעבור תנאי אחר תנאי ויבדוק אותם. התנאי האחרון שיתאים לו – הוא זה שישתמש בו. כלומר, abcmus יפנה אל action=abc.
על מנת למנוע מהשרת להמשיך את הבדיקה ברגע שתנאי מסוים תואם, ולא להמשיך בכל זאת לעבור תנאי אחר תנאי – נשתמש בדגל Last. כלומר, אם התנאי התאים – תנצל אותו ואל תבדוק תנאים אחרים.
RewriteRule a index.php?action=a [L]
RewriteRule ab index.php?action=ab [L]
RewriteRule abc index.php?action=abc [L]
ברגע שתנאי a התאים, לא תתבצע בדיקה של שאר התנאים, והשרת יעשה את הפעולה שלו.
לחבר דגלים
לחבר מספר דגלים עבור אותו תנאי אפשר באמצעות פסיקים.
ברוב המקרים כל התנאים שלכם יכילו בדיוק את שלושת הדגלים האלו באופן הבא:
500 Server Error
העתקתם את הדוגמה וקיבלתם שגיאת 500? הסיבה לכך היא שהרחבת ה-mod_rewrite כבויה.
בתפריט ה-Wamp מצאו תחת apache modules את mod_rewrite, סמנו לידו v והפעילו את השרת מחדש.
לבעלי שרתים משלהם – מצאו בקובץ httpd.conf את mod_rewrite והורידו את הנקודה-פסיק לפני ה-load_module. אחרי הפעלה מחודשת של השרת הכול יעבוד.
קבצים קיימים
ברוב המקרים, אם יש בקשה לקובץ קיים – style.css, למשל – אנחנו רוצים שהשרת פשוט יבצע את הבקשה בלי להתחיל לעבור את כל התנאים. שלושת השורות הבאות מצילות את המצב:
RewriteCond %{REQUEST_FILENAME} –f [OR]
RewriteCond %{REQUEST_FILENAME} –d
RewriteRule .* – [L]
(L) – אם הכתובת מובילה לקובץ קיים או שהיא שם של תיקיה קיימת, אזי לבצע את הבקשה הנוכחית כפי שהיא ולא להמשיך לעבור על תנאים אחרים.
את התנאי הזה יש לשים כתנאי הראשון מבין כל התנאים, כדי שהשרת יבדוק אותו קודם כול, ורק אם הוא לא מתאים (אם הבקשה היא לא לקובץ או לתיקייה מסוימים) – רק אז שימשיך הלאה.
קישורים בעברית
הדפדפנים והרשת כרגע לא יודעים להתמודד טוב מדי עם אותיות לא אנגליות בתוך הקישורים. כדי להקל עליהם – יש להשתמש בפונקציה urlencode על תוכן הקישורים כדי שהסימנים המוזרים והטקסט בעברית יקודדו באופן מסוים ויעברו ברשת בשלמותם. השרת ידאג לפענח את הקישורים חזרה לעברית תקינה. ראו דוגמה.
זהו זה, אתם מוכנים ליצור כתובות קצרות, יפות, שונות ומשונות כפי שבא לכם וכפי שהאתר הזה עושה.
ותתחילו מלהוריד את ה-www. 😉
עדיף להשים את כל הקוד תחת
<IfModule mod_rewrite.c> THE CODE </IfModule>
ובמידה והשרת לא תומך ב-mod_rewrite והמודול לא מותקן – לא מקבלים שגיאות 500.
דוגמא:
<IfModule mod_rewrite.c>
# If the file exists - proccess the file, if not proccess other rules
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^alex$ index.php?act=alex [L,NC,QSA]
RewriteRule ^John$ index.php?nhoj=tca [L,NC,QSA]
</IfModule>