Como obter o Url Hash (#) do lado do servidor

133

Eu sei que no lado do cliente (javascript) você pode usar o windows.location.hash, mas não conseguiu encontrar o acesso do lado do servidor.

Ricky Supit
fonte
você conseguiu uma maneira desse problema, tenho marcadores com has no URL e deseja acessar o texto após o hash no servidor?
22139 dotnetcoder
As respostas explicam que isso não está disponível no servidor, porque é interpretado apenas pelo agente do usuário. Eu estava tentando alterar a guia ativa, o que estava tentando fazer no lado do servidor. Acabei fazendo isso no lado do cliente.
Ricky Supit 02/03/2009

Respostas:

134

Tivemos uma situação em que precisávamos persistir o hash da URL nas postagens do ASP.Net. Como o navegador não envia o hash para o servidor por padrão, a única maneira de fazer isso é usar algum Javascript:

  1. Quando o formulário for enviado, pegue o hash ( window.location.hash) e armazene-o em um campo de entrada oculto do servidor Coloque isso em um DIV com o ID " urlhash" para que possamos encontrá-lo facilmente mais tarde.

  2. No servidor, você pode usar esse valor se precisar fazer algo com ele. Você pode até mudar se precisar.

  3. No carregamento da página no cliente , verifique o valor deste campo oculto. Você deseja encontrá-lo pelo DIV em que está contido, pois o ID gerado automaticamente não será conhecido. Sim, você pode fazer alguns truques aqui com .ClientID, mas achamos mais simples usar o DIV do wrapper, pois permite que todo esse Javascript viva em um arquivo externo e seja usado de maneira genérica.

  4. Se o campo de entrada oculto tiver um valor válido, configure-o como o URL hash ( window.location.hash again) e / ou execute outras ações.

Usamos o jQuery para simplificar a seleção do campo, etc ... tudo isso acaba sendo algumas chamadas ao jQuery, uma para salvar o valor e outra para restaurá-lo.

Antes de enviar:

$("form").submit(function() {
  $("input", "#urlhash").val(window.location.hash);
});

No carregamento da página:

var hashVal = $("input", "#urlhash").val();
if (IsHashValid(hashVal)) {
  window.location.hash = hashVal;
}

IsHashValid()pode verificar " undefined" ou outras coisas com as quais não deseja lidar.

Além disso, certifique-se de usar $(document).ready()adequadamente, é claro.

Chris
fonte
4
Ótima solução, mas e a solicitação GET?
Warlock
2
@ Chris - Mas como o evento de envio de formulário é chamado quando você simplesmente cola o URL em um navegador diferente (porque é apenas uma solicitação GET)?
KrishPrabakar
@Warlock, independentemente de obter / publicar, ele funcionará, pois você está armazenando o hash em um campo oculto.
KMX
83

Seção 4.1 da RFC 2396 :

Quando uma referência de URI é usada para executar uma ação de recuperação no recurso identificado, o identificador de fragmento opcional, separado do URI por um caractere de hachura ("#"), consiste em informações de referência adicionais a serem interpretadas pelo agente do usuário após a recuperação ação foi concluída com êxito . Como tal, não faz parte de um URI, mas é frequentemente usado em conjunto com um URI.

(enfase adicionada)

Mauricio Scheffer
fonte
3
Estou surpreso. Eu li muito sobre SPA e não sabia disso. Então o navegador envia tanta informação sensível, mas não o hash? Eu acho que deveria no futuro .. pelo menos como um cabeçalho HTTP separado. Isso está relacionado: onebigfluke.com/2015/01/…
bodrin
42

Isso ocorre porque o navegador não transmite essa parte ao servidor, desculpe.

Julien Oster
fonte
7

Provavelmente, a única opção é lê-lo no lado do cliente e transferi-lo manualmente para o servidor (GET / POST / AJAX). Atenciosamente Artur

Você também pode ver como jogar com o botão voltar e o histórico do navegador em Malcan


fonte
3

Apenas para descartar a possibilidade de você não estar realmente tentando ver o fragmento em um GET / POST e realmente querer saber como acessar a parte de um objeto URI que você possui no código do servidor, ele está em Uri.Fragment ( Documentos do MSDN ).

Patridge
fonte
8
IE8, Chrome e Firefox, todos não enviarão o hash para o servidor; assim, o Uri.Fragment é sempre uma cadeia vazia se você examinar server-side Request.Url.Fragment (de acordo com as respostas acima.)
zcrar70
0

Solução possível para solicitações GET:

Novo formato de link: http://example.com/yourDirectory?hash=video01

Chame esta função na parte superior do controlador ou http://example.com/yourDirectory/index.php:

function redirect()
{
    if (!empty($_GET['hash'])) {
        /** Sanitize & Validate $_GET['hash']
               If valid return string
               If invalid: return empty or false
        ******************************************************/
        $validHash = sanitizeAndValidateHashFunction($_GET['hash']);
        if (!empty($validHash)) {
            $url = './#' . $validHash;
        } else {
            $url = '/your404page.php';
        }
        header("Location: $url");
    }
}
webaholik
fonte