2009-12-14 2 views
2

내 응용 프로그램에서 양식 기반 검색 결과와 함께 발생하는 반복적 인 문제에 대한 해결책을 찾고 있습니다.검색 결과 및 뒤로 버튼/HTML 양식

기본적으로 사용자가 HTML 양식을 사용하여 검색하고 데이터베이스의 결과를 다음 페이지에 표시 할 때 이것은 완벽하게 작동합니다. 사용자가 결과 집합의 개별 레코드를 클릭 한 다음 브라우저에서 "뒤로"를 클릭하면

그러나, 브라우저 (파이어 폭스) 요청 :

는 "이 페이지를 표시하려면, 파이어 폭스 을해야합니다 이전에 수행 된 작업 (검색 또는 주문 확인)을 반복 할 정보를 보내십시오. "

예를 들어, 사용자는 DVD 컬렉션을 검색하기 위해 연도별로 검색하고 개별 영화를 클릭합니다. 사용자가 검색 결과 페이지를 다시 클릭하면 사용자가 해당 양식 데이터를 다시 제출하거나 다시 보내지 않아도되기를 원하지 않습니다.

아무도이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

자세한 정보를 얻으려면 POST 메서드를 사용하여 양식을 제출하고 다음 헤더를 사용하여 브라우저에서 페이지를 캐시하지 못하도록합니다. 대부분의 사이트가 암호로 보호이므로

Header('Pragma: no-cache'); 
Header("Cache-control: private, no-cache, no-store"); 
Header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");. 

, 나는 암호로 보호 측면 캐시를 원하고 로그인 후까지 다시 가져 될 수 없습니다.

기본적으로 이러한 유형의 브라우저 동작을 피하는 가장 좋은 방법은 무엇이며 그 원인은 무엇입니까? 범행을 범하지 않습니까? 검색 결과 페이지의 페이지로드에서 향후 2 분의 만료 시간을 지정해야합니까?

다른 사이트에서이 문제가 나타나지 않기 때문에 가장 좋은 방법은 무엇입니까? no-cache 부분에 대해 모두 잘못 생각하고 있습니까?

답변

5

사용자가 "뒤로"를 클릭하면 브라우저가 페이지를 다시로드하기 위해 데이터를 다시 게시해야하므로 브라우저가이를 수행합니다. 이 문제를 해결하는 한 가지 방법은 POST 대신 GET 요청을 사용하는 것입니다. GET 요청에서 양식 데이터는 실제 URL에 포함되거나 인코딩됩니다.

GET 또는 POST를 사용하든 불필요한 데이터베이스 호출을 방지하기 위해 결과를 캐시하기 위해 세션을 사용해야하는지 여부를 고려해야합니다.

P. GET 요청을 사용하면 검색 결과 페이지를 북마크 할 수 있다는 장점이 있습니다.

편집 : 양식, POST/GET 요청 및이 문제를 해결하는 "게시 이후 리디렉션"패턴에 대한 정보를 포함한 here의 차이점에 대한 좋은 정보가 있습니다.

0

검색 정보는 POST 대신 GET을 사용할 수 있습니다. 그러면 양식 데이터가 URL에 유지됩니다. 사용자가 다시 클릭 할 때 POST 데이터를 다시 제출해야하기 때문에 문제가 발생했습니다.

0

이 동작을 방지하는 데는 두 가지 방법이 있습니다.

  1. 폼의 방법을 POST 에서 GET으로 변경하십시오. 이것은 URL에서 쿼리 를 인코딩이 뒤로 버튼 동작을 제거합니다. FWIW, Google 의 검색 결과입니다.
  2. 검색의 을 결과를 캐시 할 수있는 방법을 찾기 (세션 데이터 또는 Memcache를 말할), 및 에 302 Redirect 헤더를 사용하여 캐시 된 결과에 액세스 할 다른 페이지를 리디렉션.
0

그것은 PHP와는 아무 상관 없습니다. 당신이 다시 POST를 수행하도록 요청하는 POST를 수행 한 모든 페이지로 돌아가려면 뒤로 버튼을 사용하는 경우

.

는 GET으로 발생하지 않는 이유는 GET 정보가 URL에 것입니다.

+0

데이터가 URL에있는 것이 아니라 POST 데이터가 "쓰기"또는 데이터 변경으로 간주되는 반면 GET은 읽기 요청으로 간주됩니다. 리소스를 두 번 다시 읽지 않아도 아무런 영향이 없으며 리소스에 다시 쓰면 끔찍한 결과가 발생할 수 있습니다. 따라서 브라우저 경고. –

+0

대부분의 경우 사실이며 가치가 있습니다. ;-) 동의합니다. – streetparade