만족

[Apache] Uncaught Error: Call to undefined function apache_request_headers() 본문

[Apache] Uncaught Error: Call to undefined function apache_request_headers()

Backend/기타 Satisfaction 2022. 9. 25. 21:44

apache mpm을 prefork에서 event로 변경하면서 php 모듈도 변경했는데 해당 작업 이후 발생한 문제이다.

 

Uncaught Error: Call to undefined function apache_request_headers() ...

원인

 

 

기존의 apache php 모듈을 제거하고

 

 

php-fpm을 대신 활성화해서 apache_request_headers() 함수가 지원되지 않는다.

 

apache-php 연결 모듈에 따라 지원 여부가 갈린다.

 

+ 이것도 좀 웃긴게 php 공식 문서에서도 어떤 페이지는 모듈 연결 방식에 상관없이 모두 된다고 하고

또다른 페이지에서는 안된다고 나온다.

 

+ 정확한 것은 php_info()를 호출해서 지원되는 환경 변수들을 체크해보면 알 수 있다.

당연하게도 apache_request_headers()는 모듈 지원 방식에 따라 지원 여부가 다르다는 것을 알 수 있다...

 

해결

https://www.php.net/manual/en/function.apache-request-headers.php

 

PHP: apache_request_headers - Manual

Superglobal $_SERVER,  used in all patches for missing getallheaders() contains only truly basic headers.  To pass ANY header into PHP in any httpd environment, including CGI/FCGI just add rule (any number of rules) into .htaccess:RewriteRule .* - [E=HTT

www.php.net

없으면 만들어주면 된다.

 

<?php
if( !function_exists('apache_request_headers') ) {
///
function apache_request_headers() {
  $arh = array();
  $rx_http = '/\AHTTP_/';
  foreach($_SERVER as $key => $val) {
    if( preg_match($rx_http, $key) ) {
      $arh_key = preg_replace($rx_http, '', $key);
      $rx_matches = array();
      // do some nasty string manipulations to restore the original letter case
      // this should work in most cases
      $rx_matches = explode('_', $arh_key);
      if( count($rx_matches) > 0 and strlen($arh_key) > 2 ) {
        foreach($rx_matches as $ak_key => $ak_val) $rx_matches[$ak_key] = ucfirst($ak_val);
        $arh_key = implode('-', $rx_matches);
      }
      $arh[$arh_key] = $val;
    }
  }
  return( $arh );
}
///
}
///
?>

apache_request_header는 헤더 내용을 읽어 array로 리턴해주는 것이므로 (특정 모드에서만 국한된 기능이 아님)

apache_request_header를 새로 구현해주기만 하면 된다.

 

위 내용을 php 코드 상단부에 추가한다.

 

주의할 점은 헤더의 키값이 모두 대문자로 바뀐다는 것이다.

 

예를 들어 기존에 header의 Authorization키값을 가져오는 코드가 있다면

$header= apache_request_headers();

$header['Authorization'] 

$header['AUTHORIZATION'] 처럼 변경해주어야 한다.



Comments