2010-08-09 2 views
0

그래서 테스트를 거친 코드를 배포했을 때 깜짝 놀랐습니다. 내 테스트 컴퓨터와 내 서버 사이에는 약간의 차이가 있어야합니다. 헤더 리다이렉트를 특징으로하는 똑같은 코드가 내 테스트 머신에서 완벽하게 작동했으며 서버에서는 전혀 작동하지 않았습니다. 서버의 리디렉션이 발생하지 않았으므로 빈 페이지가 결과로 남았습니다.PHP 헤더 ("Location : ...")는 하나의 컴퓨터에서 작동하며 다른 컴퓨터에서는 작동하지 않습니다.

헤더는 스크립트의 중간에서 어딘가에 호출되지만 아직 출력되지는 않습니다. 스크립트의 끝까지는 아무것도 출력하지 않습니다. 다른 모든 것이 실행 된 후에 오랫동안. 그것은 모든 것을 완충합니다.

서버와 테스트 컴퓨터 모두 동일한 Apache 버전 인 PhP 버전을 실행 중입니다. 구성 파일에 헤더가 하나가 아닌 다른 헤더가 될 수있는 것이 있습니까? 거기에 다른 일이 일어나서 실패 할 수 있습니까?

이 편집 :

여기 헤더 설정하는 라인이다 :

public function setRedirect($url) { 
    header('Location: '.$url); 
} 

을 그리고 여기에 호출하는 코드의 그 :

URL::toString() 항상 정규화 된 도메인 이름을 생성
$url = new URL('index'); 
$this->layout->setRedirect($url->toString()); 

, 이 경우 : http://domain/index.php?action=index

나는 PHP와 아파치 에러 로그를 모두 검사했다. 나다.

+1

절대 (정규화 된) URL로 리디렉션합니까? –

+1

완전성을 위해서 :'header()'호출이있는 행을 포함 할 수 있습니까? – Tomalak

+0

@Peter Bailey @Tomalak 완료 (예)하고 완료. 편집을 참조하십시오. –

답변

3

아마도 header 호출 전에 일부 공백이나 다른 형식의 출력이있었습니다.

ini 설정이 output-buffering 인 경우에만 작동합니다 (또는 명시 적으로 출력 버퍼링을 시작했지만이 경우 두 컴퓨터에서 리디렉션이 작동해야 함).

오류보고를 사용 설정하여이를 확인할 수 있습니다.

+0

그렇다면 왜 서버가 아닌 테스트 시스템에서 작동합니까? 출력과 스크립트는 동일합니다. 또한 오류보고는 아무 것도 보여주지 않았습니다. –

+0

@Daniel 서버에서 출력 버퍼링이 켜져 있고 테스트 시스템이 꺼져있을 수 있습니다. – Artefacto

+0

Brilliant! 미안 해요, 처음으로 답을 오해했습니다. 이제는 이해합니다. 그리고 실제로 테스트 서버가 output_buffering을 켜고 있고 서버가 꺼져있는 경우입니다. 이것을 수정하면 보자 ... –

0

Fiddler 또는 다른 클라이언트 측 도구를 사용하여 헤더를 확인하십시오. Location : 헤더가 실제로 전송되고 있는지 확인하십시오. 또한 일부 브라우저는 헤더를 전송해야하는 순서로 까다롭기도합니다.

0

귀하의 서버는 방문자를 추적하고 트래픽 통계를 제공하거나 유사한 목적으로 귀하의 페이지에 스크립트를 추가한다고 생각합니다. 이상적으로는 오류가 발생하지만 서버에 오류보고가 사용 중지되어 빈 페이지가 표시 될 수 있습니다.

구문 오류가있는 스크립트를 실행하고 서버에 오류보고가 비활성화되어 있는지 확인하시기 바랍니다.

0

가장 가능성있는 설명은 오류로 인해 서버에서 스크립트가 종료되고 표시 오류가 표시된다는 것입니다 (따라서 빈 화면). 나는 PHP가 아파치에 뭔가를 넣고 있는지 알기 위해 아파치 오류를 서버에서 오랫동안 확인하는 것이 좋습니다.

그렇지 않으면 LiveHTTPHeaders (Firefox 용)와 같은 브라우저 확장 프로그램을 사용하여 위치 헤더가 전송되는지 여부를 확인하거나 스크립트를 디버깅하여 해당 헤더 호출까지 도달하는지 확인하십시오.

관련 문제