htaccess למי שלא יודע, הוא קובץ קטן וחביב שמשמש אותנו בשרתי Apache לשליטה על URLים. אין כמעט מערכת היום שלא משתמשת ב-htaccess וכאשר ה-htaccess לא עובד סביר להניח שהמערכת לא תעבוד באופן תקין.
הרבה פעמים אנו נעזרים ב-htaccess כדי לסייע לעבודת ה-SEO – שמירה על מבנה עקבי של URL והפניות מסוגים שונים. לא מזמן יצא לי לעבוד על פרויקט מורכב שעבר המרה ממערכת למערכת. אחד הדברים המוזרים במערכת הישנה הוא שהיא תקעה "index.php" מוזר בכל מני מקומות – לפעמים בסוף הכתובת כמו למשל mysite.com/directory/index.php או mysite.com/directory/index.php/1. לפיכך היינו צריכים לייצר htaccess rule על מנת להעלים את ה-string המוזר מה-URL שלנו ולהפנות את המשתמש אל ה-URL ללא הסטרינג.
את זה עשינו באמצעות ה-rule הבא:
# Removing index.php from anywhere in the URL.
RewriteCond %{THE_REQUEST} \/index.php/?.*\ HTTP [NC]
RewriteRule (.*)index\.php\/?(.*) /\$2 [NC,R=301,L]
מה יש פה בעצם? יש כאן משפט תנאי ומשפט פעולה, בואו וננתח את משפט התנאי:
ראשית הוא מתחיל ב-RewriteCond ובמשתנה %{THE_REQUEST} המשתנה הזה מציג את הבקשה שמגיעה מהמשתמש כפי שהיא נכתבת בלוג שלו. אחרי כן אני מפרט את ה-string, במקרה שלנו index.php. כל הסלאשים אלו נועדו לבצע escaping וה ?/ נועד לכלול את שני המקרים index.php בלי סלאש בסוף ו-/index.php עם סלאש בסוף. ה-HTTP חייב לבוא עם THE_REQUEST והוא מציין שמדובר בפרוטוקול HTTP. ה-NC הוא חשוב מאד והוא מראה לנו שבעצם אין חשיבות להאם מדובר באותיות ראשיות או לא, התנאי יעבוד גם עם index.php וגם עם INDEX.PHP.
אחרי שסיימנו אם התנאי, אנו צריכים להכנס לשכתוב עצמו, RewriteRule. סימנתי את index.php עם הביטוי הבא: ?/\index\.php . כאשר סימן השאלה בא לציין trailing slash (סימן שאלה זה אחד או אפס ב-Regex). ה-(*.) לפני ואחרי מסמן לי את החלקים שבהם אשתמש בשכתוב $1 עבור החלק שלפני הביטוי ו-$2 עבור החלק שלאחריו, וזה בדיוק מה שאני עושה, אחרי שחתכתי את הביטוי אני כותב $1$2 כד לעשות שיכתוב של החלק לפני + החלק אחרי (החלק באמצע נשמט כמובן).
לסיכום, אני כותב L למנוע עיבוד של כללים נוספים, R=301 כדי להחזיר 301 moved permanently וכמובן NC על מנת שזה יעבוד בלי שום קשר אם הכנסתי Index.php או index.php.
זה הכל, פשוט, לא? 🙂