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?

O Flash
fonte

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.

Ionuț G. Stan
fonte
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.

tom
fonte
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.

Alister Bulman
fonte
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
25

O hash nunca é enviado para o servidor, então não.

PatrikAkerstrand
fonte
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/

VangelisB
fonte
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

Qiniso
fonte
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; ?> 
samjco
fonte
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.

Silfverstrom
fonte
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

Keshav Kalra
fonte
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

A parte de um URI após o #nome é "fragmento" e, por definição, só está disponível / processada no lado do cliente (consulte https://en.wikipedia.org/wiki/Fragment_identifier ).

No lado do cliente, isso pode ser acessado usando javaScript com window.location.hash.

MrTux
fonte
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
aurora
fonte
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'];
Matteo Conta
fonte
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

Keshav Kalra
fonte