php apache_request_headers ()는 현실과의 대각선 (Firebug에 의해 확인) : 왜?

StackOverflow https://stackoverflow.com/questions/249968

문제

PHP에서 AJAX 요청을 사용하는 웹 앱을 작성했습니다 (yui.util.connect.asyncrequest를 사용하여 제작).

대부분의 경우, 이것은 잘 작동합니다. 요청은 An과 함께 전송됩니다 X- 요청 가치 xmlhttprequest. 내 PHP 컨트롤러 코드는 APACHE_REQUEST_HEADERS ()를 사용하여 들어오는 요청이 AJAX인지 아닌지 확인하고 모든 것이 잘 작동합니다.

그러나 항상 그런 것은 아닙니다. 간헐적으로, AJAX 요청이 전송되는 상황을 얻고 있습니다 (FireBug는 요청의 헤더에 XMLHTTPREQUEST와 함께 X- 레더가 포함되어 있음을 확인합니다).

ivar_dump a apache_request_headers ()의 출력은 다음과 같습니다 (x-의 부족에 유의하십시오.

'Host' => string 'peterh.labs.example.com' (length=26)
'User-Agent' => string 'Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3' (length=105)
'Accept' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
'Accept-Language' => string 'en-gb,en;q=0.5' (length=14)
'Accept-Encoding' => string 'gzip,deflate' (length=12)
'Accept-Charset' => string 'ISO-8859-1,utf-8;q=0.7,*;q=0.7' (length=30)
'Keep-Alive' => string '300' (length=3)
'Connection' => string 'keep-alive' (length=10)
'Referer' => string 'http://peterh.labs.example.com/qmail/' (length=40)
'Cookie' => string 'WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6' (length=57)
'Pragma' => string 'no-cache' (length=8)
'Cache-Control' => string 'no-cache' (length=8)

그러나 Firebug는 다음과 같이 말합니다.

Request Headers:
Host             peterh.labs.example.com
User-Agent       Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.0.3) Gecko/2008101315 Ubuntu/8.10 (intrepid) Firefox/3.0.3
Accept           text/html,application/xhtml+xml,application/xml;q=0.9,**;q=0.8
Accept-Language  en-gb,en;q=0.5
Accept-Encoding  gzip,deflate
Accept-Charset   ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive       300
Connection       keep-alive
X-Requested-With XMLHttpRequest
Referer          http://peterh.labs.example.com/qmail/
Cookie           WORKFLOW_SESSION=55f9aff2051746851de453c1f776ad10745354f6

이 불일치는 동일한 코드를 실행할 때 간헐적입니다. 그러나 나는 소프트웨어와 관련하여 "간헐적"을 믿지 않습니다! 돕다!

도움이 되었습니까?

해결책

APACHE_REQUEST_HEADERS () 및 FIREBUG 불일치가 왜 그런지 잘 모르겠지만 요청 헤더를 읽으려면 $ _Server Super Global을 사용할 수 있습니다.

클라이언트가 전송하는 각 헤더 (클라이언트가 어떻게 중요하지 않음) $에 도착합니다.서버 어레이. 해당 헤더의 열쇠는 HTTP와 함께합니다 접두사, 모든 문자 자본 및 대시는 밑줄 (_)으로 변환됩니다.

귀하의 경우 필요한 값을 찾을 수 있습니다.

$ _server [ 'http_x_requested_with'] = 'xmlhttprequest'

다른 팁

이 질문을 발견하는 사람들에 대한 향후 언급을 위해 "간헐적"은 서버 측정이 발생하는 리디렉션으로 인한 것일 수 있습니다. 302 리디렉션이 발생하면 원래 요청으로 전송 되더라도 X- 요청과 헤더가 전달되지 않습니다. 이것은 문제의 원래 원인 일 수 있습니다.

누락 된 헤더가 슈퍼 글로벌에 없음을 두 번 확인 $_SERVER. 일반적으로, 내가 정말로해야한다면 Apache_*에 의존하지 않을 것입니다.

측면 음표에서 X- 요청은 표준에 포함되어 있습니까? 나는 그것을 추가하는 다양한 라이브러리에 대해 읽었지만 그것이 아직 표준이되었음을 몰랐습니다.

이 경우에 구체적으로 대답 할 수는 없지만 일반적으로 헤더 대신 XMLHTTP 요청을 신호하기 위해 (쿼리) 매개 변수를 사용하는 것이 좋습니다. 재미있는 보안 또는 프록시 서버가 HTTP 헤더로 바이올린을 사용하거나 일반 브라우저 HTML 응답 (또는 그 반대로)이어야 할 AJAX 응답을 캐시 할 수있는 것을 알 수 없습니다.

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