É sabido que o fragmento de URL (a parte após #
) não é enviado ao servidor.
Eu me pergunto, no entanto, como os fragmentos funcionam quando um redirecionamento de servidor (via status HTTP 302 e Location:
cabeçalho) está envolvido.
Minha pergunta é realmente dupla:
Se a URL original tiver um fragmento (
/original.php#foo
) e um redirecionamento for feito/new.php
, a parte do fragmento da URL original simplesmente se perde? Ou às vezes é aplicado ao novo URL?
O novo URL estará/new.php#foo
neste caso?Independentemente da URL original, se o servidor redirecionar para uma nova URL com um fragmento (
/new.php#foo
), o fragmento será "respeitado"? Ou o servidor realmente não tem nenhum problema em interferir com o fragmento - e o navegador, portanto, o ignorará simplesmente acessando/new.php
??
Respostas:
Atualização 2014-jun-27 :
O RFC 7231, Protocolo de transferência de hipertexto (HTTP / 1.1): Semântica e conteúdo , foi publicado como um PADRÃO PROPOSTO. No Changelog :
Os pontos importantes da Seção 7.1.2. Localização :
Isso deve responder claramente às suas perguntas.
Atualizar END
esse é um problema aberto (não especificado) com a especificação HTTP atual . Ele é abordado em duas questões do grupo de trabalho httpbis da IETF :
# 6 permite fragmentos no
Location
cabeçalho. 43 diz o seguinte:isso leva à resposta mais compatível com o navegador e à prova do futuro (porque esse problema acabará sendo padronizado) para sua pergunta:
R: fragmentos de URLs originais são descartados.
B: fragmentos do
Location
cabeçalho são respeitados.fonte
O Safari 5 e o IE9 e abaixo eliminam o fragmento do URI original se ocorrer um redirecionamento HTTP / 3xx. Se o cabeçalho Location na resposta especificar um fragmento, ele será usado.
O IE10 +, o Chrome 11+, o Firefox 4+ e o Opera "reconectam" o fragmento do URI original depois de um redirecionamento 3xx.
Página de teste: http://www.webdbg.com/test/redir/fragment/ .
Veja mais discussões sobre esse problema em http://blogs.msdn.com/b/ieinternals/archive/2011/05/17/url-fragments-and-redirects-anchor-hash-missing.aspx
fonte
Location
contiver um fragmento, ele será mantido corretamente. Mas se um redirecionadoLocation
com um fragmento passar por outro redirecionamento 3xx, ele inexplicavelmente ignorará o fragmento do primeiro redirecionamento, o que não é consistente com os dois comportamentos anteriores. Chrome e Firefox o preservam de forma consistente.Apenas para que você saiba, aqui você pode encontrar as especificações adequadas. definindo como todos devem se comportar: http://www.w3.org/TR/cuap#uri - cláusula 4.1 - veja abaixo:
fonte
Publicando um problema semelhante com a solução enfrentada por mim.
Espero que ajude alguém com o mesmo requisito de
preserving hash in IE
redirecionamentos 302.Adicionando partes essenciais da resposta em vez de links apenas
Usamos
SiteMinder
autenticação em nosso aplicativo.Eu descobri que, após uma autenticação bem-sucedida,
SiteMinder
está fazendo302 redirection
a página de aplicativo solicitada pelo usuáriovalue
usando a variável oculta do formulário de login (onde armazena a URL solicitada pelo usuário/myapp/
-without hash fragment
já que não será enviada ao servidor) com um nome semelhanteredirect
. Exemplo de formulário abaixoComo o valor da
redirect
variável oculta contém apenas sem fragmento de hash e é um redirecionamento 302, o fragmento de hash é removido automaticamente pelo IE mesmo antes de chegar ao nosso aplicativo e quaisquer que sejam as soluções que estamos tentando no código do aplicativo não estão funcionando./myapp/
O IE está redirecionando
/myapp/
apenas para e está chegando na página inicial padrão do nosso aplicativohttps://ourapp.com/myapp/#/home
.Já perdi quase um dia para descobrir esse comportamento.
A solução é:
Alterou o valor da variável oculta ( ) do formulário de logon para manter o fragmento de hash anexando junto com o valor existente. Semelhante ao código abaixo
redirect
window.location.hash
Após essa alteração, a
redirect
variável oculta está armazenando o valor da URL solicitada pelo usuário/myapp/#/pending/requests
e aSiteMinder
está redirecionando para o/myapp/#/pending/requests
IE.A solução acima está funcionando bem nos três navegadores
Chrome, Firefox and IE
.Agradecemos a @AlexFord pela explicação detalhada e por fornecer a solução para esse problema.
fonte