move_uploaded_file khiến cho lỗi không thể mở luồng: Quyền bị từ chối lỗi lỗi


142

Tôi liên tục gặp lỗi này khi cố gắng định cấu hình thư mục tải lên với Apache 2.2 và PHP 5.3 trên CentOS.

Trong php.ini:

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

Trong 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>

Quyền thư mục 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

Bất kể tôi làm gì, tôi vẫn nhận được lỗi này từ PHP khi tôi tải tệp lên:

Cảnh báo: move_uploaded_file (hình ảnh / robot.jpg): không thể mở luồng: Quyền bị từ chối trong /var/www/html/mysite/ Process.php trên dòng 78

Cảnh báo: move_uploaded_file (): Không thể di chuyển '/ tmp / phpsKD2Qm' sang 'hình ảnh / robot.jpg' trong /var/www/html/mysite/ Process.php trên dòng 78

Như bạn có thể thấy, nó chưa bao giờ lấy cấu hình từ tệp php.ini liên quan đến tệp tải lên.

Tôi làm gì sai ở đây?


775? Có lẽ máy chủ của bạn đang chạy như không có ai. Chỉ root mới có thể viết trong trường hợp này (quyền "hình ảnh" của bạn) ...
Konrad Borowski

nó có nghĩa là gì ? Làm thế nào tôi có thể thay đổi nó?
dùng63898

Hãy nhớ rằng TẤT CẢ các thư mục mẹ cũng cần phải có quyền.
Sridhar Sarnobat

Câu trả lời:


187

Điều này là do imagestmp_file_uploadchỉ có thể ghi bởi rootngười dùng. Để tải lên để làm việc, chúng ta cần làm cho chủ sở hữu của các thư mục đó giống như chủ sở hữu quy trình httpd HOẶC làm cho chúng có thể ghi trên toàn cầu (thực tiễn xấu).

  1. Kiểm tra chủ sở hữu quá trình apache : $ps aux | grep httpd. Cột đầu tiên sẽ là chủ sở hữu, thông thườngnobody
  2. Thay đổi chủ sở hữu imagestmp_file_uploadtrở thành nobodyhoặc bất kỳ chủ sở hữu nào bạn tìm thấy trong bước 1.

    $sudo chown nobody /var/www/html/mysite/images/
    
    $sudo chown nobody /var/www/html/mysite/tmp_file_upload/
  3. Chmod imagestmp_file_uploadbây giờ có thể ghi được bởi chủ sở hữu, nếu cần [Có vẻ như bạn đã có sẵn thứ này]. Được đề cập trong câu trả lời @Dmitry Teplyakov.

    $ sudo chmod -R 0755 /var/www/html/mysite/images/
    
    $ sudo chmod -R 0755 /var/www/html/mysite/tmp_file_upload/
  4. Để biết thêm chi tiết lý do tại sao hành vi này xảy ra, hãy xem hướng dẫn http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir , lưu ý rằng nó cũng nói về open_basedirchỉ thị.


4
Cảm ơn: chủ cũ của chúng tôi đã là daemon, bây giờ là apache
zzapper

Khắc phục sự cố này áp dụng cho các tình huống mà bạn có thể đã thay đổi loại máy chủ php từ fast_CGI, CGI sang Apache_mod dưới dạng plesk, v.v. có thể tiếp tục với quyền của người dùng ban đầu không phải là apache. Điều này đã khắc phục vấn đề của tôi.
elliotrock

Tôi có lỗi tương tự nhưng cả quá trình và thư mục đều thuộc sở hữu của jacobtôi (vì tôi là máy cục bộ của tôi) và tất cả các thư mục đều có 755hoặc 775.
limeandcocovy 8/2/2015

Tôi đã phải khởi động lại quá trình apache của mình sudo service httpd restartsau khi thay đổi quyền. Sau đó, nó hoạt động :) Thay vì thay đổi chủ sở hữu, chowntôi đã thêm quy trình apache của mình vào nhóm 'www' và thêm các thư mục này vào cùng nhóm 'www' thông quachgrp
Ali Saeed

76

Bạn cũng có thể chạy tập lệnh này để tìm ra chủ sở hữu quy trình Apache:

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

Và sau đó thay đổi chủ sở hữu của thư mục đích thành những gì bạn đã có. Sử dụng lệnh:

chown user destination_dir

Và sau đó sử dụng lệnh

chmod 755 destination_dir

để thay đổi sự cho phép thư mục đích.


3
Cảm ơn nó làm việc cho tôi. Lần đầu tiên tôi sử dụng phương pháp của Laith Shadeed nhưng tôi không nhận được kết quả tương tự khi gõ ps aux | grep httpd<?php echo exec('whoami'); ?>. Có ai biết tại sao không ?
bán đảo

1
ps phụ | grep https không trả lại tên chủ sở hữu máy chủ web. Điều này không: ps phụ | grep -E '[a] pache | [h] ttpd | [_] www | [w] ww-data | [n] ginx' | root grep -v | đầu -1 | cắt -d \ -f1 Fron Symfony doc.
David Jacquel

1
Lưu ý rằng trong lệnh trên, cần có hai khoảng trắng giữa "-d \" và "-f1". Nếu bạn sao chép-dán nguyên trạng, bạn có thể gặp lỗi như "cut: bad delimiter".
Beejor

1
cộng 1 cho exec('whoami'). Cứu tôi thêm 30 phút nữa. đã sử dụng người dùng Ubuntu
Deval Khandelwal

11
điều này nên được www-data? thường
maxisme

18

Nếu bạn có Mac OS X, hãy truy cập thư mục gốc hoặc thư mục của trang web của bạn.

Sau đó nhấp chuột phải vào nó, đi để lấy thông tin, đi đến tận cùng ( Chia sẻ & Quyền ), mở nó, thay đổi tất cả chỉ đọc để đọc và viết. Đảm bảo mở ổ khóa, đi đến biểu tượng cài đặt và chọn Áp dụng cho các mục kèm theo ...


Tại sao bạn bình luận về Mac OS khi câu hỏi của anh ấy là về một hệ thống Linux?
Kmeixner 15/03/2016

7
Xin chào Hawkar, cảm ơn bạn đã trả lời. Tôi đang trên mac và câu trả lời của bạn đã giải quyết vấn đề của tôi. Cảm ơn rất nhiều.
Sanjay Sharma

2
Thích câu trả lời này
Alexey Sh.

2
@Kmeixner câu hỏi này về Linux nhưng tôi gặp vấn đề tương tự trên OSX. Cảm ơn vì nhận xét này, nó đã hoạt động với tôi sau khi tôi thay đổi tùy chọn viết trong thư mục /private/var/tmptrên máy Mac.
Salam

Đây là một bài viết cũ hơn, nhưng đó là chính xác những gì tôi cần làm. THanks
TheRobQ

14

Điều này làm việc cho tôi.

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

Sau đó đăng xuất hoặc khởi động lại.

Nếu SELinuxphàn nàn, hãy thử những điều sau đây

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

đã cứu mạng tôi :) .. tôi sử dụng hook post-recive GIT để triển khai web của mình và mỗi lần tôi triển khai tôi đều nhận được sự cho phép của anh ấy từ chối, thêm người dùng git vào www-data đã sửa nó :) cảm ơn bạn
Zalaboza

Đây là câu trả lời tốt nhất.
saviour123

12

Tôi muốn thêm điều này vào các đề xuất trước đó. Nếu bạn đang sử dụng phiên bản Linux đã bật SELinux thì bạn cũng nên thực hiện điều này trong trình bao:

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

Cùng với việc cấp quyền cho người dùng máy chủ web của bạn thông qua nhóm hoặc thay đổi chủ sở hữu của thư mục.


restorecon -R -v /path/to/your/directorycó lẽ cũng cần được đưa vào trong này sau đó. access.redhat.com/documentation/en-US/Red_Hat_ Entryprise_Linux / từ
Tuyệt

rất có thể đúng, nhưng tôi đã giả định rằng chcon "thay đổi bối cảnh" tức là nó đã được thay đổi. những gì bạn đang xem sử dụng "semanage fcontext" trước tiên sẽ đặt nó vào một số tệp cài đặt "file_contexts.local", tuy nhiên nó không bao giờ thay đổi ngữ cảnh.
Chris

@Chris, Cảm ơn người đàn ông. Điều này đã giải quyết vấn đề của tôi. Bạn vui lòng làm sáng tỏ vấn đề? Lệnh này thực sự làm gì? Tôi đã xem qua các trang hướng dẫn và thậm chí thông tin về chcon và không tìm thấy giá trị của loại bạn đã nhập. Tôi có một chút bối rối ở đây.
đùa

nó làm cho thư mục hoặc tập tin có thể đọc được bởi máy chủ web (httpd) ... tôi thực sự không muốn và có lẽ không thể giải thích selinux vì tôi hầu như không hiểu gì về nó ... vui lòng xem nsa.gov/what-we-do / nghiên cứu / selinux / tài liệuaccess.redhat.com/documentation/en-us/red_hat_enterprise_linux/ mẹo
Chris

11

Thay đổi quyền cho thư mục này

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


1
đã làm nó bây giờ nó như: drwxrwxr-x 2 root root 4096 ngày 11 tháng 11 10:01 hình ảnh cũng trên: root drwxrwxr-x 2 gốc 4096 12 tháng 11 04:54 tmp_file_upload nhưng vẫn báo lỗi tương tự
user63898

7

Thử cái này:

  1. mở / etc / apache2 / envvars

    sudo gedit /etc/apache2/envvars
  2. thay thế www-databằngyour_username

    "export APACHE_RUN_USER=www-data" 

    thay thế bằng

    export APACHE_RUN_USER='your_username' 

7

Tôi gặp vấn đề liên quan này ngay cả khi đã chạy thành công nhà soạn nhạc. Tôi đã cập nhật trình soạn nhạc và khi chạy composer installhoặc php composer.phar installtôi nhận được:

... không thể mở luồng: Quyền bị từ chối ...

Hóa ra sau nhiều nghiên cứu rằng các câu trả lời trước đó liên quan đến việc thay đổi quyền cho thư mục đã hoạt động. Chúng chỉ là các thư mục hơi khác nhau bây giờ.

Trong bản cài đặt của tôi, trên OS X, tệp bộ đệm nằm trong /Users/[USER]/.composer/cachevà tôi gặp sự cố vì tệp bộ đệm được sở hữu bởi root. Thay đổi quyền sở hữu '.composer' theo cách đệ quy cho người dùng của tôi đã giải quyết được vấn đề.

Đây là những gì tôi đã làm:

sudo chown -R [USER] cache

Sau đó, tôi chạy cài đặt nhà soạn nhạc một lần nữa và thì đấy!


5

Vấn đề này xảy ra khi người dùng apache (www-data) không có quyền ghi vào thư mục. Để giải quyết vấn đề này, bạn cần đặt người dùng vào trong dữ liệu www của nhóm.

Tôi chỉ làm điều này:

Thực thi mã php này <?php echo exec('whoami'); ?>để khám phá người dùng được sử dụng bởi apache. Sau đó, thực hiện các lệnh trong thiết bị đầu cuối:

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

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

Nó sẽ trả về một cái gì đó như thế này:

total of files

drwxr-xr-x 7 user group size date folder

Tôi đã giữ người dùng nhưng đã thay đổi nhóm thành dữ liệu www

chown -R user:www-data yourprojectfoldername

chmod 775 yourprojectfoldername

4

Giải pháp rất dễ dàng. Chỉ nhấp chuột phải vào thư mục IMAGE (đích), đi đến thuộc tính, nhấp vào tab quyền và thay đổi quyền truy cập khác để tạo và xóa tệp .


Cách nhanh nhất NHƯNG, chỉ có bạn đang sử dụng GUI cho FTP (FileZilla, WinSCP)
CLOUGH

3

Chỉ cần thay đổi quyền của tmp_file_upload thành 755 Sau đây là lệnh chmod -R 755 tmp_file_upload


2

Thử cái này

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


nhận: chmod: thiếu toán hạng sau `664 '
user63898
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.