web-dev-qa-db-ja.com

move_uploaded_fileで設定をすべて実行した後に「ストーリーを開けませんでした:アクセス許可が拒否されました」というエラーメッセージが表示される

CentOS上でApache 2.2およびPHP 5.3を使用してアップロードディレクトリを設定しようとすると、このエラーが発生し続けます。

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からこのエラーが発生し続けます。

Warning:move_uploaded_file(images/robot.jpg):ストリームを開けませんでした:/var/www/html/mysite/process.phpの78行目で権限が拒否されました

Warning:move_uploaded_file():78行目の/var/www/html/mysite/process.phpの '/ tmp/phpsKD2Qm'を 'images/robot.jpg'に移動できません

ご覧のとおり、アップロードファイルに関してphp.iniファイルから設定を取得することはありません。

私はここで何をしていますか?

130
user63898

これはimagestmp_file_uploadrootユーザーのみ書き込み可能だからです。アップロードを機能させるには、それらのフォルダの所有者をhttpdプロセスの所有者と同じにする必要がありますORそれらをグローバルに書き込み可能にします(不適切な方法)。

  1. Apacheプロセスの所有者を確認してください:$ps aux | grep httpd。最初の列は所有者になり、通常はnobodyになります。
  2. imagestmp_file_uploadの所有者を、nobodyまたはステップ1で見つけた所有者に変更します。

    $Sudo chown nobody /var/www/html/mysite/images/
    
    $Sudo chown nobody /var/www/html/mysite/tmp_file_upload/
    
  3. Chmod imagestmp_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. この動作が発生する理由の詳細については、マニュアル http://php.net/manual/en/ini.core.php#ini.upload-tmp-dir を確認してください。それはまたopen_basedirディレクティブについて話していること。

169
Laith Shadeed

このスクリプトを実行してApacheプロセスの所有者を見つけることもできます。

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

そして、目的のディレクトリの所有者をあなたが持っているものに変更します。以下のコマンドを使用してください。

chown user destination_dir

そしてコマンドを使用します

chmod 755 destination_dir

宛先ディレクトリのアクセス権を変更します。

66
twlkyao

Mac OS Xをお持ちの場合は、ファイルルートまたはWebサイトのフォルダに移動します。

それからそれを右クリックして、情報を得て、一番下に行き(共有と許可)、それを開いて、すべて読み取り専用に変更読み書きする。必ず南京錠を開き、設定アイコンに移動して、囲まれた項目に適用を選択してください...

16

このフォルダの権限を変更する

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

10

これを以前の提案に追加したいと思いました。 SELinux が有効になっているLinuxのバージョンを使用しているなら、シェルでこれを実行する必要があります。

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

あなたのWebサーバーにグループまたはディレクトリの所有者を変更することによってユーザー権限を与えることに加えて。

10
Chris

これは私のために働きました。

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(/.*)?'
8
Junius L.

私はすでに問題なくcomposerを実行した後でさえも、この関連問題に出くわしました。私は作曲家を更新しました、そしてcomposer installまたはphp composer.phar installを実行するとき、私は得ました:

...ストリームを開くことができませんでした:アクセス許可が拒否されました...

多くの調査の結果、フォルダに対するアクセス許可の変更に関する以前の回答がうまくいったことがわかりました。それらは現在わずかに異なるディレクトリです。

私のインストールでは、OS Xでは、キャッシュファイルは/Users/[USER]/.composer/cacheにあり、キャッシュファイルはrootが所有していたので、私は問題を抱えていました。 '.composer'の所有権を私のユーザーに再帰的に変更することで問題は解決しました。

これは私がしたことです:

Sudo chown -R [USER] cache

それから私は作曲家のインストールを再び実行し、そして大丈夫!

7
abaumer

これを試して:

  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' 
    
6
redrider

この問題は、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
5

解決策はとても簡単です。 IMAGE(インストール先)フォルダを右クリックし、プロパティに移動し、許可タブをクリックして、他のユーザーのアクセスをファイルの作成と削除に変更します。

2
Basim

これを試して

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

2
Simone

Tmp_file_uploadのパーミッションを755に変更するだけです。以下はchmod -R 755コマンドです。tmp_file_upload

2
Sarang