Excel: нажмите на ссылку гиперссылки три раза

367
n.r.

При нажатии на гиперссылку в Excel ресурс будет вызываться три раза (или два раза, если URL был посещен ранее). Первый и второй раз скрыты, третий раз, как и ожидалось в браузере.

подробности

Я использую HYPERLINK-формуляр в Excel 2016, как показано ниже, но проблема также возникает при работе без формул и только с функцией гиперссылки:

=HYPERLINK(CONFIRM_NO_DATA_URL&B3) 

Во всяком случае, он должен вызывать URL-адрес, как это

http://example.org/index.php?action=replyToEmailId&emailId=123123123 

Когда я щелкаю ячейку, открывается новая вкладка с правильным URL-адресом.

Но: URL на самом деле вызывается три раза (во-первых, я заметил это, потому что три письма были отправлены с небольшой задержкой).

Я попытался выяснить, откуда это взялось, поместив Http-заголовки в файл. Оказалось, что Excel вызывает внутреннюю гиперссылку за несколько секунд до открытия ссылки в браузере. Также предоставленные Http-заголовки отличаются от окончательного запроса.

Первый скрытый запрос

Это первый запрос, использующий HADTP-запрос-метод HEAD:

{ "HTTP_USER_AGENT": "Microsoft Office Excel 2014 (16.0.10730) Windows NT 10.0", "HTTP_X_OFFICE_MAJOR_VERSION": "16", "HTTP_X_MS_COOKIEURI_REQUESTED": "t", "HTTP_X_FEATUREVERSION": "1", "HTTP_ACCEPT_AUTH": "badger,Wlid1.1,Bearer", "REMOTE_PORT": "50216", "REQUEST_METHOD": "HEAD", "REQUEST_TIME_FLOAT": 1537284526.406, "REQUEST_TIME": 1537284526 } 

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе. источник: [w3.org] [1]

Второй скрытый запрос

Второй запрос довольно сложно идентифицировать, похоже, что Excel высмеивает нескольких пользовательских агентов:

{ "HTTP_ACCEPT": "*\/*", "HTTP_USER_AGENT": "Mozilla\/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident\/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; ms-office)", "HTTP_ACCEPT_ENCODING": "gzip, deflate", "REMOTE_PORT": "50221", "REQUEST_METHOD": "GET", "REQUEST_TIME_FLOAT": 1537284527.807, "REQUEST_TIME": 1537284527 } 

Вопрос

Как предотвратить это поведение на Excel-стороне?

(Конечно, я могу предотвратить это в своем PHP-скрипте, заблокировав HTTP_USER_AGENT, содержащий « ms-office » или REQUEST_METHOD « HEAD », но я предпочитаю чистое решение).

Примечания стороны

ОБНОВЛЕНИЕ № 1

Я только что нашел этот SO- вопрос, который как бы описывает то же поведение: https://stackoverflow.com/questions/24993813/link-in-excel-cause-duplicate-invocation

ОБНОВЛЕНИЕ № 2 При углубленном изучении этого вопроса я нахожу все больше и больше связанных с SO потоков, например, вот что дает хорошее описание этой "функции": https://webmasters.stackexchange.com/a/71151.

Хотя есть небольшая разница. МЕТОД ЗАПРОСА первого запроса в моем случае - ГОЛОВА, а не ОПЦИЯ, как в вышеупомянутом ответе. Во всяком случае, это все еще не помогает мне решить проблему.

ОБНОВЛЕНИЕ № 3 При попытке воспроизвести это я обнаружил, что было сделано не два, а три запроса.

0

2 ответа на вопрос

0
Bes Gh

я не уверен, но, как я тестировал, я заметил, что Excel открывает ссылки в «Internet Explorer», чтобы проверить безопасность или исключение.

например, если вы введете неправильный URL-адрес, который не сможет открыть экран Excel, возникла проблема безопасности, а не ошибка.

я проверял на

=HYPERLINK("https://test.test") 

и получил это сообщение об ошибке

так что я не думаю, что можно решить эту проблему из Excel

Да, я тоже это заметил. Кажется, это своего рода функция, но было бы здорово помешать Excel сделать это. Для меня, как пользователя, это также совершенно нормально, и также без разницы, когда я получаю 404 в моем реальном браузере. n.r. 5 лет назад 0
0
n.r.

Такое поведение (по крайней мере, первый HEAD-запрос) вызвано так называемым обнаружением протокола Microsoft Office, представленным в Office 2007, см. Blogs.msdn.microsoft.com :

Цель запроса HEAD состоит в том, чтобы проверить, что содержимое в URL-адресе существует как документ, а не просто как временный ресурс, передаваемый для сеанса только для чтения.

Метод HEAD идентичен GET, за исключением того, что сервер НЕ ДОЛЖЕН возвращать тело сообщения в ответе. источник: w3.org

Согласно этой теме, нет возможности отключить эту функцию.

Временное решение

Поскольку не существует способа фактически отключить эту функцию, вы можете заблокировать запрос только на стороне сервера (или использовать брандмауэр на стороне клиента ...):

PHP-whise можно было бы отклонить такой запрос с этой парой строк. Это просто перехватывает REQUEST_METHOD для первого скрытого запроса и снова проверяет странный пользовательский агент из второго скрытого запроса:

 if ($_SERVER['REQUEST_METHOD'] == 'HEAD' OR  strpos($_SERVER['USER_AGENT'], 'ms-office') != NULL) {  throw new Exception('This script may only be called directly'); die();  } 

Heads up : Это работает в вышеописанном сценарии, не стесняйтесь адаптировать его, чтобы избежать блокирования трафика, который на самом деле "требуется".

дальнейшее чтение

Похожие вопросы