Excel: Clique em URL de chamadas de hiperlink três vezes

0

Ao clicar em um hyperlink no Excel, o recurso será chamado três vezes (ou duas vezes, se o URL foi visitado antes). Primeira e segunda vez escondida, terceira vez como esperado em um navegador.

Detalhes

Estou usando o HYPERLINK-formular no Excel 2016 como o seguinte, mas o problema também ocorre ao trabalhar sem um formulário e apenas o recurso de hiperlink:

=HYPERLINK(CONFIRM_NO_DATA_URL&B3)

De qualquer forma, é suposto chamar um URL como este

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

Quando clico na célula, uma nova guia é aberta com o URL correto.

Mas: Na verdade, o URL está sendo chamado três vezes (notei que, em primeiro lugar, três emails foram enviados com um pequeno atraso).

Eu tentei descobrir de onde isso veio, colocando os Cabeçalhos HTTP em um arquivo. Descobriu-se, excel chama o hiperlink internamente momentos antes que abra o link em um navegador. Além disso, os cabeçalhos Http fornecidos diferem do pedido final.

Primeiro pedido oculto

Esta é a primeira requisição usando o método de requisição HTTP 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
}

The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. source: [w3.org][1]

Segunda solicitação oculta

O segundo pedido é difícil de identificar, parece que o Excel zomba de vários agentes de usuário:

{
    "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
}

Pergunta

Como evitar esse comportamento no lado do Excel?

(Claro que eu posso evitar isso no meu script PHP bloqueando o HTTP_USER_AGENT contendo " ms-office " ou o REQUEST_METHOD " HEAD ", mas eu prefiro uma limpeza solução).

Notas laterais

UPDATE # 1

Acabei de encontrar essa SO pergunta, que descreve o mesmo comportamento: link

UPDATE # 2 Enquanto me aprofundo nisso eu encontro mais e mais tipos de SO -threads, assim, o que dá uma boa descrição desse "recurso": link

Porém, há uma pequena diferença. O MÉTODO DE PEDIDO do primeiro pedido no meu caso é CABEÇA, não OPÇÃO como na resposta acima mencionada. De qualquer forma, isso ainda não me ajuda a resolver o problema.

UPDATE # 3 Ao tentar reproduzir isso, descobri que não há dois, mas três solicitações feitas.

    
por n.r. 18.09.2018 / 11:28

2 respostas

0

Eu não tenho certeza, mas como eu estava testando eu notei que o Excel está abrindo links no "Internet Explorer" para verificar a segurança ou para a excisão.

por exemplo, se você digitar o URL incorreto, o Excel exibirá a capacidade de abrir, ocorreu um problema de segurança, não um brawser.

eu testei em

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

e recebeu esta mensagem mensagem de erro

então eu não acho que é possível "Corrigir" esse tipo de problema do excel

    
por 18.09.2018 / 15:42
0

Este comportamento (pelo menos o primeiro pedido HEAD) é causado pela chamada Microsoft Office Protocol Discovery introduzida no Office 2007 ver blogs.msdn.microsoft.com :

The purpose of the HEAD request is to check that the content exists at the URL location as a document, and not simply as a tempoary resource streamed down for a read-only session

The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. source: w3.org

De acordo com este technet-thread não há como desabilitar esse recurso.

Solução alternativa

Como não há como desabilitar esse recurso, você só pode bloquear a solicitação no lado do servidor (ou usar um firewall do lado do cliente ...):

PHP-whise, seria possível negar um pedido como esse com este par de linhas. Isso simplesmente captura o REQUEST_METHOD para a primeira solicitação oculta e verifica novamente o agente do usuário estranho a partir da segunda solicitação oculta:

    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 : Isso funciona no cenário descrito acima, sinta-se à vontade para adaptá-lo para evitar o bloqueio de tráfego, que é realmente "desejado".

Leitura adicional

por 20.09.2018 / 17:43