2014年9月24日 星期三

[Note] Sinatra 判斷來源位址重新導向 筆記

在寫一些功能的時候,例如判斷來源網頁或者是驗證頁面。

有時必須要檢查上一個來的地方。


這裡就必須利用HTTP requests來幫助我們檢查。

假設在我們的sinatra 路由之中

程式如下

require 'sinatra'

get "/A" do
    redirect '/B' 
end

get "/B" do 
    # 如果來自A
    #     "我來自A"    
    # 如果不來自A
    #     "我非來自A 轉向C"
    #     redirect '/C'
    # end
end


我們進入B頁面的時候,會發生判斷來源位置進而導向其他網頁的需求。

因此,我們要利用HTTP request 的 referer 來幫助我們達到這個需求。

在B路由之中,作法如下

get "/B" do   
    if URI(request.referer).path == '/A'
      "來自A頁面"
    else
       redirect '/C'
  end
end


但是會發生一種狀況就是,不管怎麼從A進入,皆會進入C。

原因出在是內部server自動路由A->B 所以request.referer不管如何都是 /

因此皆會進入到C頁面。 代碼為:302 暫時導向

所以如果必須做出這個功能,就必須由Client端來做這方面的導向請求。

在client需求頁面增加的javaScript code如下:

<script type="text/javascript">window.location='/B';</script>


這樣的話就可以成功判斷來自於A的請求至導向B頁面

get "/B" do

    #這裡必須加入還有經過/ 進入的 
    mypath = URI(request.referrer || '').path
    if mypath == '/A'
      "來自於A"
    else
       redirect '/C'
  end
end


參考資料:
1.stackoveflow
2.stackoverflow - 2



沒有留言:

張貼留言