문제

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

PHP에서 이 작업을 어떻게 수행할 수 있나요?

도움이 되었습니까?

해결책

방금 이 질문을 찾았고 더 포괄적인 답변이 필요하다고 생각했습니다.

현재 PHP 5.4 이를 수행하는 세 가지 방법이 있습니다.

스스로 응답 코드 조립하기(PHP >= 4.0)

그만큼 header() 함수에는 HTTP 응답 라인을 감지하고 이를 사용자 정의 라인으로 대체할 수 있는 특별한 사용 사례가 있습니다.

header("HTTP/1.1 200 OK");

그러나 이를 위해서는 (Fast)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)

첫 번째 변형을 사용할 때 분명히 몇 가지 문제가 있습니다.제가 생각하는 가장 큰 문제는 PHP나 웹 서버에 의해 부분적으로 구문 분석되고 문서화도 제대로 이루어지지 않았다는 것입니다.

4.3 이후, header 함수에는 응답 코드를 다소 편안하게 설정할 수 있는 세 번째 인수가 있지만, 이를 사용하려면 첫 번째 인수가 비어 있지 않은 문자열이어야 합니다.다음은 두 가지 옵션입니다.

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

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

http_response_code 함수(PHP >= 5.4)

그만큼 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;
    }
}

다른 팁

불행히도 @dualed가 제시한 솔루션에는 다양한 결함이 있음을 발견했습니다.

  1. 사용 substr($sapi_type, 0, 3) == 'cgi' 빠른 CGI를 감지하는 것만으로는 충분하지 않습니다.PHP-FPM FastCGI 프로세스 관리자를 사용하는 경우, php_sapi_name() cgi가 아닌 fpm을 반환합니다.

  2. Fasctcgi 및 php-fpm은 @Josh가 언급한 또 다른 버그를 노출합니다. header('X-PHP-Response-Code: 404', true, 404); PHP-FPM(FastCGI)에서는 제대로 작동합니다.

  3. header("HTTP/1.1 404 Not Found"); 프로토콜이 HTTP/1.1이 아니면 실패할 수 있습니다(예:'HTTP/1.0').현재 프로토콜은 다음을 사용하여 감지해야 합니다. $_SERVER['SERVER_PROTOCOL'] (PHP 4.1.0부터 사용 가능)

  4. 통화시 최소 2가지 경우가 있습니다 http_response_code() 예상치 못한 동작이 발생합니다.

    • PHP가 이해할 수 없는 HTTP 응답 코드를 발견하면 PHP는 해당 코드를 동일한 그룹에서 알고 있는 코드로 대체합니다.예를 들어 "521 웹 서버가 다운되었습니다"는 "500 내부 서버 오류"로 대체됩니다.다른 그룹 2xx, 3xx, 4xx의 다른 많은 일반적이지 않은 응답 코드는 이러한 방식으로 처리됩니다.
    • php-fpm 및 nginx http_response_code() 함수가 있는 서버에서 코드는 예상대로 변경되지만 메시지는 변경되지 않을 수 있습니다.예를 들어 이로 인해 이상한 "404 OK" 헤더가 나타날 수 있습니다.이 문제는 PHP 웹사이트의 사용자 의견에서도 언급되었습니다. http://www.php.net/manual/en/function.http-response-code.php#112423

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

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

http_response_code(521);

예를 들어 사용자 정의 클라이언트 애플리케이션이 서버를 호출하고 일부 추가 HTTP 코드가 필요한 경우 서버는 "500 내부 서버 오류" HTTP 응답 코드를 보내 예상치 못한 오류가 발생합니다.


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

$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을 처리하지 않습니다.현재 프로토콜을 감지해야 합니다.

모든 테스트와 의견에 감사드립니다.

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

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

header("HTTP/1.1 200 OK");
.

메시지 부분 ( '확인')을 적절한 메시지로 바꾸고 해당 코드로 상태 코드를 적절한 경우 (404, 501 등)

환경을 적재 할 때 404가 404를주는 WordPress로 인해 여기에있는 경우 문제가 해결되어야합니다.

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");
.

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

PHP의 버전 이이 기능을 포함하지 않는 경우 :

<?php

function http_response_code($code = NULL) {
        if ($code !== NULL) {
            switch ($code) {
                case 100: $text = 'Continue';
                    break;
                case 101: $text = 'Switching Protocols';
                    break;
                case 200: $text = 'OK';
                    break;
                case 201: $text = 'Created';
                    break;
                case 202: $text = 'Accepted';
                    break;
                case 203: $text = 'Non-Authoritative Information';
                    break;
                case 204: $text = 'No Content';
                    break;
                case 205: $text = 'Reset Content';
                    break;
                case 206: $text = 'Partial Content';
                    break;
                case 300: $text = 'Multiple Choices';
                    break;
                case 301: $text = 'Moved Permanently';
                    break;
                case 302: $text = 'Moved Temporarily';
                    break;
                case 303: $text = 'See Other';
                    break;
                case 304: $text = 'Not Modified';
                    break;
                case 305: $text = 'Use Proxy';
                    break;
                case 400: $text = 'Bad Request';
                    break;
                case 401: $text = 'Unauthorized';
                    break;
                case 402: $text = 'Payment Required';
                    break;
                case 403: $text = 'Forbidden';
                    break;
                case 404: $text = 'Not Found';
                    break;
                case 405: $text = 'Method Not Allowed';
                    break;
                case 406: $text = 'Not Acceptable';
                    break;
                case 407: $text = 'Proxy Authentication Required';
                    break;
                case 408: $text = 'Request Time-out';
                    break;
                case 409: $text = 'Conflict';
                    break;
                case 410: $text = 'Gone';
                    break;
                case 411: $text = 'Length Required';
                    break;
                case 412: $text = 'Precondition Failed';
                    break;
                case 413: $text = 'Request Entity Too Large';
                    break;
                case 414: $text = 'Request-URI Too Large';
                    break;
                case 415: $text = 'Unsupported Media Type';
                    break;
                case 500: $text = 'Internal Server Error';
                    break;
                case 501: $text = 'Not Implemented';
                    break;
                case 502: $text = 'Bad Gateway';
                    break;
                case 503: $text = 'Service Unavailable';
                    break;
                case 504: $text = 'Gateway Time-out';
                    break;
                case 505: $text = 'HTTP Version not supported';
                    break;
                default:
                    exit('Unknown http status code "' . htmlentities($code) . '"');
                    break;
            }
            $protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');
            header($protocol . ' ' . $code . ' ' . $text);
            $GLOBALS['http_response_code'] = $code;
        } else {
            $code = (isset($GLOBALS['http_response_code']) ? $GLOBALS['http_response_code'] : 200);
        }
        return $code;
    }
.

We can get different return value from http_response_code via the two different environment:

  1. Web Server Environment
  2. CLI environment

At the web server environment, return previous response code if you provided a response code or when you do not provide any response code then it will be print the current value. Default value is 200 (OK).

At CLI Environment, true will be return if you provided a response code and false if you do not provide any response_code.

Example of Web Server Environment of Response_code's return value:

var_dump(http_respone_code(500)); // int(200)
var_dump(http_response_code()); // int(500)

Example of CLI Environment of Response_code's return value:

var_dump(http_response_code()); // bool(false)
var_dump(http_response_code(501)); // bool(true)
var_dump(http_response_code()); // int(501)
header("HTTP/1.1 200 OK");
http_response_code(201);
header("Status: 200 All rosy");

http_response_code(200); not work because test alert 404 https://developers.google.com/speed/pagespeed/insights/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top