복붙노트

HTTPS에서 작동하도록 file_get_contents ()를 얻으려면 어떻게해야합니까?

카테고리 없음

HTTPS에서 작동하도록 file_get_contents ()를 얻으려면 어떻게해야합니까?

저는 신용 카드 처리를 설정 중이며 CURL에 대한 해결 방법을 사용해야했습니다. 다음 코드는 SSL URL을 호출하지 않는 테스트 서버를 사용할 때 제대로 작동했지만 HTTPS가 작동하는 서버에서 테스트 할 때 "스트림을 열지 못했습니다"라는 오류 메시지와 함께 실패합니다.

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

해결법

  1. ==============================

    1.

    다음 스크립트를 사용하여 PHP 스크립트에 사용할 수있는 https 래퍼가 있는지 확인하십시오.

    $w = stream_get_wrappers();
    echo 'openssl: ',  extension_loaded  ('openssl') ? 'yes':'no', "\n";
    echo 'http wrapper: ', in_array('http', $w) ? 'yes':'no', "\n";
    echo 'https wrapper: ', in_array('https', $w) ? 'yes':'no', "\n";
    echo 'wrappers: ', var_export($w);
    

    출력은 다음과 같아야합니다.

    openssl: yes
    http wrapper: yes
    https wrapper: yes
    wrappers: array(11) {
      [...]
    }
    
  2. ==============================

    2.

    https 래퍼 허용 :

    php.ini 파일에 존재하지 않으면이 줄을 추가해야합니다 :

    extension=php_openssl.dll
    
    allow_url_fopen = On
    
  3. ==============================

    3.

    다음을 시도하십시오.

    function getSslPage($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_REFERER, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }
    
  4. ==============================

    4.

    $url= 'https://example.com';
    
    $arrContextOptions=array(
          "ssl"=>array(
                "verify_peer"=>false,
                "verify_peer_name"=>false,
            ),
        );  
    
    $response = file_get_contents($url, false, stream_context_create($arrContextOptions));
    

    이렇게하면 URL에서 HTTPS인지 여부에 관계없이 콘텐츠를 가져올 수 있습니다.

  5. ==============================

    5.

    이는 대상 서버가 유효한 SSL 인증서를 가지고 있지 않기 때문인 것 같습니다.

  6. ==============================

    6.

    그냥 php.ini 파일에 두 줄을 추가하십시오.

    extension = php_openssl.dll

    allow_url_include = 설정

    나를 위해 일하고.

  7. ==============================

    7.

    나에게는 같은 오류가 있었다. php.ini 파일에서 allow_url_include = On으로 설정해주었습니다.

  8. ==============================

    8.

    HTTPS는 OpenSSL에 대한 지원으로 컴파일 된 PHP 4.3.0부터 지원됩니다. 또한 대상 서버가 유효한 인증서를 갖고 있는지, 방화벽이 아웃 바운드 연결을 허용하고 php.ini의 allow_url_fopen이 true로 설정되어 있는지 확인하십시오.

  9. ==============================

    9.

    제 경우에는 WAMP가 Apache와 다른 php.ini를 사용하기 때문에 WAMP 메뉴를 통한 설정은 CLI에는 적용되지 않습니다. CLI php.ini를 수정하면 제대로 작동합니다.

  10. ==============================

    10.

    때때로 서버는 HTTP 요청 헤더 (예 : 적절한 사용자 에이전트)에서 보거나 보이지 않는 것을 기반으로 응답하지 않도록 선택합니다. 브라우저에 연결할 수 있으면 브라우저에서 보낸 헤더를 가져 와서 스트림 컨텍스트에서 그대로 흉내낼 수 있습니다.

  11. ==============================

    11.

    URL이 있는지 없는지 확인하기

    귀하의 질문에 코드가 작동 버전으로 다시 작성할 수 있습니다 :

    function send($packet=NULL, $url) {
    // Do whatever you wanted to do with $packet
    // The below two lines of code will let you know if https url is up or not
    $command = 'curl -k '.$url;
    return exec($command, $output, $retValue);
    }
    
  12. from https://stackoverflow.com/questions/1975461/how-to-get-file-get-contents-to-work-with-https by cc-by-sa and MIT lisence