PHP mkdir: Sự cố bị từ chối quyền


99

Tôi cố gắng để tạo ra một thư mục có chức năng mkdir PHP nhưng tôi nhận được một lỗi như sau: Warning: mkdir() [function.mkdir]: Permission denied in .... Làm thế nào để giải quyết vấn đề?


2
Nền tảng / máy chủ web / hệ điều hành?
Salman A

1
hãy kiểm tra câu hỏi này: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir Tôi đang gặp sự cố tương tự và câu trả lời ở đây vừa khắc phục sự cố của tôi. Nếu bạn đang chạy trên linux, câu trả lời ở đó về SELinux có thể áp dụng cho bạn.
Lucas Madureira

Câu trả lời:


171

Tôi biết đây là một chủ đề cũ, nhưng nó cần một câu trả lời tốt hơn. Bạn không cần phải đặt quyền thành 777, đó là một vấn đề bảo mật vì nó cấp quyền truy cập đọc và ghi cho thế giới. Có thể người dùng apache của bạn không có quyền đọc / ghi trên thư mục.

Đây là những gì bạn làm trong Ubuntu

  1. Đảm bảo rằng tất cả các tệp đều thuộc sở hữu của nhóm Apache và người dùng. Trong Ubuntu, nó là nhóm dữ liệu www và người dùng

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

  2. Tiếp theo, cho phép tất cả các thành viên của nhóm dữ liệu www đọc và ghi tệp

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

Hàm php mkdir()bây giờ sẽ hoạt động mà không trả về lỗi


3
Câu trả lời tốt! Hy vọng rằng điều này sẽ được đưa lên đầu trang theo thời gian!
Rất bất thường


Apache cần quyền để ghi những thứ như bộ nhớ cache và nhật ký ... vấn đề chỉ là tinh chỉnh.
Manatax

@simpleengine Xin chào, tôi đã nhận thấy câu trả lời của bạn .. Tôi đang gặp phải vấn đề tương tự với một dự án mà tôi đang cố gắng tạo trong CodeIgnter và đang phát triển trong Ubuntu 14.14 Lts .. Bạn có thể vui lòng giải thích cho tôi thêm về các bước tôi cần làm không làm gì để khắc phục lỗi này ??? Để cung cấp cho bạn một số thông tin bổ sung: đường dẫn tuyệt đối là /opt/lampp/htdocs/www/my-app/public/uploads.. Về cơ bản những gì tôi đang cố gắng làm là mọi người dùng đã đăng nhập tải lên tệp bên trong thư mục tải lên và cũng tạo thư mục album (điều này sẽ được thực hiện với php) để lưu trữ ảnh ..
ltdev

5
Tôi không thích những người dùng tiếp tục nói rằng "nó không an toàn" mà không chỉ ra cách làm việc an toàn.
che-azeh

38

Câu trả lời muộn cho những người tìm thấy điều này qua google trong tương lai. Tôi đã gặp phải vấn đề tương tự.

LƯU Ý: TÔI ĐANG TRÊN MAC OSX LION

Điều xảy ra là apache đang được chạy với tư cách người dùng "_www" và không có quyền chỉnh sửa bất kỳ tệp nào. Bạn sẽ nhận thấy KHÔNG có chức năng hệ thống tệp nào hoạt động thông qua php.

Làm thế nào để khắc phục:

Mở cửa sổ công cụ tìm kiếm và từ thanh menu, chọn Đi> Đi tới Thư mục> / private / etc / apache2

bây giờ hãy mở httpd.conf

tìm thấy:

User _www 
Group _www

thay đổi tên người dùng:

User <YOUR LOGIN USERNAME>

Bây giờ khởi động lại apache bằng cách chạy thiết bị đầu cuối biểu mẫu này:

sudo apachectl -k restart

Nếu nó vẫn không hoạt động, tôi tình cờ làm như sau trước khi tôi làm ở trên. Có thể liên quan.

Mở terminal và chạy các lệnh sau: (lưu ý, tệp máy chủ web của tôi được đặt tại / Library / WebServer / www. Thay đổi theo vị trí trang web của bạn)

sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*

6
Giải pháp này hoạt động, nhưng cho phép Apache tàn phá hệ thống của bạn nếu ai đó có được nó để thực thi mã độc hại (ví dụ: thông qua khai thác Shellshock). Một giải pháp thay thế là để Apache đang thực thi _wwwvà tạo một nhóm cho bạn và Apache. Tạo một nhóm mới, giả sử được gọi trusted, và đặt bạn và _wwwtham gia. Sau đó đặt đáng tin cậy làm chủ sở hữu nhóm của tất cả các tệp trong thư mục tài liệu máy chủ của bạn. Cuối cùng, chỉ làm những việc chmod g+rwxcần thiết đối với các tệp mà Apache cần quyền truy cập để trustednhóm có quyền chỉnh sửa tệp.
Chris Middleton

3
chỉ cần nhấn mạnh lại rằng câu trả lời này là một ý tưởng tồi. có nhiều lý do chính đáng rằng các quy trình apache được sở hữu bởi người dùng có mục đích đặc biệt của riêng họ.
danyamachine

15

Không đặt quyền thành 777 khi sử dụng mkdir trong PHP

Các câu trả lời chỉ liên kết không được coi là phương pháp hay trên StackOverflow, nhưng lời khuyên được đưa ra ở đây thường KHÔNG nên theo dõi.

Tôi muốn quay lại câu trả lời tuyệt vời này cho một câu hỏi tương tự . Tôi trích dẫn:

Vui lòng ngừng đề xuất sử dụng 777. Bạn đang làm cho mọi người có thể ghi tệp của mình, điều này có nghĩa là bạn mất tất cả bảo mật mà hệ thống cấp phép được thiết kế. Nếu bạn đề xuất điều này, hãy nghĩ về những hậu quả mà nó có thể gây ra trên một máy chủ web được cấu hình kém: nó sẽ trở nên cực kỳ dễ dàng để "hack" trang web, bằng cách ghi đè các tệp. Vì vậy, đừng.


9

Sửa các quyền của thư mục mà bạn cố gắng tạo một thư mục trong đó .


Tôi vừa giải quyết vấn đề trong câu hỏi ban đầu bằng cách thay đổi quyền tệp thành 755 một cách đệ quy, sử dụng Filezilla. Nhấp chuột phải vào thư mục mẹ, giả sử đó là một số loại thư mục lưu trữ tệp chung, bạn có thể đặt quyền 755 trên đó, sau đó là Thuộc tính tệp -> Giá trị số -> 755, sau đó chọn "Đệ quy vào thư mục con". Mất vài phút để truyền qua các thư mục con nếu bạn có nhiều tệp. Sau đó, hãy thử lại.
TARKUS

7

Tôi biết rằng chủ đề này đã cũ, nhưng có lẽ điều này sẽ giúp ích cho ai đó, một ngày nào đó.

Vấn đề tại sao PHP nói "Quyền bị từ chối" cho mkdir () - đường dẫn url sai. Vì vậy, để sửa nó, tất cả những gì bạn cần là có được đường dẫn chính xác. Tôi đã làm theo cách này:

<?php

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

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

?>

1
Đã xảy ra với tôi khi chuyển sang một máy chủ mới (có mysqlnd lol). Tôi đã quên chuyển sang đường dẫn thư mục chính đầy đủ mới. Hóa ra nó không thực sự là một vấn đề về quyền.
JSG

2

Bạn cần có quyền hệ thống tệp để tạo thư mục.

Ví dụ: Trong Ubuntu 10.04, apache (php) chạy với tư cách người dùng: www-data trong nhóm: www-data

Có nghĩa là người dùng www-data cần quyền truy cập để tạo thư mục.

Bạn có thể tự mình thử điều này bằng cách sử dụng: 'su www-data' để trở thành người dùng www-data.

Để khắc phục nhanh chóng, bạn có thể thực hiện: sudo chmod 777 my_parent_dir


14
chmod 0777sẽ cho phép đọc và ghi quyền truy cập vào thế giới! Bạn không nên khuyên những điều như thế. Tuy nhiên, lời khuyên với nhóm người dùng hiện là tốt nhất ở đây :)
KingCrunch

1
Nếu thế giới có quyền truy cập vào hệ điều hành, chắc chắn. Cách tốt hơn sẽ là: sudo chown www-data: www-data my_parent_dir
Jon Skarpeteig Ngày

Hoặc để nguyên các quyền và thêm dữ liệu www vào nhóm của thư mục mẹ.
Marc B

0

Điều khác bạn có thể làm là truy cập: / etc / sudoers

Có thêm dòng sau để cấp quyền cho người dùng đó www-data ALL = (ALL: TẤT CẢ) TẤT CẢ Tại sao lại có www-data? điều này là do apache đang chạy bởi tên người dùng này.

Trong trường hợp nếu người dùng của bạn khác thì hãy thử tên người dùng ALL = (ALL: TẤT CẢ) TẤT CẢ

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


5
không chỉnh sửa sudoerstrực tiếp, nhưng đăng nhập với quyền root và sử dụng visudolệnh te : kiểm tra bất kỳ thay đổi nào để tránh các chỉnh sửa bị lỗi, có thể gây ra lỗi phân tích cú pháp khi tệp sudoers được tải, điều này có thể khiến bạn bất lực (vì không có quyền thay đổi bất cứ điều gì)
Elias Van Ootegem 21/12/12

Cách tìm tên người dùng. như www-data? Tôi đang sử dụng nginx nhưng không hoạt động
robspin

1
@robspin hãy thử cái này: ps aux | egrep '(nginx)'
maxwells

0

Vì bạn đang sử dụng mac, bạn có thể thêm mình vào nhóm _www (nhóm người dùng apache) trên mac của mình:

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

và thêm người dùng _www vào nhóm bánh xe, đây dường như là thứ mà mac tạo tệp dưới dạng:

sudo dseditgroup -o edit -a _www -t user wheel

0

Tôi gặp sự cố này ngay bây giờ, giải pháp tốt nhất của tôi mà tôi có thể cung cấp cho bạn ngay bây giờ (mặc dù bạn không bao gồm bất kỳ mã nào của mình) sẽ là:

  1. Kiểm tra cách bạn đặt tên cho thư mục đích của mình, ví dụ: new_folder (đôi khi điều này có thể gây ra lỗi cho phép vì hầu hết các máy chủ không cho phép tạo tên bằng dấu gạch dưới, dấu gạch ngang, v.v. trong thời gian chạy). Nó đã làm việc cho tôi.
  2. Nếu bạn đang sử dụng lệnh đệ quy để tạo các thư mục con, đừng quên đặt 0755 (nhớ thêm 0 ở đầu) vào lệnh mkdir, ví dụ:

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

Điều này cũng làm việc cho tôi vừa rồi.


3
777 là một vấn đề an ninh
MaicolBen

Thay đổi nội dung ngay bây giờ, để 0755
arungisyadi

0

Nếu bạn đang sử dụng LINUX, trước tiên hãy kiểm tra người dùng của apache, vì trong một số bản phân phối, nó có thể khác:

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

Giả sử kết quả là "http". Thực hiện thao tác folowwing, chỉ cần nhớ thay đổi path_to_folder thành đường dẫn thư mục:

chown -R http:http path_to_folder
chmod -R g+rw path_to_folder

0

kiểm tra xem nó không phải là vấn đề với 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);
            }
        }
    }
}

0

Sau khi cài đặt máy chủ ftp, sudo apt-get install vsftpdbạn sẽ phải cấu hình nó. Để kích hoạt quyền ghi, bạn phải chỉnh sửa /etc/vsftpd.conftệp và bỏ ghi chú

#write_enable=YES

dòng, vì vậy nó nên đọc

write_enable=YES

Lưu tệp và khởi động lại vsftpdvới sudo service vsftpd restart.

Đối với các tùy chọn cấu hình khác, hãy tham khảo tài liệu này hoặcman vsftpd.conf


0

Lỗi này xảy ra nếu bạn đang sử dụng đường dẫn sai.

Ví dụ:

Tôi đang sử dụng hệ thống ubuntu và tên thư mục dự án của tôi là 'myproject'

Giả sử tôi có thư mục myproject / public / report tồn tại và muốn tạo một thư mục mới có tên là đơn đặt hàng

Sau đó, tôi cần một con đường toàn bộ nơi dự án của tôi tồn tại. Bạn có thể lấy đường dẫn bằng lệnh PWD

Vì vậy, đường dẫn gốc của tôi sẽ là = '/ home / htdocs / myproject /'

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

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

Nó sẽ làm việc cho bạn !! Thưởng thức !!

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.