[php] 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 에서이 오류가 계속 발생합니다.

경고 : move_uploaded_file (images / robot.jpg) : 스트림을 열지 못했습니다 : 78 행의 /var/www/html/mysite/process.php에서 권한이 거부되었습니다.

경고 : move_uploaded_file () : 78 행의 /var/www/html/mysite/process.php에서 ‘/ tmp / phpsKD2Qm’을 ‘images / robot.jpg’로 이동할 수 없습니다

보시다시피 업로드 파일과 관련하여 php.ini 파일에서 구성을 취하지 않았습니다.

내가 여기서 뭘 잘못하고 있니?



답변

때문입니다 imagestmp_file_upload들만 쓸 수있는 root사용자. 업로드가 작동하려면 해당 폴더의 소유자를 httpd 프로세스 소유자와 동일하게 만들거나 전역으로 쓸 수있게 만들어야합니다 (나쁜 방법).

  1. 아파치 프로세스 소유자를 확인하십시오 $ps aux | grep httpd. 첫 번째 열은 일반적으로 소유자입니다.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 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. 지시어에 대해서도 설명 합니다.


답변

이 스크립트를 실행하여 Apache 프로세스 소유자를 찾을 수도 있습니다.

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

그런 다음 대상 디렉토리의 소유자를 가지고있는 것으로 변경하십시오. 다음 명령을 사용하십시오.

chown user destination_dir

그런 다음 명령을 사용하십시오.

chmod 755 destination_dir

대상 디렉토리 권한을 변경합니다.


답변

Mac OS X을 사용하는 경우 파일 루트 또는 웹 사이트 폴더로 이동하십시오.

그런 다음 마우스 오른쪽 버튼으로 클릭하고 정보를 얻고 맨 아래로 이동 ( 공유 및 권한 )하고 열어서 모든 읽기 전용을 읽고 쓰도록 변경하십시오. 자물쇠를 열고 설정 아이콘으로 이동 한 다음 동봉 된 항목에 적용 을 선택 하십시오 .


답변

이것은 나를 위해 일했습니다.

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


답변

나는 이것을 이전 제안에 추가하고 싶었다. SELinux가 활성화 된 Linux 버전을 사용하는 경우 쉘에서도이를 실행해야합니다.

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

웹 서버 사용자에게 그룹 소유자 또는 디렉토리 소유자 변경을 통해 권한을 부여하는 것과 함께.


답변

이 폴더에 대한 권한 변경

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


답변

이 시도:

  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'