2011-11-22 52 views
11

我們在網上服務器場中有一個站點。該農場位於處理加密的SSL Accellerator之後。這意味着我們的IIS服務器將所有傳入連接視爲http,即使用戶都通過https連接到該站點。如何強制ScriptManager通過SSL提供CDN腳本

我們開始使用ScriptManager的EnableCDN = true屬性。在沒有SSL Accellerator的開發環境中,使用https呈現CDN上js文件的引用,但在生產環境中,它們通過http不安全地呈現,導致js被阻止顯示「僅顯示安全內容「錯誤。

手動更新scriptmanager中的所有腳本引用或通過模塊重寫HTML出路的方法不足,有誰知道強制scriptmanager通過https呈現其引用的方法嗎?

編輯:

做一些反射經審查,我不相信這是可能的。我已經將下面的黑客入侵了,然而這顯然是脆弱的,因爲它涉及訪問私人領域。如果任何人都能看到更好的方式,我很樂意聽到它。

var secureConnectionField = ScriptManager.GetType().GetField("_isSecureConnection", BindingFlags.Instance | BindingFlags.NonPublic); 
if (secureConnectionField != null) 
    secureConnectionField.SetValue(ScriptManager, true); 
+2

我還沒有嘗試過爲你描述的情況,但也有在HTML/JS的幾個地方,你可以省略協議,瀏覽器將使用相同的協議請求URL爲包含頁面。例如,「//cdn.mydomain.com/myfile.js」 – RickNZ

+0

感謝您的提示,但在這種情況下,我不控制呈現的url - 它在框架dll中註冊。我不相信在渲染CDN引用時有一段時間告訴腳本管理器省略協議。 –

+0

ScriptManager是一個控件,因此您應該能夠構建一個將覆蓋路徑生成邏輯的控件適配器,或者可以構建一個從原始繼承的新控件,並使用標記映射在您的應用程序中動態替換它。 – RickNZ

回答

0

通常情況下你的開發和生產服務器上都會有不同的IP範圍。請開發團隊根據框架dll中的IP地址應用「協議轉換」。

+0

感謝您的想法,但這對我們來說並不真實,因爲Web服務器仍然通過設計在http中看到頁面。我們使用SSL accellerator將加密負載移出IIS。腳本管理員正在查看IIS的服務內容。 –

1

如果您使用ASP.NET 4.0或更高版本,則其中一種解決方案是使用ScriptManager控件的ScriptResourceMapping功能。

例如,在全球ASAX您可以添加以下代碼:

void Application_Start(object sender, EventArgs e) { 

// map a simple name to a path 

ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition { 

    Path = "~/scripts/jquery-1.3.2.min.js", 

    DebugPath = "~/scripts/jquery-1.3.2.js", 

    CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js", 

    CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js" 

}); 

} 

所以,你可以看到你可以明確地設置CDN路徑。此外,您可以覆蓋標準Ajax文件的腳本映射。

的更多信息可以在這篇文章中找到:http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx

-1

使用此Global.asax的

void Application_Start(object sender, EventArgs e) { 

// map a simple name to a path 

ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition { 

    Path = "~/scripts/jquery-1.3.2.min.js", 

    DebugPath = "~/scripts/jquery-1.3.2.js", 

    CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js", 

    CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js" 

}); 

} 
+0

您需要覆蓋每個dll引用的每個js文件的每個CDN路徑。這似乎是不切實際的。 –

1

要處理類似你的情況,我配置了BundleCollection使用CDN和兩個不同的版本的調試和生產庫。

這些設置的結果是在調試時將使用未縮小的一個,並且將在生產中使用來自CDN的縮小的一個。局部縮小的被忽略。

[...] 
bundles.UseCdn = true; 
[...] 
var jQueryBundle = new ScriptBundle("~/bundles/jquery"); 
jQueryBundle.CdnPath = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"; 
jQueryBundle.Include("~/scripts/jquery-1.9.1.js"); 
jQueryBundle.Include("~/scripts/jquery-1.9.1.min.js"); 
bundles.Add(jQueryBundle); 

請注意,我沒有指定的協議的CdnPath,客戶端的瀏覽器會自動使用當前的協議,客戶端從,HTTP或HTTPS連接。

客戶端的瀏覽器會收到以下標籤生產:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> 

開發者的瀏覽器會收到以下標籤:

<script src="/Scripts/jquery-1.9.1.js"></script> 

都將使用正確的協議上的瀏覽器。

0

無論您使用的是@RazorASPX,我假設你有一個Layout/MasterPage地方。

CDN'真正的威力在於特意讓腳本遠離您的服務器之外的其他來源遠程託管。這樣做會提示用戶的瀏覽器從不同位置獲取它的可能性更大。 CDN對核心庫的性能表現最佳,如AngularJSjQuery。您正在導入的腳本不太流行,建議不要通過CDN提供腳本。

我覺得它更適合硬編碼它在你的佈局。如果您僅使用//而不是指定使用http://https://的協議,則它應該選取與調用頁面相同的協議。

<script type="text/javascript" src="//{yourCDNsource}"></script>

如果本地壓縮/再壓縮遠程CDN它違背了目的。這些人最好使用NuGetBower

檢查Google CDNs