Gostaria de anexar um #fragment
para o cliente ler em determinadas URLs (e usadas por um SPA).
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^foo/? /foo#bar [QSA,NE,L,R=301]
</IfModule>
No entanto, como #bar
é um fragmento na URL acima, parece ser removido e causar um loop de redirecionamento. Eu também tentei escapar do hash como RewriteRule ^foo/? /foo\#bar
.
Existe alguma maneira de limitar isso RewriteRule
a apenas um redirecionamento?
- Estou escrevendo isso em um
.htaccess
arquivo no diretório de destino. O servidor web éhttpd -v
Server version: Apache/2.4.39
(centos)
Você não pode. Os fragmentos são tratados apenas pelo navegador. Eles nunca são transmitidos para o servidor.
O problema não é a resposta de redirecionamento.
/foo#bar
está sendo enviado corretamente de volta ao cliente noLocation:
cabeçalho (oNE
sinalizador ajuda aqui, evitando que#
seja codificado em URL na resposta).O problema é que o navegador não envia o identificador do fragmento de volta ao servidor na solicitação redirecionada (como @Gerald afirmou, "[Fragmentos] nunca são transmitidos ao servidor"). Assim, o servidor vê repetidamente
/foo
, daí o loop de redirecionamento. Não há nada que você possa fazer sobre o identificador de fragmento ausente.Do ponto de vista do servidor, você precisaria alterar a URL de alguma outra forma, talvez anexando um parâmetro de string de consulta. Por exemplo:
O acima anexa um
redirect=1
parâmetro de URL à resposta de redirecionamento e a condição garante que esse parâmetro não esteja presente antes de fazer o redirecionamento.No entanto, anexar um parâmetro de URL provavelmente não é desejável.
Como isso é apenas para uso do cliente em um SPA, você deve usar a API de histórico de JavaScript e
replaceState()
(ou possivelmentepushState()
) o(s) método(s) para anexar o#bar
identificador de fragmento à URL e acionar uma resposta do lado do cliente. Nenhum redirecionamento do lado do servidor é necessário.