웹모아
웹모아[손님] 검색 로그인   
웹모아
 
환경설정
 


POST로 값을 넘길때, 만료된 페이지입니다 문제의 원인과 해결법.
  2007-08-27 14:24:03 댓글:(0)   조회:3072


일단, HTTP에 전송 방식(METHOD)에 대한 이야기부터 하겠습니다.
일반적으로 PHP에서 많이 쓰이는 HTTP 전송 방식은 GET 방식과 POST 방식이 있습니다. (실제로는 이 두개 말고도 많이 있습니다. 안쓰이는 것 뿐이지요.) 이 두 방식의 차이를 우선 아셔야 하겠습니다. (자세하게 알고 싶은 분은 RFC-2616 : HTTP/1.1을 읽어보십시오)

: GET 방식 :
example.php?var1=value1&var2=value2 와 같은 방식입니다. 일반적인 HTTP 호출은 모두 GET 방식으로 이루어집니다. (변수 넘기지 않는 일반 호출도 GET 입니다) GET 이라는 의미 그대로, 그 파일을 그대로 가져오는겁니다. 물론, PHP라면 변수를 받아서 조작이 가능하지요. 사용이 간편하다는 장점이 있습니다. 단점은, 첫쨰, 길이 제한이 있습니다. 넘길 수 있는건 http:// 부터 시작해서, 최대 255자입니다. (변수부분만 255자가 아닙니다) 두번째, 넘어가는 변수가 주소줄에 그대로 노출됩니다. 다른사람에게 보여줘서는 안되는 것을 넘기면 유출될 위험이 크지요. (예: 패스워드 등)

: POST 방식 :
일반적으로 HTML의 FORM을 이용해서 넘기는 방식입니다. (FORM 태그에서 method="POST"로 지정하는게 POST 방식을 이용하라는 의미입니다. - 지정 안하면 GET으로 넘어가지요) 이 방식은 서버에 값을 넘기기 위해 만들어진 방식입니다. GET 방식과 다르게 밖으로 보여지지 않으며, 길이에도 제한이 없습니다(규격상으로는).

* '만료된 페이지입니다.' 문제의 원인
만료된 페이지의 문제는 POST에서만 나타나게 됩니다. 원인은 POST 방식의 작동 원리에 있습니다. POST는 서버에 값을 넘겨서, 서버쪽에 영향을 미치게 하는 것을 목적으로 합니다. 그러므로 한번 값이 넘긴 뒤에, 그 페이지를 다시 읽으려고 하면 브라우저는 이미 서버쪽에서 처리가 끝났을것이라 생각하고, 다시 값을 보내지 않기 위해서 만료된 페이지 오류를 내보내게 됩니다. (이건 브라우저에서 내보내는 겁니다. 서버랑은 전혀 관계가 없지요. 서버는 POST 전송이 100번 오면 그냥 100번 다 처리합니다) 예를 들어서 설명하면, 게시판에 글을 씁니다. 글을 저장하고 표시해주는 페이지로 이동하겠지요? 그리고 그 페이지를 리로드 하게 되면, 계속해서 글을 저장하라는 전송을 하게 됩니다. 신용카드 결제 등의 폼에서도 이런 일이 일어날수 있습니다. 그래서 브라우저에서는 한번 POST로 전송하면 그 페이지를 다시 사용하지 못하도록 하는 겁니다.

* 해결법
다른 방법도 있을 수 있겠습니다만, 제가 쓰는 방법을 소개하도록 하겠습니다. 참고로, 이 방법은 제가 예전에 PURE LIFE DREAM(펄로 제작된 방명록 스크립트입니다)을 분석해서 얻어낸 방법입니다.
중요한 포인트는 처리하는 부분과, 출력하는 부분을 따로 만드는 것입니다. 그리고 HTTP의 헤더만을 이용해서 페이지의 움직임을 처리해주는 것이지요.
일단, 폼에서 action은 처리부 스크립트로 연결을 합니다. 값이 POST 방식으로 처리부로 넘어갑니다. 자, 넘어온 값에 맞게 처리합니다. (파일을 가공하던, DB를 업데이트 하건...) 그리고 처리부에서 출력해야할건 header("Location: ");을 이용해서 출력부로 연결해주는 헤더 뿐입니다. (브라우저 캐쉬 없애는 헤더도 넣어주면 더 좋습니다) HTTP 헤더의 Location이 사용자에게 전송이 됩니다. 브라우저가 이해합니다. 아, 이 페이지는 Location에 지정된 페이지로 연결되는구나! 그리고 **GET 방식**을 통해서 Location에 지정된 파일을 가져옵니다.

오류가 나오는 페이지와 바뀐 점은 무엇일까요? POST 방식으로 호출한 정보가 히스토리에 남아있지 않습니다. 그러므로 POST 전송이 완료된 페이지는 다시 보여주는 일이 없습니다.

정리해서 그림(?)으로 보여드리겠습니다 (제가 워낙 설명을 못해서)

문제가 발생하는 상황
1. 브라우저 ------ POST (값 넘어감) -------------> 서버
2. 서버(처리) -----------------------------------> 브라우저 (출력)

이후 리로드를 하면, 브라우저에서는 POST를 했으므로 다시 POST를 못하게 오류 출력.

해결법 적용
1. 브라우저 ------ POST (값 넘어감) -------------> 서버의 처리 파일
2. 서버의 처리파일 --------- HTTP 헤더 Location 전송 -----------> 브라우저
3. 브라우저 ------ GET으로 Location의 파일을 달라고 함 -------> 서버의 출력 파일
4. 서버의 출력 파일 ---------------------> 브라우저 (출력)

이후 리로드를 하면, GET 방식으로 가져온 파일이므로 리로드함.

온라인상에서 작성해서 별로 글이 깔끔하지 못합니다. 이해하고 봐주시길.
그리고 다른 해결법 있으면 소개 부탁드립니다. ^^



 댓글 (0)


환경설정
페이지: 2 / 5   

 

  crontab 에서 php 파일 실행이 가능한지요?
php 로 실행을 할수 있습니다. php도 shell 상에서 실행을 시킬수 있습니다. shell 상에서 php 를 실행시킨다면 다음과 같이 할수 있겠지요. smson@linux work]$ cat test.php #!/usr/local/php/bin/php -q [smson@linux work]$ test.php Son Sang M조회(1401)          




  crontab php 스크립트 실행문제입니다.
#!/usr/local/bin/php -q<? header("Content-Type: text/html; charset=euc-kr");   include("config.inc.php"); $conn=mysql_connect($cfg_db_host,$cfg_db_user,$cfg_db_pass); mysql_sele댓글 (1)     조회(1286)          




  2차 도메인과의 세션고유
www.domain.com 과 blog.domain.com cafe.domain.com 등 도메인은 같지만 2차가 달라서 다른 홈페이지로 돌릴대 서로 간단히 세션 공유하는방법이 있습니다. php.ini 셋팅을 변경하는 법입니다. php.ini 에서 session.cookie_domain = .domain.com 으로 변경해주면 됩니조회(1512)          




  POST로 값을 넘길때, 만료된 페이지입니다 문제의
일단, HTTP에 전송 방식(METHOD)에 대한 이야기부터 하겠습니다. 일반적으로 PHP에서 많이 쓰이는 HTTP 전송 방식은 GET 방식과 POST 방식이 있습니다. (실제로는 이 두개 말고도 많이 있습니다. 안쓰이는 것 뿐이지요.) 이 두 방식의 차이를 우선 아셔야 하겠습니다. (자세하게 알고 싶은 분은 RFC-2616 : HTTP/1.1을 읽어보(홈마스타)     조회(3073)          




  세션(로그인)시간 무한대로 늘리기 초간단 초보용
호스팅 받으면서 세션 시간을 늘리기는 좀 어려워서리..... 1. 인덱스 페이지를 프레임으로 만듭니다. 2. 널페이지를 만드시고 걍 ~ 리플래쉬 시킵니다. /////////////////////////////////////// index.php ///////////////////// (홈마스타)     댓글 (2)     조회(1395)          




  php mysql 세션 관리
세션을 DB에 저장해서 사용해 보죠. 이것은 어떤 장점이 있을까요? 본게시판의 alpastar님이 쓰신 '세션처리에 대한 생각(1)'을 읽어보시면 됩니다. ^^; 소스는 여러분이 이해하기 쉽게 클래스나 템플릿을 배제하였습니다. 조금만 손보시면 실무적으로도 사용가능 하다고 봅니다. 잘못된 점은, 다리 부러지지 않을정도로만 깊은 태클 (홈마스타)     조회(2465)          




  세션을 DB로 관리하기 + 쪽지 확인하기
[1] 대개의 경우, 회원 로그인에 세션을 사용합니다. 즉 회원으로 로그인하지 않으면 세션을 사용할 일이 없는 경우가 많습니다. 따라서 여기서는 회원 전용 세션만 관리하도록 하겠습니다. [2] 세션 테이블을 만들어서, 여기에 매번 insert, delete를 하는 것은 비록 테이블 크기가 작다고 하더라도 제법 부하를 줍니다. 따라서 여기서는 delet(홈마스타)     댓글 (1)     조회(1595)          




  브라우져를 종료해도 세션이 그대로 살아있어요
php.ini에서도 session.lifetime = 0 session.cookie_lifetime = 0 session.gc_maxlifetime = 0 이렇게 했거든요.. 근데 브라우져를 종료하고 나서 다시 서비스에 접속하면 세션 값이 그대로 살아있어서 자동으로 로그인이 되어버립니다.. 어떻게 하면 되죠? ==(홈마스타)     조회(2450)          




  PHP에서 세션 사용하기
1.session_unset() 현재 연결된 세션에 등록되어 있는 모든 변수의 값을 삭제한다. session_unregister() 함수는 지정한 하나의 변수 자체를 완전히 삭제하는데 반해 session_unset() 함수는 세션 변수 자체를 삭제하는 것이 아니라 세션 변수에 저장되어 있던 값을 삭제한다. 그리고 하나의 세션 변수가 아닌 현재 세션에(홈마스타)     조회(1380)          




  [설치/설정] PHP 파일업로드시 일정용량 이상 업
정상적으로 레드헷 9.0과 PHP 4.2 버전을 설치하였고 파일 업로드 코드도 정상적으로 코딩하였습니다. 그런데 500k 이상의 파일에서 업로드가 되지 않는 현상이 일어났습니다. 500k이하의 파일은 정상적으로 올라가나 그 이상크기의 파일은 반응이 없거나 페이지를 찾을 수 없는 에러가 나거나 하였습니다. 누구나 그렇듯이 저도 php.ini의 파일 (홈마스타)     조회(1257)          




≪ [1]  [2]  [3]  [4]  [5]   ≫

복수단어 검색은 공백(space)로 구분해 주세요.




최근 글
[손님]


인기 글
[손님]