htaccess למי שלא יודע, הוא קובץ קטן שנמצא בשרתי Apache. htaccess מסייע לנו בהפניית המשתמש בתוך האתר. ישנם המון שימושים ל-htaccess: מבחינת SEO, הוא ישמש אותנו להאחדת כתובות ומניעת שכפול כתובת. הפניית 301 וכמובן clean URL. מבחינת System, אנו יכולים להשתמש ב-htaccess על מנת למנוע גישה לקבצים/תיקיות מסוימות, או לבצע בדיקות על המשתמש לפני שנותנים לו לגשת למשאב מסוים.
על מנת לשלוט היטב ב-htaccess, אנו חייבים להכיר היטב ביטויים רגולריים. לא מכירים? הנה מאמר מצויין שמלמד את הביטויים הרגולריים תוך חמש עשרה דקות.
אפשר להשתמש ב-htaccess בכל שפה שהיא, כל עוד היא רצה על Apache. אני כן מצפה ממי שקורא את המדריך הזה להכיר מעט את הסביבה שבה הוא עובד. כאשר עדיף שהסביבה הזו תהיה מבוססת לינוקס. קל מאד ליצור סביבת עבודה מבוססת לינוקס שתהיה תואמת לשרת שאליו אתם מעלים את האתר/אפליקציה שלכם.
מבנה ה-htaccess
על מנת ש-htaccess יפעל, אנו ניצור קובץ בשם htaccess. ונמקם אותו בתיקיה שלנו שנמצאת על שרת מבוסס לינוקס. נכתוב שם מעט ג'יבריש וננסה להכנס לתיקיה עם הדפדפן. אנו מקבלים תקלה 500? אם כן, מעולה! במידה ולא – תבדקו למה ה-htaccess שלכם לא עובד.
htaccess, לפחות במה שקשור להפניות, קשור ל-mod_rewrite, ולפיכך כל ההפניות יופיעו בתוך תנאי שבודק את mod_rewrite:
<ifmodule mod_rewrite.c>
RewriteEngine on
</ifmodule>
הפניה מורכבת בדרך כלל משני חלקים. תנאי אחד (או יותר) שאם הוא מתמלא אז ההפניה מתבצעת. החלק השני הוא ההפנייה. אנו לא חייבים לכתוב תנאים ויכולים לבצע את ההפניות.
הפניה פשוטה
הפניות מחולקות למספר חלקים. החלק הראשון מורכב מהצהרה של ההפניה – כותבים RewriteRule.
החלק השני הוא מאיפה לעשות את ההפניה. כאן משתמשים בביטוי רגולרי.
החלק השלישי הוא לאן לעשות את ההפניה, ניתן לכתוב כאן url.
החלק הרביעי [בסוגריים מרובעות] הם פרמטרים שונים בנוגע להפניה.
אדגים את זה עם דוגמא פשוטה. נניח שיש לי אתר בשם mysite.com. באתר החביב הזה אני רוצה לבצע הפניה מתיקית sp לתיקית es. איך אעשה זאת? כך:
RewriteRule ^sp$ http://www.mysite.com/es [R=301,L]
בואו וננתח את מה שהולך פה. ראשית יש לי את RewriteRule וזה מנדטורי. אחרי כן יש לי ביטוי רגולרי שמציין את תיקית sp שימו לב לסימני ההתחלה והסוף של הביטוי הרגולרי! זה אומר שהביטוי תופס ל-mysite.com/sp אבל לא ל: /mysite.com/sp או ל: mysite.com/whatever/sp/
החלק השלישי הוא ההפניה בפועל, כאן יכול להופיע url מלא (עדיף) או יחסי.
החלק הרביעי הוא פרמטרים. R=301 הוא קוד ה-http שניתן למי שמנסה להכנס. במקרה שלנו 301 זו הפניה קבועה. L מציינת שמדובר ב-RewriteRule סופי שאחריו יש לבצע את ההפניה ולא לעבד חוקים נוספים.
לא לשכוח שגם אם שמנו L, ברגע שבוצע RewriteRule מוצלח, ברגע הטעינה של הדף החדש יתחיל מחדש עיבוד של ה-htaccess.
הפניה עם שימוש בפרמטרים
הכל טוב ויפה, באמצעות השימוש בכלל שלעיל, כל מי שינסה להכנס ל-mysite.com/sp יופנה אחר כבוד ל-mysite.com/es אבל מה יקרה למי שינסה להכנס ל-mysite.com/sp/whatever ? הוא לא יופנה כמובן, כיוון שלפי הכלל שלנו אנחנו מקבלים רק את מי שמנסה להכנס ל-mysite.com/sp. נכון שאני יכול להוסיף בביטוי הרגולרי משהו כזה:
RewriteRule ^sp/.*$ http://www.mysite.com/es [R=301,L]
אבל למרבה הצער אם אני מנסה להכנס ל http://www.mysite.com/sp/whatever הוא יפנה אותי ל-mysite.com/es ולא לmysite.com/es/whatever. אני צריך פרמטר שבו אוכל להשתמש בחלק שבו אני מציין לאן אנו רוצים שהמשתמש יופנה. זה קל אם אנו משתמשים בתת תבנית. כל תת תבנית שאנו משתמשים בה הופכת אוטומטית למשתנה שאנו יכולים להשתמש בו בחלק ההפניה. למשל בדוגמא שלנו:
RewriteRule ^sp/(.*)$ http://www.mysite.com/es/\ [R=301,L]
$1 הוא המשתנה שלנו, אנו משתמשים בתת תבנית שכוללת את כל מה שבא אחרי ה-/sp מה שיש בתוך תת התבנית הזו נכנס אוטומטית למשתנה $1. אפשר להשתמש בכמה משתנים בהתאם למספר התת תבניות שאנו השתמשנו בהם:
RewriteRule ^sp/(.*)/(.*)$ http://www.mysite.com/es/\/\ [R=301,L]
זה למשל יגרום לכל מי שנכנס ל: mysite.com/sp/moshe/shalom לעבור אל: mysite.com/es/shalom/moshe.
תנאים
תנאים מסייעים לנו אם בכלל לקיים את ההפנייה. כך למשל, אני יכול להחליט שעבור URL מסויים אין צורך לבצע הפניה. דוגמא מעולה לצורך בתנאי הוא ב-RewriteRule שמוסיף סלאש בסוף הכתובת – כך ש: http://www.mysite.com יופנה ל-/http://www.mysite.com. אנו לא רוצים שמי שנכנס ל: /http://www.mysite.com יקבל עוד איזה סלאש בסוף. לפיכך יש לנו תנאי.
תנאי מורכב משלושה חלקים:
1. RewriteCond – משפט מנדטורי שמסמן לנו שמדובר בתנאי.
2. המשתנה שעליו אנו מבצעים את התנאי. יכול (להיות כתובת: %{REQUEST_URI} (הוא בדרך כלל כתובת). אך יכול להיות גם כתובת מלאה: %{HTTP_HOST} או משתנים נוספים.
3. ביטוי רגולרי שאם הוא מתקיים התנאי מתקיים.
4. פרמטר.
הנה למשל תנאי:
RewriteCond %{REQUEST_URI} !(.*)/$ [NC]
התנאי הזה בודק את ה-REQUEST_URI – כלומר החלק שמגיע מיד אחרי ה-www.mysite.com. האם אין לו סלאש בסופו? אם אין לו, אז התנאי יתקיים ונוכל לעבור ל-RewriteRule:
RewriteCond %{REQUEST_URI} !(.*)/$ [NC]
RewriteRule ^(.*)$ http://www.mysite.com/\/ [L,R=301]
הפרמטר NC בעצם מבקש שלא להתחשב באותיות רשיות (Capital letters).
אפשר להשתמש בפרמטר אחד או בכמה פרמטרים שכולם צריכים להתקיים. כך למשל:
RewriteCond %{REQUEST_URI} !(.*)/$ [NC]
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*)$ http://www.mysite.com/\/ [L,R=301]
כאשר התנאי השני יתקיים כאשר אין index.php ב-URL אשר אותו אנו מבקשים.
כמובן שיש עוד הרבה מאד מה ללמוד בנוגע ל-htaccess, וצריך עוד להתאמן במה שהראיתי כאן – אבל זה הבסיס. והרבה פעמים לא צריך דבר מעבר לבסיס הזה. לימוד יסודי של htaccess מאפשר שליטה טובה יותר באפליקציה שלכם ונותן לכל מפתח כלי רב עוצמה.
2 תגובות
יש בעיית כיווניות בשורה הראשונה: בשרתי APACHE. htaccess מסייע
חסר לי הסבר איך ניגשים אל הקובץ, באיזו תיקייה הוא
קובץ .htaccess נמצא בד"כ בשורש, כלומר בתקייה הראשית של הפרוייקט. אבל הוא יכול להימצא בכל תקייה אחרת.