X

htaccess או Php.ini?

לא פעם אנחנו נתקלים במדריכים שונים באינטרנט המנחים אותנו לבצע פעולות באמצעות שינוי ערכים בקובץ htaccess מקומי או php.ini.
לא תמיד ברור באיזה אופן יש להשתמש (או מדוע), אני אנסה להסביר במאמר זה כיצד ניתן לדעת מתי להשתמש בכל אחד מהם (ומה הייתרונות והחסרונות של כל אחד).

לצערי, הפעם אני לא אפרט באופן מלא את כלל השימושים של קובץ htaccess (או php.ini), אבל אני כן אסביר על הנקודה מתי יש להשתמש בכל אחד מהם.

htaccess?

htaccess הוא "ממשק" של שרת ה-web הפופולרי Apache, המאפשר לנו לשנות הגדרות מסויימות בשרת מבלי שתהיה לנו גישה ל-Apache עצמו.
כלומר, במידה ו-htaccess לא היה קיים, בכל פעם שהיינו רוצים לעשות פעולה "פשוטה" כמו Redirect 301 או rewrite כלשהו היינו צריכים להכנס לקונפיגורציה הראשית של ה-apache, לבצע את השינוי ולבצע reload ל-apache.
הסיכון באופן השוואתי הוא עצום:

  1. שינוי הקונפיגורציה של כלל השרת יכול לגרום לנפילה של כלל האתרים בשרת (אם לדוגמא כתבנו משהו לא נכון)
  2. לא לכל אחד יש גישה לקובץ ה-httpd.conf (קובץ ההגדרות הראשי של ה-apache) – וודאי לא כשמדובר בשרת שיתופי.
  3. לא כל אחד יודע איך לגשת לקובץ, איך לטפל בו, מה ה-syntex הנכון לכתוב בו דברים.

במילים אחרות – htaccess עושה לנו רק טוב, בעיקר כשמסתכלים על הנקודות שרשמתי למעלה מהצד השני:

  1. שינוי קונפיגורציה בקובץ ה-htaccess יגרום במקרה הגרוע ביותר לנפילת אתר ספציפי (אבל לא כל האתרים בשרת / החשבון)
  2. ניתן לבצע את השינוי בכלים פשוטים יחסית (FTP)
  3. לא דורש אתחול כלשהו – ברגע שמירת הקובץ ההגדרות נכנסות לתוקפן
  4. יש תעוד רב ברחבי האינטרנט לגבי הצורה שבה יש לבצע את השינויים (מדריכי "copy+paste").

כ"ממשק" של Apache, ה-htaccess נותן לנו גם לבצע פעולות מורכבות יותר כמו לטפל ולשנות הגדרות במודולים שונים של apache (לדוגמא, php במקרה והוא נטען כ-php-cli).

נקודה חשובה נוספת ב-htaccess שהוא עובד על בסיס של "per-directory", כלומר – ניקח לדוגמא את מבנה התיקיות הבא:

/home/username/domains/spd.co.il/public_html/folder1

/home/username/domains/spd.co.il/public_html/folder1/folder2

אם נציב קובץ htaccess בתיקיה folder1, ההוראות בו "יחלחלו" למטה גם לתיקית folder2 (והלאה)
כמו כן, אם נציב קובץ htaccess בתיקית folder2 עם הוראות אשר סותרות את ההוראות בקובץ ה-htaccess בתיקיה folder1, ההוראות "ידרסו" ע"י ההוראות החדשות (folder2).

php.ini?

php.ini הוא בעצם קובץ הקונפיגורציה של php.
אומנם לא ניתן לשנות את כלל הקונפיגורציה דרך הקובץ (התקנת מודולים מתבצעת מול ממשקים חיצוניים), אבל פונקציות חשובות לנו בתור בוני אתרים ומתכנים (כמו memory_limit או max_execution_time מופיעות בו).

בדומה ל-htaccess, גם כאן הקובץ קיים ב-"2 גרסאות":

  1. קובץ ההגדרות הראשי אליו למשתמש לרוב אין גישה (וודאי לא בשרת שיתופי).
  2. קובץ הגדרות מקומי אותו המשתמש יכול לערוך באמצעות FTP.

הרעיון דומה – במקום לכפות על כל המשתמש בשרת הגדרות php.ini אחידות, ניתן לבצע (עד רמה מסויימת אותה נראה בהמשך) הגדרות נקודתיות למשתמש / אתר / תיקיה ספציפית בשרת.

כפי שציינתי ב-htaccess, גם כאן הגדרות ה-php.ini עובדות על בסיס של "per-directory", כלומר – ניקח לדוגמא את מבנה התיקיות הבא:

/home/username/domains/spd.co.il/public_html/folder1

/home/username/domains/spd.co.il/public_html/folder1/folder2

אם נציב קובץ php.ini בתיקיה folder1, ההוראות בו "יחלחלו" למטה גם לתיקית folder2 (והלאה)
כמו כן, אם נציב קובץ php.ini בתיקית folder2 עם הוראות אשר סותרות את ההוראות בקובץ ה-php.ini בתיקיה folder1, ההוראות "ידרסו" ע"י ההוראות החדשות (folder2).

מתי נשתמש ב-htaccess ומתי ב-php.ini?

זוכרים את המאמר בנוגע ל-php-cgi או php-cli? השארנו שם נקודה לא סגורה – מיד נסגור אותה.

השימוש ב-htaccess או php.ini נקבע לפי התצורה בה הותקן ה-php בשרת:

  • php-cli: אם השרת הותקן בתצורה זו, משמעות הדבר היא שה-php רץ בתור module של ה-apache – לפיכך, ממשק ה-htaccess של ה-apache נותן לנו למעשה לשנות הגדרות ב-php.
  • php-cgi: בהנחה שהשרת הותקן בתצורה זו, המנגנון בו יש להשתמש לצורך שינוי נקודתי של הגדרות php הוא php.ini מקומי בתיקיה.

רגע, שינוי הגדרות שרת זה לא משהו מסוכן?

נשאל שאלה כזו: רכשתם שירות אחסון אתרים מחברה X, אתם סומכים על חברה X שתנהל את ענייניכם בצורה הטובה והמאובטחת ביותר (ואם לא, אולי זה הזמן לעבור דירה 🙂 ) – מה פתאום שנשנה את ההגדרות שהחברה קבעה?

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

אבל חשוב לזכור, יש הגדרות מסוכנות בשרת שהשינוי שלהם יכול לגרום לנזק (open_basedir או disable_functions), וכפי שאתם יכולים לשנות הגדרות מסויימות, ייתכן וגם תוקף פוטנציאלי (שפרץ לאתר בעקבות פרצת קוד / פלאגין לא מעודכן וכו') יוכל להשתמש ולבצע שינויים אלו לצורך הרחבת הפריצה (ולהשתלט על אתרים נוספים בחשבון / שרת).

מעבר לכך, בעוד שבממשק ה-htaccess ניתן "לגזור" אילו אפשרויות ניתנות לשינוי עבור הלקוח (באמצעות ה-apache directive בשם "allowoveride"), ב-php.ini לא ניתן לעשות זאת (!!!) – מה שאומר, שאותו תוקף פוטנציאלי יוכל (כמובן, לאחר שמצא את הפרצה הראשונית ברמת הקוד) ביותר קלות לנסות ולהרחיב את הפריצה שלו לחשבון / שרת.

האם ניתן לשנות את כל ההגדרות?

בהחלט לא, ישנה רשימה מאוד ספציפית של ההגדרות שניתנות לשינוי (הרשימה , הסבר לרשימה).
בנוסף, שימו לב כי גרסאות שונות של php עלולות להתנהג באופן שונה (לדוגמא: open_basedir לא ניתן לשינוי בגרסאות חדשות יותר מ-php 5.2.3).

 

מנהל מערכת: חלק מחברת SPD Hosting החל משנת 2006. כחלק מהתפקידים שלי בחברה, אני אחראי על תוכניות ההכשרה של עובדים חדשים. חי ונושם Hosting, קוד פתוח ו-Linux (ויש גם מילה טובה ל-Windows)
Related Post