복붙노트

PHP : HTTP 응답 코드를 보내는 방법?

PHP

PHP : HTTP 응답 코드를 보내는 방법?

HTTP 200 OK 또는 일부 4XX 또는 5XX 코드와 같은 HTTP 응답 코드 (상태 코드)를 사용하여 응답해야하는 PHP 스크립트가 있습니다.

어떻게하면 PHP에서이 작업을 수행 할 수 있습니까?

해결법

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

    1.방금이 질문을 발견하고보다 포괄적 인 대답이 필요하다고 생각했습니다.

    방금이 질문을 발견하고보다 포괄적 인 대답이 필요하다고 생각했습니다.

    PHP 5.4에서이 작업을 수행하는 세 가지 방법이 있습니다.

    header () 함수는 HTTP 응답 라인을 탐지하고이를 사용자 정의 할 수있는 특별한 유스 케이스를 가지고있다.

    header("HTTP/1.1 200 OK");
    

    그러나, 이것은 (빠른) CGI PHP를위한 특별한 치료가 필요합니다 :

    $sapi_type = php_sapi_name();
    if (substr($sapi_type, 0, 3) == 'cgi')
        header("Status: 404 Not Found");
    else
        header("HTTP/1.1 404 Not Found");
    

    참고 : HTTP RFC에 따르면 이유 구문은 표준을 따르는 사용자 지정 문자열이 될 수 있지만 클라이언트 호환성을 위해 임의의 문자열을 배치하지 않는 것이 좋습니다.

    참고 : php_sapi_name ()에는 PHP 4.0.1이 필요합니다.

    첫 번째 변종을 사용할 때 분명히 몇 가지 문제가 있습니다. 내가 생각하기에 가장 큰 부분은 PHP 나 웹 서버에 의해 부분적으로 파싱되어 문서화가 잘되어 있지 않다는 것입니다.

    4.3부터 헤더 함수는 응답 코드를 다소 편하게 설정할 수있는 세 번째 인수를 갖지만 첫 번째 인수는 비어 있지 않은 문자열이어야합니다. 다음 두 가지 옵션이 있습니다.

    header(':', true, 404);
    header('X-PHP-Response-Code: 404', true, 404);
    

    나는 2 번째를 추천한다. 첫 번째는 테스트 한 모든 브라우저에서 작동하지만 일부 브라우저 또는 웹 크롤러는 콜론 만 포함 된 헤더 행에 문제가있을 수 있습니다. 2 번째의 헤더 필드 명 변형은 물론 어떤 방식 으로든 표준화되지 않고 수정 될 수 있습니다. 단지 설명이 포함 된 이름을 선택했습니다.

    http_response_code () 함수는 PHP 5.4에서 처음 소개되었으므로 훨씬 쉽게 작업 할 수있었습니다.

    http_response_code(404);
    

    그게 다야.

    다음은 5.4 아래의 호환성이 필요할 때 작성했지만 "새로운"http_response_code 함수의 기능을 원했던 함수입니다. 필자는 PHP 4.3이 하위 호환성보다 충분하다고 생각하지만 결코 알지 못합니다.

    // For 4.3.0 <= PHP <= 5.4.0
    if (!function_exists('http_response_code'))
    {
        function http_response_code($newcode = NULL)
        {
            static $code = 200;
            if($newcode !== NULL)
            {
                header('X-PHP-Response-Code: '.$newcode, true, $newcode);
                if(!headers_sent())
                    $code = $newcode;
            }       
            return $code;
        }
    }
    
  2. ==============================

    2.불행히도 @dualed에서 제공하는 솔루션은 여러 가지 결함이 있음을 발견했습니다.

    불행히도 @dualed에서 제공하는 솔루션은 여러 가지 결함이 있음을 발견했습니다.

    참고로 여기에 HTTP 응답 상태 코드의 전체 목록이 있습니다 (이 목록에는 IETF 인터넷 표준 및 다른 IETF RFC의 코드가 포함되어 있으며 그 중 많은 수가 현재 PHP http_response_code 함수에서 지원되지 않습니다) : http : //en.wikipedia .org / wiki / List_of_HTTP_status_codes

    다음을 호출하여이 버그를 쉽게 테스트 할 수 있습니다.

    http_response_code(521);
    

    예를 들어 사용자 정의 클라이언트 응용 프로그램에서 서버를 호출하고 추가 HTTP 코드가 필요할 경우 서버는 "500 Internal Server Error"HTTP 응답 코드를 보내 예상치 못한 오류가 발생합니다.

    내 솔루션 (모든 PHP 버전 4.1.0 이후) :

    $httpStatusCode = 521;
    $httpStatusMsg  = 'Web server is down';
    $phpSapiName    = substr(php_sapi_name(), 0, 3);
    if ($phpSapiName == 'cgi' || $phpSapiName == 'fpm') {
        header('Status: '.$httpStatusCode.' '.$httpStatusMsg);
    } else {
        $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0';
        header($protocol.' '.$httpStatusCode.' '.$httpStatusMsg);
    }
    

    결론

    http_response_code () 구현은 모든 HTTP 응답 코드를 지원하지 않으며 지정된 HTTP 응답 코드를 동일한 그룹의 다른 응답 코드로 덮어 쓸 수 있습니다.

    새로운 http_response_code () 함수는 관련된 모든 문제를 해결하지 못하지만 새로운 버그를 도입하는 것을 악화시킵니다.

    @dualed에서 제공하는 "호환성"솔루션은 적어도 PHP-FPM에서는 예상대로 작동하지 않습니다.

    @dualed가 제공하는 다른 솔루션에는 다양한 버그가 있습니다. 빠른 CGI 탐지는 PHP-FPM을 처리하지 않습니다. 현재 프로토콜을 감지해야합니다.

    모든 테스트와 의견을 보내 주시면 감사하겠습니다.

  3. ==============================

    3.출력 버퍼링을 사용하지 않는 경우 본문의 출력 전에이 행을 추가하십시오.

    출력 버퍼링을 사용하지 않는 경우 본문의 출력 전에이 행을 추가하십시오.

    header("HTTP/1.1 200 OK");
    

    메시지 부분 ( 'OK')을 적절한 메시지로 바꾸고 코드와 함께 상태 코드를 적절하게 바꿉니다 (404, 501 등)

  4. ==============================

    4.PHP 5.4 이후에 http_response_code ()를 사용하여 헤더 상태 코드를 가져오고 설정할 수 있습니다.

    PHP 5.4 이후에 http_response_code ()를 사용하여 헤더 상태 코드를 가져오고 설정할 수 있습니다.

    여기 예제 :

    <?php
    
    // Get the current response code and set a new one
    var_dump(http_response_code(404));
    
    // Get the new response code
    var_dump(http_response_code());
    ?>
    

    여기 php.net에서이 함수의 문서가있다.

    http_response_code

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

    5.헤더 기능. 첫 번째 매개 변수에 대한 섹션의 예제가 있습니다.

    헤더 기능. 첫 번째 매개 변수에 대한 섹션의 예제가 있습니다.

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

    6.환경을로드 할 때 Wordpress에서 404를 제공하기 때문에 여기에 계시다면 문제가 해결됩니다.

    환경을로드 할 때 Wordpress에서 404를 제공하기 때문에 여기에 계시다면 문제가 해결됩니다.

    define('WP_USE_THEMES', false);
    require('../wp-blog-header.php');
    status_header( 200 );
    //$wp_query->is_404=false; // if necessary
    

    문제는 상태 : 404 찾을 수 없음 헤더를 보내는 것이 원인입니다. 당신은 그것을 오버라이드해야합니다. 이것은 또한 작동합니다 :

    define('WP_USE_THEMES', false);
    require('../wp-blog-header.php');
    header("HTTP/1.1 200 OK");
    header("Status: 200 All rosy");
    
  7. ==============================

    7.

    header("HTTP/1.1 200 OK");
    http_response_code(201);
    

    http_response_code (200); 테스트 경고 404 때문에 작동하지 않습니다. https://developers.google.com/speed/pagespeed/insights/

  8. from https://stackoverflow.com/questions/3258634/php-how-to-send-http-response-code by cc-by-sa and MIT license