PHP mkdir:権限拒否の問題


99

PHPのmkdir関数を使用してディレクトリを作成しようとしていますが、次のエラーが発生しますWarning: mkdir() [function.mkdir]: Permission denied in ...。問題を解決する方法は?


2
プラットフォーム/ Webサーバー/オペレーティングシステム?
Salman A

1
この質問をチェックしてください。Linuxで実行している場合、SELinuxに関する答えが当てはまる可能性があります。
Lucas Madureira、2014年

これを試してみてくださいそれは私のために働いていますstackoverflow.com/a/12656964/7516620 ここにリンクの説明を入力してください
Akshay Italiya

回答:


171

私はこれが古いスレッドであることを知っていますが、より良い答えが必要です。アクセス許可を777に設定する必要はありません。これは、読み取りと書き込みのアクセス権を世界中に与えるため、セキュリティ上の問題です。あなたのApacheユーザーがディレクトリに対する読み取り/書き込み権限を持っていない可能性があります。

Ubuntuでの操作は次のとおりです

  1. すべてのファイルがApacheグループとユーザーによって所有されていることを確認してください。Ubuntuでは、www-dataグループとユーザーです。

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

  2. 次に、www-dataグループのすべてのメンバーがファイルを読み書きできるようにしました

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

PHP mkdir()関数がエラーを返さずに機能するようになりました


3
いい答えだ!うまくいけば、これが時間の経過とともにページの先頭に到達するでしょう!
非常に不規則な


Apacheはキャッシュやログのようなものを書く許可を必要とします...それは微調整の問題です。
Manatax 2015年

@simpleengineこんにちは私はあなたの答えに気づきました..私はCodeIgnterで作成しようとしているプロジェクトと同じ問題に直面していて、Ubuntu 14.14 Ltsで開発しています。私に必要な手順を詳しく説明してください。このエラーを修正するために行う??? あなたにいくつかの追加情報を与えるために:絶対パスは/opt/lampp/htdocs/www/my-app/public/uploads..基本的に私がしようとしているのは、アップロードされたフォルダ内のファイルをアップロードし、写真を保存するためにアルバムフォルダ(これはphpで行われます)を作成するすべてのログインしたユーザーです..
ltdev

4
安全な方法を示さずに「安全ではない」と言い続けるユーザーは好きではありません。
che-azeh 2017年

38

将来グーグル経由でこれを見つける人々のための遅い答え。私は同じ問題に出くわしました。

注:私はMAC OSX LIONを使用しています

何が起こるかというと、Apacheはユーザー "_www"として実行されており、ファイルを編集する権限がないということです。PHPを介して機能するファイルシステム関数がないことがわかります。

直し方:

ファインダーウィンドウを開き、メニューバーから[移動]> [フォルダーへ移動]> / private / etc / apache2を選択します。

今httpd.confを開きます

見つける:

User _www 
Group _www

ユーザー名を変更します。

User <YOUR LOGIN USERNAME>

次に、このフォームのターミナルを実行してApacheを再起動します。

sudo apachectl -k restart

それでも機能しない場合は、上記を実行する前に、次の操作を実行します。関連している可能性があります。

ターミナルを開き、次のコマンドを実行します(Webサーバーのファイルは/ライブラリ/ WebServer / wwwにあります。Webサイトの場所に応じて変更してください)。

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

6
このソリューションは機能しますが、Apacheが誰かに悪意のあるコードを実行させた場合(Shellshockエクスプロイトなどを介して)、システムに大混乱をもたらすことができます。別の方法としては_www、Apacheを実行したままにし、あなたとApacheのグループを作成します。新しいグループを作成し、と呼ばれtrusted、自分自身とその_www中に入れます。次に、サーバーのドキュメントディレクトリにあるすべてのファイルのグループオーナーを信頼できるものにします。最後に、chmod g+rwxApacheがアクセスする必要のあるファイルに対してのみ必要に応じて、trustedグループがファイルを編集する権限を持つようにします。
Chris Middleton

3
この答えは悪い考えであることを再度強調するために、ただ声を上げてください。Apacheプロセスが自分専用のユーザーによって所有されている非常に多くの正当な理由があります。
danyamachine

15

PHPでmkdirを使用するときは、権限を777に設定しないでください

リンクのみの回答はStackOverflowでの良い習慣とは見なされませんが、ここで与えられるアドバイスは通常フォローアップされるべきではありません。

同様の質問でこの素晴らしい答えに戻りたいと思います。私は引用します:

777の使用を提案するのをやめてください。あなたは誰でもファイルを書き込み可能にしています。これは、アクセス許可システムが設計されたすべてのセキュリティを失うことを意味します。これを提案する場合は、適切に構成されていないWebサーバーへの影響について考えてください。ファイルを上書きすることで、Webサイトを「ハッキング」するのが非常に簡単になります。だから、しないでください。


9

あなたはディレクトリを作成しようとするディレクトリのパーミッションを修正してを


Filezillaを使用して、ファイルのアクセス許可を再帰的に755に変更することで、元の質問の問題を解決しました。親フォルダーを右クリックします。これは、755のアクセス許可を設定してもよい一般的なファイルリポジトリフォルダーであると想定し、[ファイル属性]-> [数値]-> [755]をクリックし、[サブディレクトリに再帰する]をオンにします。多くのファイルがある場合、サブディレクトリを介して伝播するのに数分かかります。その後、再試行してください。
TARKUS

7

私はこのスレッドが古いことを知っていますが、おそらくこれは誰かを助けるでしょう。

PHPがmkdir()に対して「アクセス権が拒否されました」と言う理由の問題-間違ったURLパス。したがって、修正するには、正しいパスを取得するだけです。私はこのようにしました:

<?php

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

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

?>

1
新しいホスト(mysqlnd lolがある)に転送するときに私に起こりました。新しいフルホームディレクトリパスに変更するのを忘れました。実際には権限の問題ではなかったことが判明しました。
JSG

2

ディレクトリを作成するには、ファイルシステムの権限が必要です。

例:Ubuntu 10.04では、Apache(php)はユーザーとして実行されます:グループのwww-data:www-data

ユーザーwww-dataには、ディレクトリを作成するためのアクセス権が必要です。

これを自分で試すには、「su www-data」を使用してwww-dataユーザーになります。

簡単な修正として、次のことができます:sudo chmod 777 my_parent_dir


14
chmod 0777読み取りと書き込みのアクセス権を世界に与えます!あなたはそのようなことを助言するべきではありません。ただし、ユーザーグループへのアドバイスは、現時点では最高です:)
KingCrunch

1
世界がOSにアクセスできるなら、きっと。より良い方法は次のようになります:sudo chown www-data:www-data my_parent_dir
Jon Skarpeteig

または、権限をそのままにして、www-dataを親ディレクトリのグループに追加します。
Marc B

0

他にできることは、次の場所に移動することです:/ etc / sudoers

そのユーザーに許可を与える次の行を追加しますwww-data ALL =(ALL:ALL)ALLなぜwww-dataですか?これは、Apacheがこのユーザー名で実行されているためです。

ユーザーが異なる場合は、ユーザー名ALL =(ALL:ALL)ALLを試してください。

これでうまくいきました。


5
sudoers直接編集せずに、rootとしてログインし、te visudoコマンドを使用します。これにより、すべての変更をチェックして、誤った編集を回避します。これにより、sudoersファイルがロードされたときに解析エラーが発生し、(権限がないなど)何かを変更)
エリアスヴァンウーテゲム

ユーザー名を見つける方法。www-dataのような?nginxを使用していますが、機能しません
robspin

1
@robspinこれを試してください:ps aux | egrep '(nginx)'
maxwells

0

Macを使用しているので、Macの_www(Apacheユーザーグループ)グループに自分を追加できます。

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

Macがファイルを作成するものと思われるwheelグループに_wwwユーザーを追加します。

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

0

私は今この問題を抱えています、あなたが今あなたに与えることができる私の最善の解決策は(あなたがあなたのコードを含まなかったとしても):

  1. 宛先フォルダーの名前の付け方を確認してください。例:new_folder(ほとんどのホストでは、実行時にアンダースコアやダッシュなどを使用した名前の作成が許可されていないため、アクセス許可のエラーが発生することがあります)。それは私のために働いた。
  2. サブフォルダーを作成するために再帰コマンドを使用していた場合は、mkdirコマンドに0755(最初に0を含めることを忘れないでください)を忘れずに入力してください。

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

これはちょうど今私のためにも働いています。


3
777はセキュリティの問題です
MaicolBen

今すぐ編集して0755に
arungisyadi

0

LINUXを使用している場合は、最初にapacheのユーザーを確認します。一部のディストリビューションでは異なる場合があるためです。

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

結果が「http」であるとしましょう。以下を実行し、path_to_folderをフォルダーパスに変更することを忘れないでください。

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

0

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

FTPサーバーをインストールしたら、sudo apt-get install vsftpdそれを設定する必要があります。書き込みアクセスを有効にするには、/etc/vsftpd.confファイルを編集してコメントを解除する必要があります

#write_enable=YES

行なので、読む必要があります

write_enable=YES

ファイルを保存して、で再起動vsftpdsudo service vsftpd restartます。

他の構成オプションについては、このドキュメントを参照するか、man vsftpd.conf


0

このエラーは、間違ったパスを使用している場合に発生します。

たとえば:

私はubuntuシステムを使用していて、プロジェクトフォルダー名は「myproject」です

私が持っていると仮定でmyproject /公共/レポートのディレクトリが存在すると呼ばれる新しいフォルダを作成したい注文を

次に、プロジェクトが存在する完全なパスが必要です。PWDコマンドでパスを取得できます

したがって、私のルートパスは= '/ home / htdocs / myproject /'になります

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

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

それはあなたのために働くでしょう!! 楽しい !!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.