2009-06-02 10 views

Respuesta

180

El problema principal es que el navegador ni siquiera enviará una solicitud con una parte del fragmento. La parte del fragmento se resuelve allí mismo en el navegador. Por lo tanto, es alcanzable a través de JavaScript.

De todos modos, podría analizar una URL en bits, incluida la parte del fragmento, utilizando parse_url(), pero obviamente no es su caso.

4

Creo que el valor de hash solo se utiliza en el lado del cliente, por lo que no se puede obtener con php.

puede redireccionarlo con javascript a php.

48

Es recuperable desde Javascript - como window.location.hash. Desde allí, puede enviarlo al servidor con Ajax, por ejemplo, o codificarlo y ponerlo en URL que luego se pueden pasar al servidor.

+0

Gracias! Para que quede claro, en lugar de esto: 'www.example.com/? Val = 1 # part2' Tendría que redirigir a él en el servidor, así: ' www.example.com/? redirectUrl =% 2F% 3Fval% 3D1% 23part2' y, por supuesto, debe agregar soporte para redireccionar a esa otra url en la otra página. No es increíble, y no funciona para todos los casos de uso, por supuesto, pero funciona para marcadores. Tenga en cuenta que si hace esto, no debe permitir redireccionamientos a direcciones URL absolutas, solo direcciones URL relativas, para asegurarse de no abrirse a [redireccionamientos no seguros] (https://www.owasp.org/index.php/Unvalidated_Redirects_and_Forwards_Cheat_Sheet) –

94

Prueba simple, acceder http://localhost:8000/hello?foo=bar#this-is-not-sent-to-server

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 - 

El servidor recibe la solicitud sin el #appendage - nada después de la etiqueta de hash es simplemente una búsqueda de anclaje en el cliente.

Puede encontrar el nombre de anclaje utilizado dentro de la URL a través de JavaScript usando, como un ejemplo:

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

La función parse_url() en PHP puede funcionar si ya tiene la cadena URL necesario, incluyendo el fragmento (http://codepad.org/BDqjtXix):

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

Output: fizzbuzz 

Pero no creo que PHP recibe la información de fragmentos porque es de sólo cliente.

7

La respuesta es no.

El propósito principal del hash es desplazarse a una determinada parte de la página donde ha definido un marcador. p.ej. Desplácese a esta Parte cuando se carga la página.

La exploración se desplazará de modo que esta línea sea el primer contenido visible de la página, según la cantidad de contenido que aparece debajo de la línea.

Sí JavaScript puede acces, y luego una simple llamada Ajax hacer la magia

8

Sí, es verdad, el servidor no recibe la pieza de anclaje. Sin embargo, hay una solución alternativa que utiliza cookies.Lo puedes encontrar aquí: http://www.stoimen.com/blog/2009/04/15/read-the-anchor-part-of-the-url-with-php/

+2

Esta "solución alternativa" no tiene ningún valor. Hay una docena de mejores técnicas si está bien con 2 solicitudes por vista de página. – umassthrower

+10

¿Cómo es inútil? Esto definitivamente no tiene valor. Pero quizás haya mejores técnicas. Está bien. – Kishor

+1

Maldición a hacky. Estoy de acuerdo con @umassthrower. –

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

Esto se debe trabajar

+0

SI tienes el url como cadena es fácil, incluso si lo analizas con reg exp. El problema es que no puede acceder a # photo45 desde el servidor (use phpinfo() y no verá # photo45 en ningún lado –

1

parte Th de un URI después de la # se llama "fragmento" y es, por definición, sólo está disponible/procesado en el lado del cliente (ver https://en.wikipedia.org/wiki/Fragment_identifier) .

En el lado del cliente, se puede acceder usando javaScript con window.location.hash.

1

Sí se puede:

Utilice este método para evitar errores:

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

Y, por supuesto, en PHP, explotar ese cachorro y obtener uno de los valores

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

Otra solución es agregar un campo de entrada oculto a la página php:

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

uso de JavaScript/jQuery se puede establecer el valor de este campo en la carga de la página o responder a un evento:

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

En php en el lado del servidor se puede leer este valor utilizando la colección $ _POST:

$server_location_hash = $_POST['myHiddenLocationHash']; 
Cuestiones relacionadas