Site açılmıyor, tarayıcı 403 Forbidden gösteriyor veya WordPress tema yüklerken Could not create directory diyor. File Manager'a giriyorsunuz, klasöre sağ tıklıyorsunuz, 777 veriyorsunuz ve sorun çözülüyor. Ta ki gelecek hafta hosting bir e-posta gönderip wp-content/uploads içinde bilinmeyen bir PHP dosyasının çalıştırıldığını söyleyene kadar. Bu makale, "çalışıyor" ile "doğru" arasındaki o boşluk hakkında yazılmıştır.
Dosya izni ne demek ve neden sayı yazıyorlar
Linux her dosya için üç grup tanımlar: sahip (user), grup (group) ve diğerleri (others). Her grubun üç biti vardır: okuma (r=4), yazma (w=2) ve çalıştırma (x=1). chmod içinde yazdığınız sayı bu bitlerin toplamıdır. Yani 644, sahibin okuyup yazması, grubun sadece okuması, diğerlerinin sadece okuması demektir. 755 ise sahibin her şeyi yapabilmesi, diğerlerinin sadece okuyup klasöre girebilmesi demektir.
Çoğu kişinin bilmediği nokta: x'in dosya ve klasör üzerindeki anlamı farklıdır. Dosya üzerinde "çalıştırılsın" demektir. Klasör üzerinde "içine girip dosya adlarını görebilesin" demektir. Bir klasör 644 ise, içindeki dosya 644 ve tamamen okunabilir olsa bile, web sunucusu o dosyaya erişemez. Ortaya çıkan hata da yanıltıcıdır: kendisinde hiçbir sorun olmayan bir dosyada 403 Forbidden.
Doğru dosya ve klasör izni değeri
Paylaşımlı hosting'deki PHP sitelerinin ezici çoğunluğu için bu iki sayı yeterlidir:
- Dosyalar:
644 - Klasörler:
755
Hepsi bu. Dosyaların sahipliği doğruysa, bu iki sayı her şeyi çalıştırır. SSH üzerinden tek seferde çalıştırma komutu:
find /home/USER/public_html -type d -exec chmod 755 {} \;
find /home/USER/public_html -type f -exec chmod 644 {} \;
Sıralama önemlidir: önce klasörler, sonra dosyalar. Tersini yaparsanız ve sonradan bir klasör oluşturulursa sonuç aynıdır, ancak komutu büyük bir ağaç üzerinde çalıştırmak birkaç saniye sürer ve bir kez doğru şekilde yapılması daha iyidir.
Gerçekten var olan istisnalar
Genellikle üç yerde yukarıdaki kuraldan çıkmanız gerekir. Birincisi, WordPress'teki wp-config.php dosyası; buna 600 veya 640 verebilirsiniz; sahibinden başka kimse onu okumamalıdır. İkincisi, betiğin içinde dosya oluşturması gereken klasörler, örneğin wp-content/uploads veya eklenti cache klasörleri; bunlar çoğu zaman 755 ile çalışır, ancak PHP farklı bir sahiplikle çalıştırılıyorsa 775 gerekli olur. Üçüncüsü, bazı ortamların 755 ile çağırdığı wp-cron.php gibi çalıştırılabilir dosyalar.
Ve bir uyarı: 775 yalnızca sahip ve grup doğru ayarlandığında anlam taşır. Dosyaların sahipliği nobody:nobody ise ve siz 775 verirseniz, pratikte sunucudaki tüm kullanıcılara yazma izni vermiş olursunuz. Burada hata yapıyorlar: sayıyı değiştiriyorlar, sahipliği değiştirmiyorlar.
777 neden çözüm değil, işe yaradığında bile
777, o sunucudaki her kullanıcının, aynı makinede barındırılan diğer her siteden, dosyalarınıza yazma ve çalıştırma izni olduğu anlamına gelir. Paylaşımlı hosting'de bu, kendisi hacklenmiş komşu bir sitenin sizin wp-content/uploads içine bir PHP dosyası koyup onu çalıştırabileceği anlamına gelir. Hiçbir belirti görmezsiniz; siteniz sağlıklı çalışır. Ta ki hosting'in tarayıcısı veya şüpheli bir giden trafik raporu olayı ortaya çıkarana kadar.
İkinci sorun daha tekniktir. Bazı hosting'ler suPHP veya PHP-FPM ayarları nedeniyle 777 izinli dosyayı tamamen reddeder ve hatayı düzeltmek yerine 500 Internal Server Error alırsınız. Yani 777 ne güvenlidir ne de her zaman çalışır. İzinleri değiştirdikten sonra beyaz sayfa görürseniz, hata yolu başka bir yerdedir; WordPress ve PHP'de beyaz sayfa giderme rehberi logları doğru inceleme sırasını açıklar.
Sorunun gerçek işareti: sahiplik
755 ve 644 ile de yazma hatası alıyorsanız, sorun neredeyse her zaman sahipliktir, sayı değil. SSH ile kontrol edin:
ls -ln /home/USER/public_html/wp-content/uploads
id
ps aux | grep -E 'php-fpm|apache' | head -3
Dosyaların sahibi, PHP'nin altında çalıştırıldığı kullanıcıyla aynı değilse, hiçbir sayı sorunu çözmez. Doğru yol, sahipliği düzeltmektir:
chown -R USER:USER /home/USER/public_html
Paylaşımlı hosting'de genellikle chown erişiminiz yoktur ve bunu panelden veya destek talebiyle istemeniz gerekir. Kendi özel sunucunuzda bu kısıtlama yoktur ve bu, bazı ekiplerin bir süre sonra paylaşımlı hosting'den taşınması için tek başına yeterli bir sebeptir.
Yaygın hatalar ve logda gördükleriniz
| Belirti | Muhtemel neden | Eylem |
|---|---|---|
Bir dosyada 403 Forbidden | Üst klasörün çalıştırma (x) izni yok | Klasörü 755 yapın |
PHP logunda Permission denied | Yanlış sahiplik veya salt okunur klasör | ls -ln kontrolü ve sahipliği düzeltme |
| WordPress'te başarısız yükleme | uploads yazılabilir değil | 755 veya gerekirse 775 |
chmod sonrası 500 Internal Server Error | 777, PHP handler tarafından reddedildi | 644/755'e geri dönün |
| Eklenti dosya oluşturamıyor | Cache klasörü yanlış sahiplikte | Klasörü silin ve PHP tarafından yeniden oluşturulsun |
Pratik bir not: Her toplu değişiklikten önce izinlerin çıktısını kaydedin ki bir şey bozulursa geri dönebilesiniz.
find /home/USER/public_html -printf '%m %p\n' > ~/perms-backup.txt
644/755 kuralından ne zaman çıkmalısınız
Siteniz paylaşımlı hosting'deyse ve sahiplik doğru ayarlanmışsa, 644 ve 755'i koruyun ve hiçbir bahaneyle 777 vermeyin. VPS veya özel sunucudaysanız ve PHP-FPM'i sitenin özel kullanıcısıyla çalıştırıyorsanız, aynı 644/755 yeterlidir ve her şeyden daha güvenlidir. 775'in mantıklı olduğu tek durum, web sunucusu ile dağıtım (deploy) kullanıcısı arasında ortak bir grubun olduğu ve her ikisinin de klasöre yazması gerektiği durumdur. O zaman bile 777 yanlış bir seçimdir.
Test ortamı veya yönetim paneli için, izinleri açmak yerine web sunucusu kimlik doğrulamasını kullanın; hosting'de klasörü şifreleme tam olarak bu senaryo için yazılmıştır ve chmod'da yapılacak herhangi bir değişiklikten daha güvenlidir.
Sitenin dosya sayısı fazlaysa ve izinleri manuel yönetmek zaman alıcı hale geldiyse, FTP hesabı oluşturma ve yönetme rehberi erişimleri dosya tarafından değil, hesap tarafından nasıl kısıtlayacağınızı gösterir. Ve hosting'inizde başka hangi kısıtlamaların uygulandığını bilmek istiyorsanız, hosting kaynak limitleri referansı her sayıyı ayrı ayrı açıklamıştır.
Sık sorulan sorular
WordPress dosyaları için doğru izin nedir?
Dosyalar 644 ve klasörler 755. Bu iki sayı, paylaşımlı hosting'deki çoğu WordPress kurulumu için yeterlidir ve değiştirmeye gerek yoktur. Tek istisnalar, 600 veya 640 ile wp-config.php ve gerekirse 775'e ulaşan yükleme ve cache klasörleridir.
777'den sonra site çalışıyor ama hosting neden uyarıyor?
Çünkü 777, sunucudaki her kullanıcıya yazma ve çalıştırma izni verir. Siteniz çalışır, ancak aynı sunucudaki başka bir site enfekte olursa, saldırgan klasörlerinize kötü amaçlı bir dosya koyup çalıştırabilir. Hosting uyarısı genellikle tam da bu dosyaların otomatik taranmasından sonra gönderilir.
chmod ile chown arasındaki fark nedir ve hangisini kullanmalıyım?
chmod izin seviyesini değiştirir ve chown sahipliği. Yazma hatası alıyorsanız ve izinler 644/755 ise, sorun sahipliktir ve chown yapmanız gerekir. Paylaşımlı hosting'de genellikle bu erişiminiz yoktur ve destekten istemeniz gerekir.
Klasör için 755 güvenli mi?
Evet, sahiplik doğru olduğu sürece. 755, yalnızca sahibin yazabileceği, diğerlerinin ise yalnızca okuyup klasöre girebileceği anlamına gelir. Tehlike, sahiplik nobody gibi yanlış bir kullanıcıya verildiğinde başlar; o zaman 755 de pratikte açıktır.
Her toplu değişiklikten önce, izinlerin çıktısını bir kez kaydedin ve sonra find komutunu çalıştırın. Eğer ondan sonra site açılmazsa, muhtemelen sorun sayı değil sahipliktir. Başlangıç için, doğru sahiplikle ayarlanmış Linux hosting, bu tür hataları kökten azaltan şeydir.