2016-11-10 65 views
0

我的基於https的站點(站點A)使用基於http的站點B的圖像。導致混合內容錯誤。爲了解決這個問題,我找到了解決方案,使用我的控制器方法將每個外部鏈接(如http://www.siteB.com/imageX.png)交換到外部映像。新鏈接的格式是:https站點上http站點的圖像:混合模式

方法/api/misc/forward的代碼如下:

[HttpGet] 
    public async Task<HttpResponseMessage> Forward(string url) 
    { 
     HttpResponseMessage httpResponseMessage = new HttpResponseMessage(); 

     try 
     { 

      var response = Request.CreateResponse(HttpStatusCode.Found); 
      response.Headers.Location = new Uri(HttpUtility.UrlDecode(url)); 
      return response; 
     } 
     catch (Exception ex) 
     { 
      httpResponseMessage.StatusCode = HttpStatusCode.NotFound; 
      _loggerService.LogException(ex, url); 
     } 

     return httpResponseMessage; 
    } 

但瀏覽器仍然能夠將其識別爲混合模式....爲什麼? 從基於https的網站發送到瀏覽器源的原始圖像鏈接。

任何快速提示呢?我不想緩存站點B的所有圖像:)。

回答

1

因爲您的代碼將重定向發送回另一個位置,所以最終瀏覽器仍會轉到HTTP映像。

會發生什麼事是你的瀏覽器中調用HTTPS控制器,控制器動作發回重定向命令給瀏覽器,瀏覽器檢索來自您在response.Headers.Location設置新的位置圖像。

如果您想避免混合模式,那麼您需要從控制器中檢索圖像並從動作中返回FileResult,這樣瀏覽器就不必訪問HTTP網站。

另一種方法是將圖像複製到您的網站。

+0

是的,我在第一個解決方案中使用了內存緩存,但是我很喜歡它會降低服務器速度,所以我決定改變它:)。經過一些改變後,我認爲新版本的工作,但它沒有:( –

+0

您可以將文件寫入臨時目錄並稍後從硬盤提供它,也可以爲其設置輸出緩存以減少網頁上的點擊次數服務器,瀏覽器將緩存它,並不會從服務器請求它,這應該消除Web服務器上的任何負擔 –