Pembatasan open_basedir sedang berlaku. File (/) tidak dalam jalur yang diizinkan:

89

Saya mendapatkan kesalahan ini pada unggahan avatar di situs saya. Saya belum pernah mendapatkannya sebelumnya dan tidak ada yang berubah baru-baru ini bagi saya untuk mulai mendapatkan kesalahan ini ...

Warning: is_writable() [function.is-writable]: 
open_basedir restriction in effect. 
File(/) is not within the allowed path(s):
Webnet
sumber
19
Anda menerima jawaban yang tidak berfungsi.
sjas

Jawaban:

-23

Ubah open_basedirpengaturan dalam konfigurasi PHP Anda (Lihat Konfigurasi Runtime ).

The open_basedirPengaturan terutama digunakan untuk mencegah script PHP untuk pengguna tertentu dari mengakses file di akun pengguna lain. Jadi biasanya, file apa pun di akun Anda harus dapat dibaca oleh skrip Anda sendiri.

Contoh pengaturan melalui .htaccessjika PHP dijalankan sebagai modul Apache di sistem Linux:

<DirectoryMatch "/home/sites/site81/">
    php_admin_value open_basedir "/home/sites/site81/:/tmp/:/"
</DirectoryMatch>
Nikesh
sumber
2
@Nikesh ini memberi saya error 500 setelah saya menjatuhkannya ke .htaccces saya dan mengubah jalur ke: /my/cutsom/dir/. Tidak yakin mengapa berpikir.
hitautodestruct
79
Keren, sejauh ini 12 suara positif untuk jawaban yang salah. Anda tidak dapat menggunakan php_admin_valuedalam .htaccessfile . Anda tidak dapat menggunakan DirectoryMatch di file .htaccess . (Tindakan keamanan apa yang akan open_basedirdilakukan jika itu bisa dinonaktifkan begitu saja?)
Álvaro González
1
@eoinoc - Gulir ke bawah dan lihat misalnya jawaban Andrei. Atau edit file php.ini global.
Álvaro González
19
ANDA TIDAK MENEMPATKAN INI KE KEBERHASILAN ANDA! TAPI BUKTI KE FILE KONFIGASI APACHE ANDA.
tfont
8
Memasukkan direktori root di open_basedir akan mengalahkan tujuan open_basedir sepenuhnya. Solusi ini hanya "berfungsi" dalam artian pada dasarnya menonaktifkan pembatasan.
Martin
118

Ubah pengaturan open_basedir di akun hosting Anda dan atur ke tidak ada. Temukan pengaturan open_basedir yang diberikan di bawah area 'Pengaturan PHP' di Plesk / cPanel Anda. Setel ke 'tidak ada' dari tarik-turun yang diberikan di sana. Saya telah menunjukkannya di gambar panel Plesk.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

yogihosting
sumber
1
@yogihosting setelah melakukan ini saya mendapat kesalahan - Tidak dapat menemukan model yang Anda tentukan: Home_model
Heemanshu Bhalla
1
Agak terlambat untuk ini, tetapi apakah ada cara untuk melakukannya untuk semua situs plesk? Saya telah mengaturnya ke tidak ada di php.ini global untuk versi yang digunakan situs: gyazo.com/dfffbe7f9b3a20ede97da72f1ddfc777 Tetapi mereka masih mendapatkan kesalahan.
Matt Cowley
@MattCowley Anda harus melakukan ini untuk setiap situs yang dihosting di panel plesk.
yogihosting
1
Terima kasih untuk solusi ini! Ini berfungsi sempurna untuk saya di Shared hosting!
Smilefounder
38

Untuk mengatasi kesalahan ini, Anda harus mengedit file httpd.conf. Cara sebelumnya bisa dilihat di phpinfo di apache2handler direktif bagian Server Root. Misalnya, dalam kasus saya seperti ini - / etc / httpd / httpd.conf. Buka file httpd.conf, cari penyebutan parameter open_basedir. Dan atur ke tidak ada. ( php_admin_value open_basedir none )

Andrei
sumber
Menyetel ke 'tidak ada' berhasil untuk saya - menggunakan antarmuka Plesk juga.
diggersworld
10
Saya menemukan open_basedirkonfigurasi di file php.ini. (Arch Linux di Raspberry Pi dengan php 5)
Dennis van der Schagt
2
Juga ditemukan di php.ini saya (juga Arch). Cukup komentari baris tersebut untuk mendapatkan efek yang sama seperti jawaban ini.
Ben Elgar
@BenElgar hanya dengan mengomentari baris yang telah menyebutkan pekerjaan, saya hanya bertanya apakah ada risiko di sana
mwangaben
6

Jika Anda menjalankan ini dengan php file.php. Anda perlu mengedit php.ini Temukan file ini:

: locate php.ini
/etc/php/php.ini

Dan tambahkan jalur file ke open_basedirproperti:

open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps/:/run/media/andrew/ext4/protected

malaikat kematian908
sumber
Ini adalah satu-satunya solusi yang mengarah ke beberapa jalur tertentu, bukan hanya mengabaikan keamanan sama sekali.
mvreijn
5

Bagi saya masalahnya adalah nilai konfigurasi yang buruk / hilang untuk server Plesk yang menjalankan semuanya. Saya hanya mengikuti petunjuk di sini: http://davidseah.com/blog/2007/04/separate-php-error-logs-for-multiple-domains-with-plesk/

Anda dapat mengkonfigurasi PHP agar memiliki file log kesalahan terpisah untuk setiap definisi VirtualHost. Triknya adalah mengetahui dengan tepat cara mengaturnya, karena Anda tidak dapat menyentuh konfigurasi secara langsung tanpa merusak Plesk. Setiap nama domain di (dv) Anda memiliki direktori sendiri di / var / www / vhosts. Direktori tipikal memiliki direktori tingkat atas berikut:

cgi-bin/
conf/
error_docs/
httpdocs/
httpsdocs/
...and so on

Anda akan ingin membuat file vhost.conf di folder conf / direktori domain dengan baris berikut:

php_value error_log /path/to/error_log
php_flag display_errors off
php_value error_reporting 6143
php_flag log_errors on

Ubah nilai pertama agar sesuai dengan instalasi Anda yang sebenarnya (saya menggunakan /tmp/phperrors.log). Setelah Anda selesai mengedit file vhost.conf, uji konfigurasi dari konsol dengan:

apachectl configtest
…or if you don’t have apachectl (as Plesk 8.6 doesn’t seem to)…

/etc/init.d/httpd configtest

Dan terakhir beri tahu Plesk bahwa Anda telah membuat perubahan ini.

/usr/local/psa/admin/bin/websrvmng -a
Josh P.
sumber
2

Path yang Anda maksud adalah tidak terhubung, dan tidak menggunakan directoryRoot dari ruang kerja Anda. Coba buat jalur absolut dari file yang ingin Anda akses, di mana Anda sekarang mungkin menggunakan jalur relatif ...

NDM
sumber
Ini menggunakan jalur absolut. Ini berfungsi untuk semua pengguna kecuali yang ini.
Webnet
2

jika Anda memiliki masalah seperti ini dengan ispconfig3 dan mendapat kesalahan seperti ini

Pembatasan open_basedir sedang berlaku. File (/ var / www / clients / client7 / web15) tidak berada dalam jalur yang diizinkan: .........

Untuk mengatasinya (dalam kasus saya), cukup setel PHP ke SuPHP di panel situs web ispconfig3

Semoga bisa membantu seseorang :)

Klimaks
sumber
2

Saya mengalami masalah ini @ salah satu situs wordpress saya setelah memperbarui dan / atau memindahkan :)

Periksa di tabel database 'wp_options' the 'upload_path' dan edit dengan benar ...

Bartuzz
sumber
nilai apa yang telah Anda setel? /[...]/public_html/wp-content/uploads?
brett
1

Jika digunakan ispconfig3:

Buka bagian Situs Web -> Opsi -> PHP open_basedir:

masukkan deskripsi gambar di sini

  • Di kolom ini telah dijelaskan jalur yang diizinkan dan setiap jalur dipisahkan dengan ":"

/ var / www / clients / client2 / web3 / image: / var / www / clients / client2 / web3 / web: / var / www / ... dan seterusnya

  • Jadi di sini harus meletakkan jalur yang ingin Anda akses, dalam kasus saya adalah:

/ var / www / klien / klien2 / web3 / gambar:

  • Masalahnya muncul karena:

Ketika skrip mencoba mengakses sistem file, misalnya menggunakan include, atau fopen (), lokasi file diperiksa. Ketika file berada di luar pohon direktori yang ditentukan, PHP akan menolak untuk mengaksesnya.

Pavel Kenarov
sumber
0

Jika Anda menjalankan tumpukan PHP IIS dan mengalami kesalahan ini, biasanya ini adalah perbaikan izin yang cepat.

Jika Anda mengelola server windows sendiri dan memiliki akses, coba ini PERTAMA:

Arahkan ke folder yang memberi Anda kesedihan saat menulis dan klik kanan> buka properti> keamanan.

Lihat pengguna mana yang memiliki akses ke folder tersebut, mana yang hanya bisa dibaca dan mana yang sudah penuh. Apakah Anda memiliki grup yang memblokir penulisan?

Perbaikan akan khusus untuk pengaturan IIS Anda, apakah Anda menggunakan Otentikasi Anonim dengan pengguna tertentu IUSR atau dengan identitas Pool Aplikasi?

Bagaimanapun, Anda pada akhirnya akan menambahkan izin tulis penuh baru untuk salah satu IUSR, IIS_IUSRS, atau identitas kumpulan aplikasi Anda - seperti yang saya katakan, ini akan bervariasi tergantung pada pengaturan Anda dan bagaimana Anda ingin melakukannya, Anda dapat pergi ke lubang kelinci google yang satu ini (satu posting seperti itu - izin IIS_IUSRS dan IUSR di IIS8 ) Bagi saya, saya menggunakan langsung dengan identitas kumpulan aplikasi saya sehingga saya dapat lolos dengan MACHINE_NAME\IIS_IUSRSbaca / tulis penuh pada temp atau unggah apa pun folder.

Saya tidak perlu menambahkan apapun ke open_basedir =dalam php.ini saya.

RobDigital
sumber
0

Selain jawaban @ yogihosting , jika Anda menggunakan DirectAdmin , ikuti langkah-langkah berikut:

  1. Buka halaman login DirectAdmin. Biasanya portnya adalah 2222.
  2. Masuk sebagai administrator. Nama penggunanya secara admindefault.
  3. Dari "Tingkat Akses" di panel kanan, pastikan Anda berada di "Tingkat Admin". Jika tidak, gantilah.
  4. Dari bagian "Fitur Tambahan", klik "Konfigurasi HTTPD Khusus".
  5. Pilih domain yang ingin Anda ubah.
  6. Masukkan konfigurasi yang ingin Anda ubah di textarea di bagian atas halaman. Anda harus mempertimbangkan file konfigurasi yang ada dan mengubah nilai berdasarkan itu. Misalnya, jika Anda melihat yang open_basedirdisetel di dalam a <Directory>, mungkin Anda harus mengapit perubahan Anda di <Directory>tag terkait :

    <Directory "/path/to/directory">
        php_admin_value open_basedir none
    </Directory>
    
  7. Setelah melakukan perubahan yang diperlukan, klik tombol "Simpan".

  8. Anda sekarang akan melihat perubahan Anda disimpan ke file konfigurasi jika itu valid.

Ada cara lain untuk mengedit file konfigurasi:

Perhatian : Berhati-hatilah, dan gunakan langkah-langkah berikut dengan risiko Anda sendiri, karena Anda dapat mengalami kesalahan, atau dapat menyebabkan downtime. Cara yang disarankan adalah yang sebelumnya, karena ini mencegah Anda memodifikasi file konfigurasi secara tidak benar dan menunjukkan kesalahan kepada Anda.

  1. Masuk ke server Anda sebagai root.
  2. Pergi ke /usr/local/directadmin/data/users. Dari pengguna yang terdaftar, buka salah satu yang terkait dengan domain yang ingin Anda ubah.
  3. Di sini, ada httpd.conffile. Buat cadangan darinya:

    cp httpd.conf httpd.conf.back
    
  4. Sekarang edit file konfigurasi dengan editor pilihan Anda. Misalnya, edit yang ada open_basedirke none. Jangan mencoba untuk menghapus sesuatu, atau Anda mungkin mengalami downtime. Simpan file setelah mengedit.

  5. Mulai ulang server web Apache menggunakan salah satu cara berikut (gunakan sudojika perlu):

    httpd -k graceful
    apachectl -k graceful
    apache2 -k graceful
    
  6. Jika Anda mengalami kesalahan, ganti file konfigurasi utama dengan file cadangan, dan mulai ulang server web.

Sekali lagi, solusi pertama adalah yang lebih disukai, dan Anda tidak boleh mencoba metode kedua pada saat pertama. Seperti yang dicatat dalam peringatan, keuntungan dari cara pertama adalah mencegah penyimpanan barang Anda yang dikonfigurasi dengan buruk.

Semoga membantu!

MAChitgarha
sumber
0

Saya menggunakan Apache vhost -File untuk menjalankan PHP dengan opsi ini khusus aplikasi di server windows saya. Oleh karena itu saya menggunakan -d opsi dari perintah php.

Saya menyetel open_basedir untuk setiap aplikasi sebagai salah satu opsi ini.

Saya perlu mengatur beberapa url sebagai open_basedir, termasuk UNC-Path , dan sintaks untuk kasus ini agak sulit ditemukan. Anda harus memisahkan jalur dengan titik koma dan jika jalur pertama Anda dimulai dengan driveletter, Anda mungkin harus memulai daftar dengan titik koma juga. Setidaknya itulah yang berhasil untuk saya.

Contoh:

php.exe -d open_basedir=;d:/www/applicationRoot;//internal.unc.path/ressource/
Fanax
sumber
-3

Cari saja

open_basedir =

di php.ini dan nonaktifkan. Itulah solusi paling sederhana untuk mengatasi masalah ini.

Sebelum Perubahan open_basedir =

Setelah Perubahan ;open_basedir =

Ps - Setelah perubahan jangan lupa restart server Anda.

Nikmati ;)

Lalit Giriya
sumber
3
jangan lakukan ini ... keamanan, percaya atau tidak, penting. :) Saatnya membaca dokumen tentang alat Anda: php.net/manual/en/ini.core.php#ini.open-basedir
Adam Lenda