2010-06-23 1 views
5

http_referer를 저장하려고 했으므로 로그인 한 후 사용자를 해당 URL로 다시 보낼 수 있습니다. 지금 바로 내 컨트롤러에 before_filter가 있습니다. redirect_to를 통해 세션이 생성되지 않은 경우 해당 페이지를 로그인 페이지로 보냅니다. 그러나 내가 HTTP_REFERER를 체크했을 때 그것은 'REQUEST_URI'가 원래 어디에서 왔는지 리턴하는 반면에 그것은 '없음'이다.Ruby on Rails - request.env [ 'HTTP_REFERER']는 nil을 반환합니다.

감사합니다.

답변

11

HTTP_REFERER는 현재 요청한 페이지로 연결되는 링크가있는 이전 웹 페이지의 주소가 포함 된 요청에서 브라우저가 설정 한 HTTP 헤더입니다. 페이지로 바로 이동할 경우 은 설정되지 않습니다.

REQUEST_URI (request.request_uri()에서도 가능)는 Rails 컨트롤러/동작에 액세스하는 데 사용되는 URL이며 은 항상으로 설정해야합니다.

던져보기로이 디버깅 코드 :

<ul> 
<% request.env.each do |item| %> 
    <li><%= item[0] %> : <%= item[1] %></li> 
<% end %> 
</ul> 

HTTP_REFERER가 설정되지 않은 경우, 당신이 링크를 통해 해당 페이지로 이동하고 있는지 또는 리디렉션과가 설정되어 있는지 확인합니다.

귀하의 브라우저가 not setting HTTP_REFERER 헤더 일 가능성이 있습니다. 이 기능에 영향을 미치는 추가 기능이 없는지 확인하십시오. Tamper Data이라는 멋진 Firefox 부가 기능을 사용하여 보낼 헤더를 볼 수 있습니다.

+0

그래, 표시되지 않습니다, 그러나, 당신이 내게 준 코드는 요청이 가장 가능성이 내가 필요한 데이터 .... 코드에 대한 감사를 필터링되어 내 내부 방화벽을 통해가는 것을 보여줍니다! – Naujpr

+0

@ Naujpr : 문제를 해결하는 데 도움이되는 조작 데이터 링크가 포함되도록 답변을 업데이트했습니다. 행운을 빕니다! – Awgy

5

어떤 해결책을 제시하든 관계없이 클라이언트는 빈 리퍼러 사례를 처리 할 수 ​​있어야합니다. 클라이언트는이를 지정할지 여부를 선택할 수 있기 때문입니다. 예를 들어 사파리의 개인 정보 보호 및 Chrome의 시크릿 모드에서는

을 사용할 수 있습니다. 설정되어있는 경우 HTTP_REFERER를 사용하고 그렇지 않은 경우 오류를 발생시킵니다.

redirect_to : back을 사용하는 경우 리퍼러가없는 경우 RedirectBackError가 발생합니다. RedirectBackError를 복구하여이 ​​경우에 대한 대체 동작을 지정할 수 있습니다.