2011-03-22 3 views
2

PHP 웹 사이트의 양식에서 $ _POST 변수를 수신하지 못했습니다.

<? 
print "POST:<pre>"; 
print_r($_POST); 
print "</pre>"; 
?> 
<form method="POST" action="POST_test.php"> 
<input type="submit" value="Save Changes"> 
<input type="hidden" name="blah" value="1"> 
</form> 

이의 내 아파치 웹 루트 폴더 "을 web_root"이며, 내 웹 사이트 폴더 "websiteA"라고하자

나는이 간단한 PHP 스크립트 "POST_test.php"를 만들어이 문제를 명확히하기 위해. 위의 스크립트를 "web_root/websiteA"에두고 IE7에서 버튼을 클릭하면 빈 $ _POST 배열이됩니다. 폴더 이름을 "web_root/websiteA2"로 변경하면 웹 루트의 다른 웹 사이트 (예 : "websiteB")에서 작동합니다. Firefox를 사용할 때 아무런 문제가 없습니다. 최근에 우리 시스템에서 NTLM 인증이 활성화되었습니다. 이것이 차이를 가져올 지 모르겠습니다.

아파치 & PHP는 데비안 리눅스 (다소 오래된 버전)를 실행하는 서버에서 실행됩니다.

IE에서 페이지의 Ctrl-Refresh를 시도했는데 도움이되지 않았습니다. 또한 PC를 재부팅하지 않았습니다.

업데이트 :이 포럼 게시물이 문제를 설명하기 위해 나타납니다 당신은 혼합 NTLM이 아닌 NTLM에 대한 데이터를 게시 사이트 웹을 인증 할 수 http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html

  1. . Microsoft Internet Explorer 은 웹 사이트의 NTLM 인증 된 폴더를 방문한 후 웹 사이트를 방문한 모든 사용자에 대해 NTLM 인증을 요구합니다. 다음과 같이

나는이 동작을 확인할 수 있습니다

내가 $ _POST http://mydomain/websiteA/POST_test.php이 테스트 페이지를 제출하여 채워지지 않습니다 다음 http://mydomain/websiteA/index.php를 방문 할 때.

그러나 IE7 창을 모두 닫으면 http://mydomain/websiteA/POST_test.php으로 바로 검색하면 $ _POST가 테스트 페이지를 제출하여 채워집니다.

내가 에 IE를 얻기 위해 본 유일한 방법은 사이트에 이전 NTLM 인증이있다 "잊지"

그리고 위의 링크 된 포럼 게시물에서 제안 된 솔루션 중 하나가 될 것으로 보인다 401 페이지 상태를 보내는 것입니다. 이 효과적으로 IE 인증 상태를 다시 설정합니다.

+0

'action' 속성의 값을'?'로 변경하면 작동합니까? – alex

+0

아니요 - URL에 바로 도착합니까? 결국, 결과는 동일합니다. –

+0

이것은 NTLM의 POST 데이터 문제를 설명합니다. http://lists.rubyonrails.org/pipermail/rails/2006-March/027283.html 동작이 유사한 지 확인하기 위해 몇 가지 테스트를 시도합니다 –

답변

2

제안 해 주셔서 감사합니다.그 인증이 완료 된 후

<?php 
    if (!isset($headers['Authorization'])){ 
    header('HTTP/1.1 401 Unauthorized'); 
    header('WWW-Authenticate: NTLM'); 
    exit; 
    } 
?> 

모든 $ _POST 데이터 :

그것은 문제가 관련이없는 다음과 같이 NTLM 인증을 살린 페이지 (또는 유사)에 대한 이전 요청에 의해 발생 된 것으로 밝혀졌다 IE가 닫히고 다시 열릴 때까지 공백으로 수신되었습니다. 지금까지 나는 위의 코드를 제거하고 대신 인트라넷 ($ _SERVER [ 'REMOTE_USER'] 변수를 설정 함)에서 NTLM을 사용하도록 Apache를 조정하여이 문제를 해결했습니다. (인트라넷 외부에서는 Apache 인증이 여전히 사용됩니다.)

+1

너와 똑같은 내 인생 –

0

실제로이 속성을 IE7에 비워 두지 않을 것으로 생각하기 때문에 "action"속성을 채워보십시오.

+0

action = "POST_test.php"가되도록 스크립트를 변경하면 동일한 결과가 나타납니다. –

+0

보통 작동하지만 이전 버전의 Safari에는 버그가 있습니다. Safari를 해결하려면'? '값을 사용할 수 있습니다. – alex

0

이 문제는 IE에서 사전 인증을 사용하지 않도록 설정하여 해결할 수 있습니다. 레지스트리에서 :

"HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Internet Settings" 

편집 메뉴에서 유형 REG_DWORD으로 값 이름 DisableNTLMPreAuth을 추가하고 1 (True)로 데이터 값을 설정합니다.

자세한 내용은 this bug reportMicrosoft KB 251404을 참조하십시오.

+1

하지만 클라이언트 쪽에서 만 작동한다면 웹 개발자에게는 아무 소용이 없지, 그렇지? –

+0

O.P.를 보았을 때 실제로 질문을 언급하지는 않았지만 해결 방법을 다운 투표 할 이유가 없습니다. 특정 상황에서는이 해결 방법을 완전히 수용 할 수 있습니다. –

2

열심히 노력한 후에이 문제에 대한 트릭을 발견했습니다. 나는 PHP가 포함 된 파일로 전체 ntlm 인증 코드를 사용했다. 그리고 나서 페이지의 헤더를 변경하는 mixed-ntlm 및 non-ntlm 문제로 인해 양식 POST를 작성할 수 없다.

당신이해야 할 일은 사이트의 모든 페이지를 시작할 때 동일한 ntlm 인증 코드를 포함하기 만하면됩니다.

문제는

희망이 사람들의 많은 도움이 :) ... 해결된다.

+0

고맙지 만 편집하고 싶지 않은 타사 앱을 사용하는 경우 좋지 않습니다. –

+0

답장을 보내 주시면 감사하겠습니다. 그러나 많은 것을 연구 한 후 지금까지 아무 것도 발견하지 못했습니다.이 외에도 대부분의 경우 사용자가 허용하거나 액세스 할 수없는 Windows 레지스트리 값을 편집하여 다른 해결책이 있습니다. – Sabbir

+0

오 추가 정보 .. 누군가가 Google에 ntlm 정보를 저장하고 쿠키를 사용하여 ntlm 정보를 저장하고 401 요청을 보내 ntlm 헤더를 취소하고 쿠키를 사용하여 원하는 정보를 얻는 방법에 대해 얘기하고 있었고 그런 식으로하면 UR ntlm 헤더 POST 방법으로 혼란. 하지만 난 아직 그것을 시도하고 다시 링크를 찾을 수 없습니다 .. 통풍구 그래서 만약 누군가가 시도하고 어떤 성공을 얻을 여기에 그것을 놓으십시오. – Sabbir

관련 문제