move_uploaded_file ให้ข้อผิดพลาด“ ไม่สามารถเปิดสตรีม: การอนุญาตถูกปฏิเสธ”


143

ฉันได้รับข้อผิดพลาดนี้เมื่อพยายามกำหนดค่าไดเรกทอรีอัปโหลดด้วย Apache 2.2 และ PHP 5.3 บน CentOS

ใน php.ini:

upload_tmp_dir = /var/www/html/mysite/tmp_file_upload/

ใน httpd.conf:

Directory /var/www/html/mysite/tmp_file_upload/>
    Options  -Indexes
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>
<Directory /var/www/html/mysite/images/>
                Options -Indexes
</Directory>

สิทธิ์ของไดเรกทอรี CentOS:

drwxrwxr-x 2 root root 4096 Nov 11 10:01 images
drwxr-xr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload

ไม่ว่าฉันจะทำอะไรฉันจะได้รับข้อผิดพลาดนี้จาก PHP เมื่อฉันอัพโหลดไฟล์:

คำเตือน: move_uploaded_file (images / robot.jpg): ไม่สามารถเปิดสตรีม: ปฏิเสธสิทธิ์ใน /var/www/html/mysite/process.php ที่บรรทัด 78

คำเตือน: move_uploaded_file (): ไม่สามารถย้าย '/ tmp / phpsKD2Qm' เป็น 'images / robot.jpg' ใน /var/www/html/mysite/process.php ที่บรรทัด 78

อย่างที่คุณเห็นมันไม่เคยใช้การกำหนดค่าจากไฟล์ php.ini เกี่ยวกับไฟล์อัปโหลด

ฉันทำอะไรผิดที่นี่


775? บางทีเซิร์ฟเวอร์ของคุณกำลังทำงานเป็นไม่มีใคร เฉพาะรากเท่านั้นที่สามารถเขียนได้ในกรณีนี้ (สิทธิ์ "ภาพ" ของคุณ) ...
Konrad Borowski

มันหมายความว่าอะไร? ฉันจะเปลี่ยนมันได้อย่างไร
user63898

โปรดจำไว้ว่าไดเรกทอรีหลักทั้งหมดต้องได้รับการอนุญาตที่ถูกต้องด้วย
Sridhar Sarnobat

คำตอบ:


188

นี่เป็นเพราะimagesและtmp_file_uploadเขียนโดยrootผู้ใช้เท่านั้น สำหรับการอัปโหลดไปยังที่ทำงานเราจำเป็นต้องทำให้เจ้าของโฟลเดอร์เหล่านั้นเหมือนกับเจ้าของกระบวนการ httpd หรือทำให้พวกเขาสามารถเขียนได้ทั่วโลก

  1. ตรวจสอบการใช้กระบวนการ $ps aux | grep httpdApache: คอลัมน์แรกจะเป็นเจ้าของโดยทั่วไปแล้วจะเป็นnobody
  2. เปลี่ยนเจ้าของimagesและtmp_file_uploadจะเป็นnobodyหรือสิ่งที่คุณพบในขั้นตอนที่ 1

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagesและtmp_file_uploadตอนนี้จะเขียนโดยเจ้าของถ้าจำเป็น [ดูเหมือนว่าคุณมีอยู่ในสถานที่] พูดถึงใน @Dmitry Teplyakov คำตอบ

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
    
  4. สำหรับรายละเอียดเพิ่มเติมว่าทำไม happend พฤติกรรมนี้ให้ตรวจสอบคู่มือhttp://php.net/manual/en/ini.core.php#ini.upload-tmp-dirทราบว่ามันยังพูดคุยเกี่ยวกับopen_basedirคำสั่ง


4
ขอบคุณ: เจ้าของเก่าของเราเคยเป็นภูตมันเป็นอาปาเช่แล้ว
zzapper

การแก้ไขนี้ใช้กับสถานการณ์ที่คุณอาจเปลี่ยนประเภทเซิร์ฟเวอร์ php จาก fast_CGI, CGI เป็น Apache_mod เป็น plesk ฯลฯ สามารถดำเนินการต่อด้วยสิทธิ์ของผู้ใช้ดั้งเดิมไม่ใช่ apache นี่เป็นการแก้ไขปัญหาของฉัน
elliotrock

1
ฉันมีข้อผิดพลาดเดียวกันนี้ แต่ทั้งกระบวนการและโฟลเดอร์เป็นเจ้าของโดยjacob(ฉันมันเป็นเครื่องท้องถิ่นของฉัน) และโฟลเดอร์ทั้งหมดที่มีหรือ755 775
limeandcoconut

ฉันต้องเริ่มกระบวนการ apache ใหม่sudo service httpd restartหลังจากเปลี่ยนสิทธิ์ จากนั้นก็ทำงาน :) แทนที่จะเปลี่ยนเจ้าของchownฉันเพิ่มกระบวนการ Apache ของฉันไปยังกลุ่ม 'www' และเพิ่มไดเรกทอรีเหล่านี้ไปยังกลุ่ม 'www' เดียวกันผ่านchgrp
Ali Saeed

76

คุณยังสามารถเรียกใช้สคริปต์นี้เพื่อค้นหาเจ้าของกระบวนการ Apache:

<?php echo exec('whoami'); ?>

จากนั้นเปลี่ยนเจ้าของไดเรกทอรีปลายทางเป็นสิ่งที่คุณมี ใช้คำสั่ง:

chown user destination_dir

จากนั้นใช้คำสั่ง

chmod 755 destination_dir

เพื่อเปลี่ยนการอนุญาตไดเรกทอรีปลายทาง


3
ขอบคุณมันใช้งานได้สำหรับฉัน ฉันใช้วิธีของ Laith Shadeed เป็นครั้งแรก แต่ฉันไม่ได้ผลลัพธ์เดียวกันเมื่อพิมพ์ps aux | grep httpd<?php echo exec('whoami'); ?>และ ไม่มีใครรู้ว่าทำไม
kuk Peninsula

1
ps aux | grep httpsไม่ส่งคืนชื่อเจ้าของเว็บเซิร์ฟเวอร์ สิ่งนี้: ps aux | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | grep -v root | หัว -1 | ตัด -d \ -f1 Fron Symfony doc
David Jacquel

1
โปรดทราบว่าในคำสั่งข้างต้นควรมีช่องว่างสองช่องระหว่าง "-d \" และ "-f1" หากคุณคัดลอกวางตามที่เป็นอยู่คุณอาจได้รับข้อผิดพลาดเช่น "ตัด: ตัวคั่นที่ไม่ดี"
Beejor

1
บวก 1 exec('whoami')สำหรับ ช่วยฉันอีก 30 นาที ผู้ใช้งาน chowning อูบุนตู
Deval Khandelwal

11
ควรจะเป็นwww-dataอย่างไร โดยปกติ
maxisme

18

หากคุณมี Mac OS X ให้ไปที่รูทไฟล์หรือโฟลเดอร์ของเว็บไซต์ของคุณ

จากนั้นคลิกขวาที่มันไปรับข้อมูลไปที่ด้านล่างสุด ( การแชร์และการอนุญาต ) เปิดสิ่งนั้นเปลี่ยนทั้งหมดแบบอ่านอย่างเดียวเพื่ออ่านและเขียน อย่าลืมเปิดกุญแจไปที่ไอคอนการตั้งค่าและเลือกนำไปใช้กับรายการที่แนบมา ...


ทำไมคุณถึงแสดงความคิดเห็นใน Mac OS เมื่อคำถามของเขาเกี่ยวกับระบบ Linux
Kmeixner

7
สวัสดี Hawkar ขอบคุณสำหรับคำตอบของคุณ ฉันใช้ mac และคำตอบของคุณแก้ไขปัญหาของฉันได้ ขอบคุณมาก.
Sanjay Sharma

2
รักคำตอบนี้
Alexey Sh

2
@ Kmeixner คำถามนี้เกี่ยวกับ Linux แต่ฉันมีปัญหาเดียวกันใน OSX ของฉัน ขอบคุณสำหรับความคิดเห็นนี้มันใช้งานได้หลังจากที่ฉันเปลี่ยนตัวเลือกการเขียนในโฟลเดอร์/private/var/tmpบน Mac ของฉัน
ลาม

นี่คือการโพสต์เก่า แต่ที่ว่าสิ่งที่ผมต้องทำ ขอบคุณ
TheRobQ

14

สิ่งนี้ใช้ได้สำหรับฉัน

sudo adduser <username> www-data
sudo chown -R www-data:www-data /var/www
sudo chmod -R g+rwX /var/www

จากนั้นออกจากระบบหรือรีบูต

หากมีSELinuxปัญหาให้ลองทำดังนี้

sudo semanage fcontext -a -t httpd_sys_rw_content_t '/var/www(/.*)?'
sudo restorecon -Rv '/var/www(/.*)?'

ช่วยชีวิตฉัน :) .. ฉันใช้ GIT post-recive hook เพื่อปรับใช้เว็บของฉันและทุกครั้งที่ฉันติดตั้งฉันได้รับอนุญาตจากเขาปฏิเสธข้อผิดพลาดเพิ่มผู้ใช้ git ไปที่ www-data แก้ไขมัน :) ขอบคุณ
Zalaboza

นี่คือคำตอบที่ดีที่สุด
saviour123

13

ฉันต้องการเพิ่มสิ่งนี้ลงในคำแนะนำก่อนหน้า หากคุณใช้ Linux เวอร์ชันที่เปิดใช้งานSELinuxคุณควรดำเนินการในเชลล์ด้วย:

chcon -R --type httpd_sys_rw_content_t /path/to/your/directory

พร้อมกับให้สิทธิ์ผู้ใช้เว็บเซิร์ฟเวอร์ของคุณผ่านกลุ่มหรือการเปลี่ยนเจ้าของไดเรกทอรี


restorecon -R -v /path/to/your/directoryอาจจะต้องรวมอยู่ในนี้หลังจากนั้น access.redhat.com/documentation/th-US/Red_Hat_Enterprise_Linux/…
AbsoluteƵERØ

อาจเป็นจริงได้เป็นอย่างดี แต่ฉันอยู่ภายใต้สมมติฐานที่ว่า chcon "เปลี่ยนบริบท" นั่นคือมันเพิ่งเปลี่ยนไป สิ่งที่คุณกำลังดูใช้ "semanage fcontext" ก่อนซึ่งวางไว้ในไฟล์การตั้งค่าบางอย่าง "file_contexts.local" แต่มันไม่เคยเปลี่ยนบริบท
คริส

@ Chris, ขอบคุณชาย นี่เป็นการแก้ไขปัญหาของฉัน คุณช่วยส่องแสงในเรื่องนี้ได้ไหม จริง ๆ แล้วคำสั่งนี้ทำอะไร? ฉันไปที่หน้าคนและแม้แต่ข้อมูลสำหรับ chcon และไม่พบคุณค่าของประเภทที่คุณป้อน ฉันสับสนเล็กน้อยที่นี่
โจ๊ก

มันทำให้ไดเรกทอรีหรือไฟล์ที่อ่านได้โดยเว็บเซิร์ฟเวอร์ (httpd) ... ฉันไม่ต้องการและอาจจะไม่สามารถอธิบาย selinux เพราะฉันแทบจะไม่เข้าใจในตัวเอง ... โปรดดูnsa.gov/what-we-do / research / selinux / เอกสาร และaccess.redhat.com/documentation/en-us/red_hat_enterprise_linux/…
Chris

11

เปลี่ยนการอนุญาตสำหรับโฟลเดอร์นี้

# chmod -R 0755 /var/www/html/mysite/images/


1
ทำตอนนี้มันเหมือน: drwxrwxr-x 2 root root 4096 Nov 11 10:01 รูปภาพบน: drwxrwxr-x 2 root root 4096 Nov 12 04:54 tmp_file_upload แต่ก็ยังมีข้อผิดพลาดเดียวกัน
user63898

7

ลองสิ่งนี้:

  1. เปิด / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. แทนที่www-dataด้วยของคุณyour_username

    "export APACHE_RUN_USER=www-data" 

    แทนที่ด้วย

    export APACHE_RUN_USER='your_username' 

7

ฉันพบปัญหาที่เกี่ยวข้องนี้แม้หลังจากประสบความสำเร็จในการเรียกใช้ผู้แต่ง ฉันอัพเดทนักแต่งเพลงและเมื่อทำงานcomposer installหรือphp composer.phar installได้รับ:

... ไม่สามารถเปิดสตรีม: ปฏิเสธสิทธิ์ ...

ปรากฎว่ามีงานวิจัยมากมายที่คำตอบก่อนหน้านี้เกี่ยวกับการเปลี่ยนการอนุญาตสำหรับโฟลเดอร์ทำงาน พวกเขาเป็นเพียงไดเรกทอรีที่แตกต่างกันเล็กน้อยในขณะนี้

ในการติดตั้งของฉันบน OS X มีไฟล์แคชอยู่/Users/[USER]/.composer/cacheและฉันมีปัญหาเพราะไฟล์แคชนั้นเป็นของรูต การเปลี่ยนความเป็นเจ้าของ '. composer' ซ้ำ ๆ ให้กับผู้ใช้ของฉันแก้ไขปัญหาได้แล้ว

นี่คือสิ่งที่ฉันทำ:

sudo chown -R [USER] cache

จากนั้นฉันก็ติดตั้งนักแต่งเพลงอีกครั้งแล้วก็ voila


5

ปัญหานี้เกิดขึ้นเมื่อผู้ใช้ apache (www-data) ไม่ได้รับอนุญาตให้เขียนลงในโฟลเดอร์ ในการแก้ปัญหานี้คุณต้องใส่ผู้ใช้ไว้ในกลุ่ม www-data

ฉันเพิ่งทำสิ่งนี้:

เรียกใช้งานโค้ด php นี้<?php echo exec('whoami'); ?>เพื่อค้นหาผู้ใช้ที่ apache ใช้ หลังจากนั้นให้รันคำสั่งในเทอร์มินัล:

user@machine:/# cd /var/www/html

user@machine:/var/www/html# ls -l

มันจะกลับมาดังนี้:

total of files

drwxr-xr-x 7 user group size date folder

ฉันเก็บผู้ใช้ไว้ แต่เปลี่ยนกลุ่มเป็น www-data

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

การแก้ปัญหาเป็นเรื่องง่ายมาก เพียงคลิกขวาที่โฟลเดอร์ IMAGE (ปลายทาง) ไปที่คุณสมบัติคลิกแท็บการอนุญาตและเปลี่ยนการเข้าถึงเพื่อสร้างและลบไฟล์อื่น ๆ


วิธีที่เร็วที่สุด แต่มีเพียงคุณเท่านั้นที่ใช้ GUI สำหรับการ FTP (FileZilla, WinSCP)
CLOUGH

3

เพียงแค่เปลี่ยนการอนุญาตของ tmp_file_upload เป็น 755 กำลังติดตามอยู่คือคำสั่ง chmod -R 755 tmp_file_upload


2

ลองสิ่งนี้

find /var/www/html/mysite/images/ -type f -print0 | xargs -0 chmod -v 664


ได้รับ: chmod: ขาดตัวถูกดำเนินการหลังจาก `664 '
user63898
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.