PHP mkdir: Masalah izin ditolak

99

Saya mencoba untuk membuat direktori dengan fungsi mkdir PHP tapi saya mendapatkan error sebagai berikut: Warning: mkdir() [function.mkdir]: Permission denied in .... Bagaimana cara menyelesaikan masalah?

folos
sumber
2
Platform / server web / sistem operasi?
Salman A
1
periksa pertanyaan ini: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Saya mengalami masalah yang sama dan jawabannya di sini hanya memperbaiki masalah saya. Jika Anda menggunakan runnig di linux, jawaban tentang SELinux mungkin berlaku untuk Anda.
Lucas Madureira
coba ini berfungsi untuk saya stackoverflow.com/a/12656964/7516620 masukkan deskripsi tautan di sini
Akshay Italiya

Jawaban:

172

Saya tahu ini adalah utas lama, tetapi perlu jawaban yang lebih baik. Anda tidak perlu menyetel izin ke 777, yang merupakan masalah keamanan karena ini memberikan akses baca dan tulis ke dunia. Mungkin pengguna apache Anda tidak memiliki izin baca / tulis di direktori.

Inilah yang Anda lakukan di Ubuntu

  1. Pastikan semua file dimiliki oleh grup dan pengguna Apache. Di Ubuntu, ini adalah grup dan pengguna data www

    chown -R www-data:www-data /path/to/webserver/www

  2. Selanjutnya memungkinkan semua anggota grup www-data untuk membaca dan menulis file

    chmod -R g+rw /path/to/webserver/www

Fungsi php mkdir()sekarang harus bekerja tanpa mengembalikan kesalahan

simpleengine
sumber
3
Jawaban yang bagus! Mudah-mudahan ini akan berhasil ke bagian atas halaman seiring waktu!
Sangat Tidak Teratur
18
Ini ide yang sangat buruk .
Big McLargeHuge
Apache memang membutuhkan izin untuk menulis hal-hal seperti cache dan log ... ini hanya masalah penyesuaian.
Manatax
@simpleengine Hai Saya telah memperhatikan jawaban Anda .. Saya menghadapi masalah yang sama dengan proyek yang saya coba buat di CodeIgnter dan mengembangkannya di Ubuntu 14.14 Lts .. Bisakah Anda jelaskan lebih lanjut kepada saya langkah-langkah yang perlu saya lakukan lakukan untuk memperbaiki kesalahan ini ??? Untuk memberi Anda beberapa info tambahan: jalur absolut adalah /opt/lampp/htdocs/www/my-app/public/uploads.. Pada dasarnya yang saya coba lakukan adalah setiap pengguna yang masuk mengunggah file di dalam folder unggahan dan juga membuat folder-album (ini akan dilakukan dengan php) untuk menyimpan foto ..
ltdev
6
Saya tidak suka pengguna yang terus mengatakan "tidak aman" tanpa menunjukkan cara aman untuk melakukannya.
che-azeh
38

Jawaban terlambat untuk orang yang menemukan ini melalui google di masa mendatang. Saya mengalami masalah yang sama.

CATATAN: SAYA PADA MAC OSX LION

Apa yang terjadi adalah bahwa apache dijalankan sebagai pengguna "_www" dan tidak memiliki izin untuk mengedit file apa pun. Anda akan melihat TIDAK ADA fungsi sistem file yang bekerja melalui php.

Bagaimana cara memperbaiki:

Buka jendela pencari dan dari bilah menu, pilih Buka> Buka Folder> / private / etc / apache2

sekarang buka httpd.conf

Temukan:

User _www 
Group _www

ubah nama pengguna:

User <YOUR LOGIN USERNAME>

Sekarang restart apache dengan menjalankan terminal formulir ini:

sudo apachectl -k restart

Jika masih tidak berhasil, saya kebetulan melakukan hal berikut sebelum saya melakukan hal di atas. Bisa jadi terkait.

Buka terminal dan jalankan perintah berikut: (catatan, file server web saya terletak di / Library / WebServer / www. Ubah sesuai dengan lokasi situs web Anda)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Chris Ingis
sumber
6
Solusi ini berfungsi, tetapi memungkinkan Apache untuk mendatangkan malapetaka dengan sistem Anda jika seseorang mendapatkannya untuk mengeksekusi kode berbahaya (misalnya melalui eksploitasi Shellshock). Alternatifnya adalah membiarkan Apache berjalan sebagai _wwwdan membuat grup untuk Anda dan Apache. Buat grup baru, katakan dipanggil trusted, dan tempatkan diri Anda dan _wwwdi dalamnya. Kemudian jadikan tepercaya sebagai pemilik grup dari semua file di direktori dokumen server Anda. Terakhir, lakukan chmod g+rwxseperlunya pada file yang diakses Apache, sehingga trustedgrup memiliki izin untuk mengedit file.
Chris Middleton
3
hanya menimpali untuk menegaskan kembali bahwa jawaban ini adalah ide yang buruk. Ada banyak alasan yang sangat bagus mengapa proses apache dimiliki oleh pengguna tujuan khusus mereka sendiri.
danyamachine
16

Jangan tetapkan izin ke 777 saat menggunakan mkdir di PHP

Jawaban tautan saja tidak dianggap sebagai praktik yang baik di StackOverflow, tetapi saran yang diberikan di sini umumnya TIDAK boleh ditindaklanjuti.

Saya ingin kembali ke jawaban bagus ini untuk pertanyaan serupa . Saya mengutip:

Mohon berhenti menyarankan untuk menggunakan 777. Anda membuat file Anda dapat ditulisi oleh semua orang, yang berarti Anda kehilangan semua keamanan yang dirancang untuk sistem perizinan. Jika Anda menyarankan hal ini, pikirkan tentang konsekuensi yang mungkin ditimbulkannya pada server web yang tidak dikonfigurasi dengan baik: akan menjadi sangat mudah untuk "meretas" situs web, dengan menimpa file. Jadi, jangan.

Melayu
sumber
9

Perbaiki hak akses dari direktori Anda mencoba untuk membuat direktori di .

Erik
sumber
Saya baru saja memecahkan masalah di pertanyaan awal dengan mengubah izin file menjadi 755 secara rekursif, menggunakan Filezilla. Klik kanan pada folder induk, dengan asumsi itu adalah semacam folder repositori file umum yang tidak masalah untuk mengatur 755 izin, lalu File Attributes -> Numeric Value -> 755, lalu centang "Recurse into sub directory". Perlu beberapa menit untuk menyebar melalui sub direktori jika Anda memiliki banyak file. Kemudian coba lagi.
TARKUS
7

Saya tahu bahwa utas ini sudah tua, tetapi mungkin ini akan membantu seseorang, suatu hari nanti.

Masalah mengapa PHP mengatakan "Izin ditolak" untuk mkdir () - jalur url salah. Jadi, untuk memperbaikinya, yang Anda butuhkan hanyalah mendapatkan jalur yang benar. Saya melakukannya dengan cara ini:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>
Boris
sumber
1
Terjadi pada saya saat mentransfer ke host baru (yang memiliki mysqlnd lol). Saya lupa mengganti ke jalur direktori home lengkap yang baru. Ternyata itu bukan masalah izin.
JSG
2

Anda harus memiliki izin sistem file untuk membuat direktori.

Contoh: Di Ubuntu 10.04 apache (php) berjalan sebagai pengguna: www-data dalam grup: www-data

Artinya pengguna www-data membutuhkan akses untuk membuat direktori.

Anda dapat mencobanya sendiri dengan menggunakan: 'su www-data' untuk menjadi pengguna www-data.

Sebagai perbaikan cepat, Anda dapat melakukan: sudo chmod 777 my_parent_dir

Jon Skarpeteig
sumber
14
chmod 0777akan memberikan akses baca dan tulis ke dunia! Anda seharusnya tidak menyarankan hal seperti itu. Namun, saran dengan grup pengguna saat ini adalah yang terbaik di sini :)
KingCrunch
1
Jika dunia memiliki akses ke OS, tentu. Cara yang lebih baik adalah: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig
Atau biarkan izinnya sendiri dan tambahkan www-data ke grup direktori induk.
Marc B
0

Hal lain yang dapat Anda lakukan adalah pergi ke: / etc / sudoers

Di sana tambahkan baris berikut yang memberikan izin kepada pengguna tersebut www-data ALL = (ALL: ALL) ALL Mengapa www-data? ini karena apache dijalankan dengan nama pengguna ini.

Jika pengguna Anda berbeda maka coba nama pengguna ALL = (ALL: ALL) ALL

Ini berhasil untuk saya.

maxwells
sumber
5
jangan mengedit sudoerssecara langsung, tetapi masuk sebagai root, dan gunakan visudoperintah te : yang memeriksa perubahan apa pun untuk menghindari pengeditan yang salah, yang dapat menyebabkan kesalahan parse saat file sudoers dimuat, yang mungkin membuat Anda tidak berdaya (karena tidak ada hak untuk mengubah apa pun)
Elias Van Ootegem
Bagaimana menemukan nama pengguna. seperti www-data? Saya menggunakan nginx tetapi tidak berfungsi
robspin
1
@robspin coba ini: ps aux | egrep '(nginx)'
maxwells
0

Karena Anda menggunakan mac, Anda dapat menambahkan diri Anda ke grup _www (grup pengguna apache) di mac Anda:

sudo dseditgroup -o edit -a $USER -t user _www

dan tambahkan pengguna _www ke grup roda yang sepertinya mac membuat file sebagai:

sudo dseditgroup -o edit -a _www -t user wheel
SeanJA
sumber
0

Saya memiliki masalah ini sekarang, solusi terbaik saya yang dapat saya berikan kepada Anda sekarang (meskipun Anda tidak menyertakan kode Anda) adalah:

  1. Periksa bagaimana Anda memberi nama folder tujuan Anda, misalnya: folder_baru (terkadang ini dapat menyebabkan kesalahan untuk izin karena kebanyakan host tidak mengizinkan nama yang menggunakan garis bawah, tanda hubung, dll untuk dibuat pada waktu proses). Itu berhasil untuk saya.
  2. Jika Anda menggunakan perintah rekursif untuk membuat sub-folder jangan lupa untuk meletakkan 0755 (ingat untuk menyertakan 0 di awal) ke perintah mkdir, misalnya:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Ini juga berhasil untuk saya sekarang.

arungisyadi
sumber
3
777 adalah masalah keamanan
MaicolBen
Diedit sekarang, ke 0755
arungisyadi
0

Jika Anda menggunakan LINUX, pertama-tama mari kita periksa pengguna apache, karena di beberapa distro dapat berbeda:

egrep -i '^user|^group' /etc/httpd/conf/httpd.conf 

Katakanlah hasilnya adalah "http". Lakukan langkah berikut, ingat saja ubah path_to_folder ke jalur folder:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
Marcelo Agimóvel
sumber
0

periksa apakah ini bukan masalah dengan umask

if (!function_exists('mkdir_r')) {
    /**
     * create directory recursively
     * @param $dirName
     * @param int $rights
     * @param string $dir_separator
     * @return bool
     */
    function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
        $dirs = explode($dir_separator, $dirName);
        $dir = '';
        $created = false;
        foreach ($dirs as $part) {
            $dir .= $part . $dir_separator;
            if (!is_dir($dir) && strlen($dir) > 0) {
                $created = mkdir($dir, $rights);
            }
        }
        return $created;
    }
}

if (!function_exists('ensure_dir')) {
    /**
     * ensure directory exist if not create 
     * @param $dir_path
     * @param int $mode
     * @param bool $use_mask
     * @param int $mask
     * @return bool
     */
    function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
        // set mask 
        $old_mask = $use_mask && $mask != null
            ? umask($mask)
            : null;
        try {
            return is_dir($dir_path) || mkdir_r($dir_path, $mode);
        } finally {
            if ($use_mask && $old_mask != null) {
                // restore original
                umask($old_mask);
            }
        }
    }
}
ceph3us
sumber
0

Setelah Anda menginstal server ftp dengan sudo apt-get install vsftpdAnda harus mengkonfigurasinya. Untuk mengaktifkan akses tulis, Anda harus mengedit /etc/vsftpd.conffile dan menghapus komentar pada

#write_enable=YES

baris, jadi itu harus dibaca

write_enable=YES

Simpan file dan mulai ulang vsftpddengan sudo service vsftpd restart.

Untuk opsi konfigurasi lainnya, lihat dokumentasi ini atauman vsftpd.conf

matahari ku
sumber
0

Kesalahan ini terjadi jika Anda menggunakan jalur yang salah.

Misalnya:

Saya menggunakan sistem ubuntu dan nama folder proyek saya adalah 'myproject'

Misalkan saya memiliki direktori myproject / public / report dan ingin membuat folder baru bernama orders

Maka saya membutuhkan seluruh jalur di mana proyek saya ada. Anda bisa mendapatkan jalur dengan perintah PWD

Jadi jalur root saya adalah = '/ home / htdocs / myproject /'

$ dir = '/ home / htdocs / myproject / public / report / Pesanan';

if (!is_dir($dir)) {
   mkdir($dir, 0775, true);
}

Ini akan berhasil untuk Anda !! Nikmati !!

Umang Soni
sumber