2014-01-16 115 views
2

在控制器我試圖做重定向到使用Rails外部URL不起作用

redirect_to @url 

@url是HTTPS URL這是正確的格式

當我做什麼都在瀏覽器中發生

日誌顯示有一個重定向,但在巡視鉻我看到

Request URL:https://..myurl... 
Request Headers CAUTION: Provisional headers are shown. 
Origin:http://localhost:3000 
Referer:http://localhost:3000/cars/105 
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36 
Query String Parametersview sourceview URL encoded 
tId:6f6bfeaf-fd47-42ae-8e43-6b7118d21b0b 

網絡選項卡顯示它已被取消。

我錯過了什麼嗎?爲什麼不重定向發生?

+0

如果添加狀態碼會怎麼樣?像redirect_to網址,狀態:301 – jibai31

+0

仍然無法正常工作。Chrome檢查顯示紅色重定向,並表示它被取消。 –

+0

Ajax或只是標準請求? –

回答

0

搜索在一段時間後(注意:臨時標題所示) 我認爲這是關係到一些Chrome擴展,如廣告攔截器或net-內部 引用another stackoverflow question「的消息是有原因請求檢索資源從未做過,因此顯示的頭文件不是真實的東西,正如您引用的問題所解釋的那樣,當服務器響應時會更新真正的頭文件,但如果請求被阻止,則沒有響應。

您可以確保所有能夠阻止請求的擴展都被禁用並再次嘗試。

+0

好吧我會嘗試 –

+0

好吧,並告訴我什麼是更新 –

+0

我看你有它在不同的應用程序,並支持我的理論更多我實際上嘗試了它,同時讓我的廣告攔截器,並做了相同的行爲 –

0

您是否可以訪問該頁面並在Chrome中查看而沒有任何安全警告?

我已經有css等不加載,因爲我通過https請求它到本地服務器與未經驗證的證書。 Chrome瀏覽器在訪問網址之前可能會在幕後檢查,但我無法確定。

嘗試redirect_to https://www.google.com看看是否有效。

+0

nope,不起作用 –

0

我想你需要指定你想使用的協議是使用SSL。該ActionController::Base#redirect_to方法接受一個選項哈希,這是:protocol它允許您定義的參數之一:

redirect_to :protocol => 'https://' 

如果所有的重定向將要通過SSL這將是有意義的把這個在做您的控制器中有before_action。你可以像定義的方法:

def redirect_via_https 
    redirect_to :protocol => "https://" unless (request.ssl? || request.local?) 
end 

並添加到您的控制器:

class SpecificController 
    before_action :redirect_via_https 
end 
+0

該協議選項不需要(Net :: HTTP是我知道的唯一需要這個的類)。還有':host'和':port',所有3個都傳遞給'url_for'。這在使用'params.merge'時會很危險,請參閱http://blog.bmonkeys.net/2014/be-careful-with-params-merge –

+0

另外,如果您想在_your_頁面上實施SSL,則可以使用Rails的[ ForceSSL](http://api.rubyonrails.org/classes/ActionController/ForceSSL/ClassMethods.html) –

+0

沒有這種情況也沒有https url –

0

你是什麼軌的版本,因爲redirect_to的方法正在爲外部URL。

class HomeController < ApplicationController 
    def index 
    @url = "https://facebook.com" 
    redirect_to @url 
end 

它的工作原理。

+0

是的我意識到它的作品,但不適合我。請參閱問題 - 日誌顯示有重定向。 –

+1

您能否讓我知道您的配置... –

+0

什麼特別?它的漂亮香草 –

1

根據您的聲明,您看到該請求在Chrome的網絡標籤中被取消,這聽起來像是您嘗試在AJAX請求中執行此操作。跨域AJAX請求默認不支持。如果您可以控制https://..myurl...應用程序,則可以實施CORSJSONP

編輯

第三種方法,這是你提到在您的評論一個做什麼,是要解決在跨站點的限制通過後重定向在客戶端,重定向爲AJAX請求 AJAX請求完成(通過設置window.location)。但是,如果您的最終目標是將重定向透明地發生爲—作爲AJAX請求的一部分,而不是在—之後,則需要實施CORS或JSONP。

+0

他說在一個他的請求僅在添加遠程時才起作用:true –

+0

更具體地說,他說他添加了'remote:true',然後在收到響應後設置了'window.location'。換句話說,在AJAX請求完成後,他通過在客戶端重定向來解決跨源AJAX重定向問題。 –

+2

是的,基本上唯一有效的工作是做'remote:true'並手動設置'window.location'。在我的搜索中,redirect_to @external_url應該可以正常工作,無需使用CORS或JSONP –

0

我建議幾個故障排除步驟:

  • 嘗試使用其他瀏覽器(Safari瀏覽器,火狐),如果它的工作原理上的瀏覽器,那麼也許一個Chrome擴展阻止你訪問該的重定向URL。
  • 嘗試重定向到其他URL,嘗試使用和不使用https。
  • 檢查您的Rails操作是否爲AJAX調用。如果這是一個阿賈克斯請求,然後redirect_to將無法​​正常工作。
0

我認爲圍繞AJAX的懷疑是有根據的。考慮到我們提供給您的應用程序的狹隘觀點,我們很難猜測可能發生了什麼。嘗試改變

redirect_to @url 

if request.xhr? 
    render :update do |page| 
    page.redirect_to @url 
    end 
else 
    redirect_to @url 
end 

而且,順便說一句,@url可能有過多的範圍,給出的重定向。您可能最有可能使用url

編輯:

在我以前忽略的信息光,我敢肯定,以前的解決方案將解決此問題。基本上,一些瀏覽器對他們如何處理對xhr請求的響應更嚴格。使用標準的redirect_to,您可以發送xhr請求的「常規」響應。即使您有一個通常包含重定向代碼的* .js.rjs或* .js.erb,也會發生這種情況,因爲redirect_to調用會阻止代碼執行。如果您的應用程序的js已經優雅地降級,那麼您可能遲早會遇到此問題,因爲您似乎有好幾次。我發現了一些處理基本問題的好方法。

選項1:

一種方法是簡單地調整重定向到這個樣子:redirect_to(@url) unless request.xhr?,然後適當的重定向邏輯添加到您的* .js.erb文件。除了重定向之外,如果您還需要運行其他JavaScript,此方法很好。

選項2:

另一種解決方案是行之有效的,以這樣的添加到您的應用程序控制器:

def redirect_to(args) 
    if request.xhr? 
    render js: "window.location = '#{ _compute_redirect_to_location args }'" 
    else 
    super args 
    end 
end 

這是很好的,因爲你並不需要篩選的和修改你現有的代碼,它只是開始在任何地方工作。另一個好處是,您仍然可以將重定向限定爲前一個選項,以允許使用更復雜的JavaScript。如果您想進一步擴展該方法並真正使其適用於您,您甚至可以發瘋,並添加一些其他特定於應用程序的選項,如閃光消息。

方案3:

如果你不重寫現有的方法了,你可以添加類似:

def firm_redirect_to(url) 
    if request.xhr? 
    render js: "window.location = '#{ url }'" 
    else 
    redirect_to url 
    end 
end 

但你必須修改所有的代碼。

我個人更喜歡選項2的變體......無論如何,希望這有助於 - 祝你好運。

+0

你可能會發現這個有趣的,以及 - http://stackoverflow.com/questions/21177387/caution-provisional-headers-are-shown-in-chrome-debugger。 –

+0

值得注意的是,這實際上是@NickGinanto最終的解決方案,只是以更「Railsy」的方式編寫; 'page.redirect_to'將javascript寫入在客戶端設置'window.location.href'的頁面。 –

+0

@Charles - 感謝您指出了這一點,我懷疑這是發生了什麼,但我之前忽略了NickGinanto的評論,基本上證實了這一點。根據這些信息我已經擴大了答案。 –