Back to Question Center
0

.htaccess Semalt 지시문은 PHP에 의해 트리거 된 404 에러를 포착하지 않습니다. http_response_code (404)

1 answers:

아파치 2. 4. Windows에서 10. Zend Framework 1 PHP 애플리케이션이 안정적입니다 - complete package details.방금 ErrorDocument 지시문을 추가하기로 결정했습니다.htaccess . 나는 그들이 404의 방아쇠를 당기는 방식에 따라 404와 함께 얻는 3 가지 다른 행동에 완전히 당혹 스럽다.

내. htaccess 파일에 다음이 포함되어 있습니다 :

     ErrorDocument 404 "페이지를 찾을 수 없습니다"
RedirectMatch 404 / 업로드 / (. */)?은밀한/    

주소 표시 줄에 존재하지 않는 페이지의 url을 입력하면 Zend Framework의 ErrorController 에 의해 생성 된 오류 페이지가 표시됩니다.

/ uploads / private / foo ( RedirectMatch 과 일치)를 입력하면 예상대로 ErrorDocument 출력을 얻습니다.

하지만 PHP 코드에서

     http_response_code (404);
출구  
;

그런 다음 브라우저의 표준 오류 페이지가 표시됩니다.이것은 내가 완전히 이해하지 못하는 것입니다.Chrome 개발자 도구에서 네트워크 탭을 사용하면 세 가지 요청 모두 404 상태를 볼 수 있습니다.Zend Framework의 오류 처리 설정이 존재하지 않는 URL을 잡아낼 것이고 ErrorDocument 처리를 우회하는 그 일을한다고 상상할 수 있습니다.하지만 404 상태의 PHP 코드에서 즉각적인 종료 ErrorDocument 를 지나치는 방법을 이해하지 못합니다.

ErrorDocument 지시문을 트리거하기 위해 작성할 수있는 PHP 코드는 무엇입니까?

편집 :

Tim Fountain의 답을 바탕으로 더 많은 컨텍스트를 제공해야합니다. 위에서 언급 한 것처럼 ZF ErrorController 페이지가 원하는 방식으로 표시되도록 설정되었습니다. URL을 입력하면 해당 페이지가 표시됩니다. 존재하지 않는 페이지의 경우. 이 특정 상황에서, 실제로 WordPress mu-plugin (WP는 ZF public 디렉토리 아래에 설치됨)에서 코드를 실행하고 있습니다. . htaccess 파일은 자연스럽게 아래의 기존 파일에 대한 요청을하지 않습니다 public ZF. public / wp 아래의 요청은 public / wp / index로 이동하십시오.php mu-plugin 은 ZF를 부트 스트랩하고 (bootstrap run

메소드를 호출하지 않음) 요청을 검사합니다. 허용되지 않는 경우 (ZF의 인증 세션 변수에 따라), 404 (403이 아님). 이전에 실제로 존재하지 않는 URL로 리다이렉트함으로써이 작업을 수행했는데 ErrorController 페이지가 잘 보였지만 존재하지 않는 URL을 표시하는 주소 표시 줄도 남겨 두었습니다.주소 표시 줄에 여전히 사용자가 입력 한 URL이 표시되도록 ErrorDocument 지시문을 추가하기로 결정했습니다.실제 코드에서 지시문에는 간단한 문자열이 없었지만이 URL은 / default / error / error? error_handler [type] = 404 . URL을 문제가 아닌지 확인하기 위해 간단한 문자열로 변경했습니다. RedirectMatch 을 트리거하는 private 디렉토리 내에 URL을 입력하면 ZF ErrorController 페이지가 표시되므로 그 자체는 문제가되지 않는다.이 게시의 복잡성을 줄이기 위해.

팀의 대답은 내 문제 코드가 브라우저에 빈 404 페이지를 직접 보내고 브라우저가 설명문 텍스트로 변경한다고합니다.무슨 일이 일어나고 있는지 분명히 밝혀주세요!

내 문제는 http_response_code

가 비어있는 페이지 컨텐트를 생성하고 header
를 사용하여 상태를 설정해야한다는 것입니다. 콘텐츠를 브라우저에 직접 보냅니 까? 그러나 그의 대답에서 명확하지 않은 것은 왜 ErrorDocument 지시어를 무시할 것인가입니다.

이 동작을 일으키는 요청 URL은 http : // www. 예. co.kr / wp / foo . DocumentRoot / public . 이것은 에 의해 재 작성되지 않는다.htaccess 는 ZF로 이동하지만 public / wp / index. PHP는 . 어떤 경우에는 ErrorDocument 이 트리거 될 것이라고 생각했을 것입니다..

EDIT 2 :

또는 Tim의 포인트가 실제로 ZF 오류 처리에 관한 것이 아니라 Apache의 관점에서 들어오는 요청이 public / wp / index. php 및 PHP 실행), PHP 코드를 처리 할 수 ​​있으므로 Apache ErrorDocument 로 돌아갈 수 없습니다! 나는 ErrorDocument가 어떻게 작동하는지에 대한 근본적인 오해가 있었다고 생각한다.404 상태로 원하는 페이지를 표시하기 위해 ErrorController 코드를 직접 호출하는 방법을 찾아야합니다! 이런!

나는 Tim의 대답을 받아 들일 것이다. 비록 그가 ErrorDocument 처리가 시작될 때 그의 요점을 명확히하거나 일반화하고자한다면 그것은 좋을 것이다 :-)

편집 3 :

이것을 마무리하기 만하면됩니다.팀의 대답을 받아 들인 이유는 Apache ErrorDocument 지시문이 어떻게 작동하는지에 대한 근본적인 오해가 있었기 때문입니다.그러나 Zend Framework 사용자 정의 상태 페이지를 사용하여 404 상태를 반환하고 싶다는 것을 발견하면서 문제가 발생한 문제를 해결하는 방법을 직접 보여주지는 못했지만 ZF를 시작하지 않고 ZF를 부트 스트랩 한 WordPress 쿼리에서 실행하고있었습니다. 부트 스트랩에서 실행되는 MVC 응용 프로그램. 나는 ZFs 프론트 컨트롤러로 경험을 쌓지는 못했지만, 약간의 문서를 파고 들자 나는이 솔루션을 생각해 냈습니다.이 솔루션은 내가 여행하기를 원했던 ErrorDocument 지시어와 완전히 동일한 효과를 내었습니다.

     $ error_url = $ this-> serverUrl  
. '/ default / error / error? error_handler [type] = 404'; $ request = new Zend_Controller_Request_Http ($ error_url); $ front = Zend_Controller_Front :: getInstance
; $ front-> returnResponse (true); $ response = $ front-> dispatch ($ request); $ 응답 -> setRawHeader ( 'HTTP / 1. 1 404 찾을 수 없음 '); $ 응답 -> sendResponse
; 출구
;
February 12, 2018

아마도 htaccess 규칙에서 모든 요청을 Zend Framework로 라우팅하는 다시 쓰기 규칙이 있습니다.이 시점에서 아파치 (와 ErrorDocument)는 PHP가 요청을 처리하기를 원한다고 말했기 때문에 실제 그림과 다르다.

할 때 :

  http_response_code (404);
출구 

;

브라우저에 비어있는 404 페이지 보내기. 많은 브라우저는 서버로부터 수신 한 404 페이지의 크기가 X 바이트보다 작은 경우 사용자 친화적 인 404 페이지를 표시하도록 설정됩니다. (더 나은 사용자 경험을 위해서. )

젠드 프레임 워크는 이것을 알아야하고 PHP 코드를 넣을 곳 에 따라 자체 오류 페이지를 사용하십시오 (일부 구성 옵션을 기반으로 할 수도 있음).

젠드 프레임 워크 ErrorController 페이지를 원하는대로 수정하는 것이 좋습니다.나는 아파치에 요청을 처리하는 방법이 있다는 것을 믿지 않는다.