Posso ler a parte de hash da URL no meu aplicativo do lado do servidor (PHP, Ruby, Python, etc.)?


217

Assumindo um URL de:

www.example.com/?val=1#part2

O PHP pode ler as variáveis ​​de solicitação val1usando a matriz GET.

O valor do hash part2também é legível? Ou isso é apenas com o navegador e JavaScript?

Respostas:


203

O principal problema é que o navegador nem envia uma solicitação com uma parte do fragmento. A parte do fragmento é resolvida ali no navegador. Portanto, é acessível através do JavaScript.

De qualquer forma, você pode analisar uma URL em bits, incluindo a parte do fragmento, usando parse_url () , mas obviamente não é o seu caso.


98

Teste simples, acessando http: // localhost: 8000 / hello? Foo = bar # isto não é enviado ao servidor

python -c "import SimpleHTTPServer;SimpleHTTPServer.test()"
Serving HTTP on 0.0.0.0 port 8000 ...
localhost - - [02/Jun/2009 12:48:47] code 404, message File not found
localhost - - [02/Jun/2009 12:48:47] "GET /hello?foo=bar HTTP/1.1" 404 -

O servidor recebe a solicitação sem o #appendage - qualquer coisa após a tag hash é simplesmente uma pesquisa de âncora no cliente.

Você pode encontrar o nome da âncora usado no URL via javascript usando, como exemplo:

<script>alert(window.location.hash);</script>

A função parse_url () no PHP pode funcionar se você já tiver a string de URL necessária, incluindo o fragmento ( http://codepad.org/BDqjtXix ):

<?
echo parse_url("http://foo?bar#fizzbuzz",PHP_URL_FRAGMENT);
?>

Output: fizzbuzz

Mas não acho que o PHP receba as informações do fragmento porque são apenas para clientes.


48

É recuperável a partir de Javascript - as window.location.hash. A partir daí, você pode enviá-lo ao servidor com o Ajax, por exemplo, ou codificá-lo e colocá-lo em URLs que podem ser passadas para o lado do servidor.


1
Obrigado! Então, para ficar claro, em vez disso: www.example.com/?val=1#part2 você teria que redirecionar para ele no servidor, assim: www.example.com/?redirectUrl=%2F%3Fval%3D1%23part2 e, claro, você teria que adicionar suporte para redirecionar para o outro URL em sua outra página. Não é impressionante, e não funciona para todos os casos de uso, é claro, mas funciona para indicadores. Note que se você fizer isso, você não deve permitir que os redirecionamentos URLs absolutos, apenas URLs relativos, para garantir que você não se abrir para redirecionamentos inseguras
Brad Parks


8

Sim, é verdade, o servidor não recebe a parte âncora. No entanto, há uma solução alternativa usando cookies. Você pode encontrá-lo aqui: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/


2
Essa "solução alternativa" é inútil. Há uma dúzia de técnicas melhores, se você estiver de acordo com 2 solicitações por visualização de página.
Umassthrower

11
Como é inútil? Definitivamente, isso não vale nada. Mas talvez haja técnicas melhores.
Kishor

Quais são as melhores técnicas? Para o meu google oauth, ele está me redirecionando para a minha página da API com o hash do token de acesso e, em seguida, faço um "início de ajax" onde processo um script ajax rápido que ajax a mesma página, mas com o valor de hash dessa vez como parâmetro de solicitação . É estranho .. há provavelmente melhor maneiras, mas todas as maneiras que eu vi parece hacky
Gisheri

7

A resposta é não.

O principal objetivo do hash é rolar para uma determinada parte da página em que você definiu um marcador. Por exemplo, role para esta parte quando a página for carregada.

A navegação será rolada de modo que esta linha seja o primeiro conteúdo visível na página, dependendo da quantidade de conteúdo que se segue abaixo da linha.

Sim, o javascript pode acessá-lo e, em seguida, uma simples chamada ajax fará a mágica


4

A respeito:

Agarre dinamicamente o #hash

<script>
var urlhash = window.location.hash, //get the hash from url
    txthash = urlhash.replace("#", ""); //remove the #
    //alert(txthash);
</script>

<?php
$hash = "<script>document.writeln(txthash);</script>";
echo $hash;
?>

Para torná-lo mais fluente:

Exemplo completo usando apenas Javascript e PHP

<script>
var urlhash = window.location.hash,  //get the hash from url
txthash = urlhash.replace("#", "");  //remove the #

function changehash(a,b){
   window.location.hash = b; //add hash to url
   //alert(b); //alert to test
   location.reload(); //reload page to show the current hash
}
</script>

<?php $hash = "<script>document.writeln(txthash);</script>";?>

<a onclick="changehash(this,'#hash1')" style="text-decoration: underline;cursor: pointer;" >Change to #hash1</a><br/>
<a onclick="changehash(this,'#hash2')" style="text-decoration: underline;cursor: pointer;">Change to #hash2</a><br/> 

<?php echo "This is the current hash: " . $hash; ?> 

O PHP ainda não obtém o valor do hash.
cornernote

solução doce e curta.
Waruna Manjula

3

Eu acho que o valor de hash é usado apenas no lado do cliente, então você não pode obtê-lo com php.

você pode redirecioná-lo com javascript para php.


1
<?php
$url=parse_url("http://domain.com/site/gallery/1?user=12#photo45 ");
echo $url["fragment"]; //This variable contains the fragment
?>

Isso deve funcionar


Se você tiver o URL como string, é fácil, mesmo se você o analisar com reg exp. O problema é que você não pode acessar a # photo45 a partir do servidor (use phpinfo () e você não verá a # photo45 em lugar algum #
Nik Chankov #


1

Sim você pode:

Use este método para evitar erros:

<script> 
query=location.hash;
document.cookie= 'anchor'+query;
</script>

E, claro, em PHP, exploda esse filhote e obtenha um dos valores

$split = explode('/', $_COOKIE['anchor']);
print_r($split[1]); //to test it, use print_r. this line will print the value after the anchortag

0

Outra solução é adicionar um campo de entrada oculto à página php:

<input type="hidden" id="myHiddenLocationHash" name="myHiddenLocationHash" value="">

Usando javascript / jQuery, você pode definir o valor desse campo no carregamento da página ou responder a um evento:

$('#myHiddenLocationHash').val(document.location.hash.replace('#',''));

No php do lado do servidor, você pode ler esse valor usando a coleção $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash'];

0

Também podemos fazer isso com outra abordagem. Como, em primeiro lugar, obtenha o valor de hash de js e chame o ajax usando esse parâmetro e faça o que quisermos

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.