Почему файлы cookie не распознаются при нажатии на ссылку из внешнего источника (например, Excel, Word и т. Д.) - PullRequest
56 голосов
/ 16 апреля 2010

Я заметил, что при внешнем нажатии на ссылку из веб-браузера, например из Excel или Word, мой файл cookie сеанса изначально не распознается, даже если ссылка открывается на новой вкладке того же окна браузера.

Браузер в конце концов распознает свои cookie, но я озадачен тем, почему эта исходная ссылка из Excel или Word не работает. Чтобы сделать его еще более сложным, щелкнув ссылку, можно работать в Outlook.

Кто-нибудь знает, почему это может происходить? Я использую Zend Framework с PHP 5.3.

Ответы [ 16 ]

71 голосов
/ 29 апреля 2010

Это потому, что MS Office использует компонент Hlink.dll для поиска, является ли ссылка документом Office или чем-то еще. MS Office ожидает открыть документ, связанный с документами, без помощи внешнего браузера (используя компонент Hlink.dll в IE6).

Если сессионный cookie защищает веб-сайт, Hlink естественно перенаправляется на страницу входа в систему и, достигнув HTML-страницы и не в состоянии «понять», открывает его во внешнем браузере. Обратите внимание, что открывается не исходный URL (ожидаемое поведение), а результат перенаправления, даже если оно было перенаправлением 302.

Microsoft имеет эту ошибку в неподдерживаемом компоненте (Hlink.dll), вместо того, чтобы признать ошибку, которую они передают нам в голову (пытаясь убедить нас, что это недостаток системы SSO, которую мы используем, т.е. сессионные куки) и отказывается обновлять его. Он предлагает обходной путь, который отключает функцию поиска MS Office:

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

Или предложите нам обойти сервер, чтобы избежать перенаправлений HTTP и перехода на перенаправления Javascript или перенаправления META REFRESH (т. Е. Чтобы Hlink получал текстовую / html-страницу на исходном URL-адресе и заставлял ее запускать внешний браузер для ее обработки).

16 голосов
/ 08 мая 2012

У нас была такая же проблема, и мы написали гем с открытым исходным кодом, чтобы помочь тем, кто использует 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

12 голосов
/ 05 мая 2016

На стороне сервера это работало для меня в 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>
6 голосов
/ 24 июля 2015

Вот решение для C # ASP.NET, основанное на ответе Spilliton выше. В 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();
        }
    }
4 голосов
/ 29 июля 2015

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();
    }
}

.. перенаправить после этого кода

4 голосов
/ 20 февраля 2014

Исправление для 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

Это в основном заставляет браузер обновлять страницу, поэтому запрос приходит с пользовательским агентом браузера и всеми правильными файлами cookie.

2 голосов
/ 31 января 2014

1. От Excel / слово указывают на http://example.com/from_excel.php

2.В «from_excel.php» перенаправить на страницу, где вы используете сеанс

<script>document.location.href = "http://example.com/page_with_session.php"; </script>
1 голос
/ 29 октября 2018

Мы видим проблему в том, что при щелчке URL-адреса из MS Word открывается две вкладки Chrome, а на открываемой странице перенаправляется JavaScript: window.location.href=blabla

Отладкой со стороны серверов мы подтвердили, что помимо приложения Chrome отправляются запросы из приложения Office. Это так странно.

Но в любом случае, проверив заголовок запроса «Пользователь-агент» и вернув пустую страницу в приложения Office, проблема с двумя вкладками была решена. Это определенно правильно!

1 голос
/ 25 января 2017

Вот исправление VBA для Excel. Та же самая концепция может быть применена к Microsoft Word. По сути, вместо того, чтобы запускать ссылку из Excel, код выполняет ссылку из оболочки. Вот код:

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. Нажмите OK .

Пара заметок:

  • Вам нужно будет сохранить электронную таблицу как электронную таблицу с поддержкой макросов (.Xlsm). Когда пользователи открывают электронную таблицу, их просят включить макросы. Если они ответят «Нет», ссылки не будут работать.
  • Эти инструкции основаны на Excel 2010. Предположительно, более поздние версии аналогичны.
1 голос
/ 28 мая 2011

Вот мое решение для этого в 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...