2010-09-08 9 views

Respuesta

31

No, está disponible para el navegador sólo, por lo que tiene que lidiar con Javascript. El servidor no puede leerlo.

Explicación:
Básicamente el componente de hash de la URL de la página (la parte que sigue la muestra #) es procesada por sólo el navegador - el navegador nunca se lo pasa al servidor. Esto, lamentablemente, es parte del estándar HTML y es lo mismo ya sea que esté utilizando IE o cualquier otro navegador (y para el caso, PHP o cualquier otra tecnología del lado del servidor).

Esto es lo Wikipedia dice al respecto:

El fragmento funciones de identificador diferente que el resto de la URI: a saber, su tratamiento es exclusivamente del lado del cliente sin la participación del servidor. Cuando un agente (como un navegador web) solicita un recurso de un servidor web, el agente envía el URI al servidor, pero no envía el fragmento. En cambio, el agente espera que el servidor envíe el recurso, y luego el agente procesa el recurso de acuerdo con el valor del fragmento. En el caso más común, el agente desplaza una página web hacia abajo al elemento de anclaje que tiene una cadena de atributo igual al valor del fragmento. Otros comportamientos del cliente son posibles

+0

Bueno, en realidad podría 'urlencode ('#')' el hash a "% 23" y luego 'urldecode ('% 23')' a "#" nuevamente en el servidor, por lo que * se * transfiere al servidor. Esto no usa JavaScript, como requiere OP, sino PHP. Si tampoco quieres usar PHP, puedes escribir "% 23" en tu código HTML a mano ;-) –

+1

No @what, eso no es confiable. Si el hash fuera una cadena de consulta, el '% 23' simplemente se trataría como parte del valor, es decir'? Foo = bar% 23what', haría que el servidor literalmente interpretara como $ foo = 'bar # what'. –

+0

@OliverWilliams un mejor enfoque es usar parámetros de consulta –

7

http://tools.ietf.org/html/rfc2396#section-4

Cuando se utiliza una referencia URI a realizar una acción de recuperación en el recurso identificado, el identificador fragmento opcional, separado de el URI por una marca de rayitas cruzadas (" # ") carácter, consiste en información de referencia adicional para ser interpretada por el agente de usuario después de la acción de recuperación ha s sido completado con éxito. Como tal, es que no forma parte de un URI, pero a menudo se usa junto con un URI.

+0

En conclusión, #MOREURL no se envía al servidor? Solo usando métodos jQuery/AJAX/Javascript. –

+0

jQuery y AJAX no tienen nada que ver con esto. Solo se puede acceder a través de Javascript o posiblemente otro lenguaje de scripting del lado del cliente. No del lado del servidor. –

+0

OK No servidor SIDE !, ¡GRACIAS! –

3

A medida que el explorador no envía el hash al servidor por defecto, la única manera de hacerlo es utilizar algo de JavaScript:

  1. Cuando el formulario envía, agarrar el hash (window.location.hash) y almacenarlo en un campo de entrada oculto del lado del servidor Pon esto en un DIV con un id de "urlhash" para que podamos encontrarlo fácilmente más tarde.

  2. En el servidor puede usar este valor si necesita hacer algo con él. Incluso puede cambiarlo si lo necesita.

  3. En la página cargar en el cliente, compruebe el valor de este este campo oculto. Deseará encontrarlo en el DIV que contiene, ya que no se conocerá el ID generado automáticamente. Sí, podría hacer algún truco aquí con .ClientID pero nos pareció más sencillo usar el envoltorio DIV, ya que permite que todo este Javascript viva en un archivo externo y se use de forma genérica.

  4. Si el campo de entrada oculto tiene un valor válido, configúrelo como la URL hash (window.locaion.hash nuevamente) y/o realice otras acciones.

Utilizamos jQuery para simplificar la selección del campo, etc ... en definitiva termina siendo algunos jQuery llama, uno para guardar el valor, y otro para restaurarlo.

Antes de presentar:

$("form").submit(function() { 
    $("input", "#urlhash").val(window.location.hash); 
}); 

al cargar la página:

var hashVal = $("input", "#urlhash").val(); 
if (IsHashValid(hashVal)) { 
    window.location.hash = hashVal; 
} 

IsHashValid() puede comprobar si hay "indefinido" u otras cosas que no desea manejar.

Además, asegúrese de utilizar $ (document) .ready() adecuadamente, por supuesto.

2

Me gustaría extender la respuesta sobre el motivo POR QUE el fragmento no se envía al servidor. Porque es un comportamiento intencional y deseado. Veamos cadena de URL en total.

/path/to/element?query=string&for=server#?optional=fragment&for=browser <----- URI ----> <---- QUERY STRING ---> <----- FRAGMENT STRING ------>

URI especifica de forma única de recursos obtienen de un servidor

CONSULTA define las operaciones a realizar por el servidor en el

FRAGMENTO controles navegador (aplicación) Comportamiento de los recursos . El fragmento debe usarse para estado de aplicación de tienda que debe ser visible para el usuario para que el usuario pueda enviar el enlace a otro usuario para obtener el mismo estado de aplicación.

Fragment es la única parte de URL gratuita para que implemente de forma transparente aplicaciones web de una sola página (que pueden ejecutarse sin conexión en su teléfono móvil, por ejemplo). Por lo tanto, no se debe enviar al servidor.

Cuestiones relacionadas