2010-04-16 20 views
47

我注意到,當從Web瀏覽器(例如Excel或Word)的外部點擊鏈接時,我的會話cookie最初無法識別,即使鏈接在相同瀏覽器窗口的新選項卡中打開。爲什麼當從外部來源(如Excel,Word等)點擊鏈接時cookie無法識別

瀏覽器最終終於識別出它的cookie,但我很困惑,爲什麼從Excel或Word的初始鏈接不起作用。爲了使它更具挑戰性,點擊鏈接可以在Outlook中正常工作。

有人知道爲什麼會發生這種情況嗎?我在PHP 5.3中使用Zend Framework。

+2

我覺得這個問題與框架,會話甚至php都沒有關係。但更多的瀏覽器相關。你使用什麼瀏覽器並且你嘗試過其他的瀏覽器?它發送任何cookie嗎? – 2010-04-16 15:20:13

+1

這發生在IE8,Chrome和我相信Firefox。在調試時,似乎沒有發送cookie或正在創建新的cookie,我無法確認。但我確定沒有發送正確的cookie。 – Nick 2010-04-16 19:27:06

回答

58

這是因爲MS Office使用Hlink.dll組件來查找鏈接是否是Office文檔或其他內容。 MS Office希望在沒有外部瀏覽器(使用IE6的Hlink.dll組件)的幫助下打開文檔中鏈接的文檔。

如果會話cookie保護網站Hlink自然會被重定向到登錄頁面,並且已經到達HTML頁面並且無法「理解」它會在外部瀏覽器中打開它。請注意,它不會打開原始URL(預期行爲),而是重定向的結果,即使它是302重定向。

Microsoft在不受支持的組件(Hlink.dll)中存在該錯誤,而不是識別它們turn it over to our head(試圖讓我們相信它是我們使用的SSO系統的缺陷,即會話cookie)並拒絕升級它的錯誤。它提供的MS Office workaround that turns off the lookup functionality

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ 
    Office\9.0\Common\Internet\ForceShellExecute:DWORD=1 

或提供我們要解決服務器端,以避免HTTP重定向和更改成JavaScript重定向或元刷新重定向(即有HLINK對原始URL獲取文本/ html頁面,並使其運行外部瀏覽器來處理它)。

+0

謝謝你。我完全被這種行爲所困擾。其他辦公應用程序讓我們粘貼到我們的應用程序的鏈接沒有問題,但MS Office每次都獲取登錄頁面。 – Sean 2013-05-15 21:25:42

+0

謝謝,它幫助我了!你有鏈接,但我會進入這個無論如何。對於Windows 64位版本的Office的32位版本,關鍵是HKLM \ SOFTWARE \ Wow6432Node \ Microsoft \ Office \ 9.0 \ Common \ Internet \',是的,它對於MS Office 2013也是'9.0' – 244an 2015-05-25 17:14:01

+5

他們的邪惡試圖在SSO上責怪這一點。 – 2016-02-24 12:36:42

-2

我懷疑這是你如何設置cookie的問題。

由於網絡的創建方式,example.com與www.example.com不同,因此:您可以登錄www.example.com而不是登錄example.com

換句話說,請檢查您的word或excel文件中的URL--它與您在瀏覽器中的登錄方式是否相同?

此cookie不一致有兩種修復/解決方案: 1.重定向任何嘗試加載您的站點而不使用www的人。與www相同的頁面。 (反之亦然)或 2.當您設置cookie時,請務必將域參數指定爲「.example.com」。最後一個點表示cookie也應該在該域的所有子域上有效。

我懷疑瀏覽器最終承認那是因爲你可能最終結束了降落在相同的域結構的URL,你是如何在。

希望這有助於記錄的原因。

1

這是我在WordPress的解決方案。將此添加到主題或其他插件文件中的functions.php中。

如果您的系統(如WP)將已註銷的用戶發送到登錄頁面並重定向到他們嘗試訪問的頁面,這可能會有所幫助。 Word正在將用戶發送到此頁面,但隨後WP無法正確處理用戶已登錄的情況。此代碼檢查是否存在當前用戶並傳遞了redirect_to參數。如果是這樣,它會重定向到redirect_to位置。

function my_logged_in_redirect_to() 
{ 
global $current_user; 

if($current_user->ID && $_REQUEST['redirect_to']) 
{   
    wp_redirect($_REQUEST['redirect_to']); 
    exit; 
} 
} 
add_action('wp', 'my_logged_in_redirect_to'); 
13

我們有同樣的問題,並寫了一個開源的寶石,以幫助那些使用Rails:https://github.com/spilliton/fix_microsoft_links

您可以使用我們在任何框架中使用,雖然同樣的方法:

  1. 檢測是否用戶代理來自Microsoft產品
  2. 使用元刷新標記呈現空白html頁面,這會導致瀏覽器使用正確的cookie刷新頁面

示例代碼在這裏:https://github.com/spilliton/fix_microsoft_links/blob/master/lib/fix_microsoft_links.rb

+0

這顆寶石是一個很好的解決方案。 – mastaBlasta 2013-12-13 21:38:31

+0

男人,非常感謝你。我用你的代碼爲express.js構建了一箇中間件https://github.com/auth0/fix-office-link – 2014-07-21 20:04:34

+0

沒問題!很高興它證明有用:) – spilliton 2014-07-22 20:56:39

4

修復頁面對於VB.NET:

Dim userAgent As String = System.Web.HttpContext.Current.Request.UserAgent 

If userAgent.Contains("Word") Or userAgent.Contains("Excel") Or userAgent.Contains("PowerPoint") Or userAgent.Contains("ms-office") Then 
     System.Web.HttpContext.Current.Response.Clear() 
     System.Web.HttpContext.Current.Response.Write("<html><head><meta http-equiv='refresh' content='0'/></head><body></body></html>") 
     System.Web.HttpContext.Current.Response.End() 
End If 

它基本上強制眉ser來刷新頁面,因此請求會與瀏覽器的用戶代理和所有正確的cookie一起進入。

4

下面是基於spilliton上面的答案的C#ASP.NET解決方案。在Global.asax.cs中,添加以下:

private static string MSUserAgentsRegex = @"[^\w](Word|Excel|PowerPoint|ms-office)([^\w]|\z)"; 
    protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e) 
    { 
     if (System.Text.RegularExpressions.Regex.IsMatch(Request.UserAgent, MSUserAgentsRegex)) 
     { 
      Response.Write("<html><head><meta http-equiv='refresh' content='0'/></head><body></body></html>"); 
      Response.End(); 
     } 
    } 
+0

我也會添加一個檢查,如果請求在檢查正則表達式之前進行身份驗證。在每個請求上將userAgent與正則表達式匹配可能會導致性能問題。 – trailmax 2015-10-27 16:20:37

3

PHP溶液:

這防止了MS產品識別重定向。 MS因此從所需鏈接啓動瀏覽器。

if (isset($_SERVER['HTTP_USER_AGENT'])) 
{ 
    $http_user_agent = $_SERVER['HTTP_USER_AGENT']; 
    if (preg_match('/Word|Excel|PowerPoint|ms-office/i', $http_user_agent)) 
    { 
     // Prevent MS office products detecting the upcoming re-direct .. forces them to launch the browser to this link 
     die(); 
    } 
} 

..重定向這個代碼後

0

我必須解決這個問題,爲ASP.NET網站,但我只是想使用JavaScript/jQuery的:

var isCoBrowse = ('<%= Session["user"].ToString().ToLower() %>' != '0'); 
if (isCoBrowse && window.location.href.indexOf('ReturnUrl=') >= 0 && window.location.href.indexOf('dllCheq') == -1) { 
    //redirect to the ReturnUrl & add dllCheq to the URI 
    var toRedirect = decodeURIComponent(gup('ReturnUrl', window.location.href)) + '&dllCheq'; 
    window.location = toRedirect; 
} 

我得到了GUP功能來自: How to get the value from the URL parameter?

0

使用以下微軟給出的鏈接提供的修補程序。 https://support.microsoft.com/en-us/kb/218153

+1

此鏈接已在接受的答案中提及。此外,這裏提出的解決方案對於所有Office產品的功能鏈接都有顯着的影響。 – kmote 2016-07-13 16:14:13

6

服務器端這個工作對我來說在IIS(使用重寫規則)

<rule name="WordBypass" enabled="true" stopProcessing="true"> 
    <match url=".*" /> 
    <conditions> 
     <add input="{HTTP_USER_AGENT}" pattern="Word|Excel|PowerPoint|ms-office" /> 
    </conditions> 
    <action type="CustomResponse" statusCode="200" statusReason="Refresh" statusDescription="Refresh" /> 
</rule> 
+0

這是我的MVC5應用程序的快速和簡單的修復。我根據需要定製了模式。請注意,這需要在Web服務器上安裝Microsoft Url Rewrite軟件。 https://www.iis.net/downloads/microsoft/url-rewrite – laylarenee 2017-02-07 16:33:12

+0

更好的IIS來糾正這種行爲比應用程序本身 – Dan 2017-12-08 16:33:33

1

這裏有一個VBA修復,爲Excel。相同的概念可以應用於Microsoft Word。基本上,不是從Excel內引發鏈接,而是從shell內執行鏈接。 下面的代碼:

Private Sub Worksheet_FollowHyperlink(ByVal objLink As Hyperlink) 
    Application.EnableEvents = False 
    Dim strAddress As String 
    strAddress = "explorer " & objLink.TextToDisplay 
    Dim dblReturn As Double 
    dblReturn = Shell(strAddress) 
    Application.EnableEvents = True 
End Sub 
  1. 對於包含鏈接的Excel工作表中,右鍵單擊工作表標籤,然後單擊查看代碼。 VBA編輯器出現。
  2. 將代碼粘貼到窗口中,然後關閉編輯器。
  3. 修改頁面中的每個鏈接,以便它只是指回到它是在細胞要做到這一點:
  4. 右鍵單擊該鏈接,然後單擊編輯超鏈接。出現編輯超鏈接窗口。
  5. 點擊加入購物車
  6. 單擊工作表名稱。
  7. 對於鍵入單元格引用,輸入單元格引用(例如A4)。
  8. Click OK

有兩點要注意:

  • 您需要將電子表格保存爲啓用宏的電子表格 (.XLSM)。當用戶打開電子表格時,他們會被要求去啓動宏 。如果他們回答否,鏈接將不起作用。
  • 這些說明基於Excel 2010.推測後續版本類似。
相關問題