2008-11-25 21 views
120

Sé por el lado del cliente (javascript) que puede usar windows.location.hash pero no pudo encontrar de todos modos para acceder desde el lado del servidor.Cómo obtener Url Hash (#) desde el lado del servidor

+0

sacaste una manera aruond este problema, no tengo los marcadores tienen en la url y quieren acceder al texto después del hash en el lado del servidor? – dotnetcoder

+0

Las respuestas explican que esto no está disponible en el servidor, ya que solo se interpreta por agente de usuario. Intentaba cambiar la pestaña activa, que intentaba hacer en el servidor. Terminé haciéndolo en el lado del cliente. –

+0

Posible duplicado de [¿Puedo leer la parte hash de la URL en mi aplicación del lado del servidor (PHP, Ruby, Python, etc.)?] (Http://stackoverflow.com/questions/940905/can-i-read -the-hash-portion-of-the-url-on-my-server-side-application-php-ruby) –

Respuesta

124

Tuvimos una situación en la que necesitábamos mantener el hash de URL en las publicaciones de ASP.Net. 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, agarra el hash (window.location.hash) y almacenarlo en un servidor campo de entrada oculta oculto Pon esto en un DIV con una identificación 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, establecer que a medida que el hash URL (window.location.hash again) y/o llevar a cabo 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 "undefined" u otras cosas que no desea manejar.

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

+4

Gran solución, pero ¿qué pasa con la solicitud GET? – Warlock

+2

Sin obtener solicitudes, esta solución no es nada. –

+2

@Chris - ¿Pero cómo se llama al evento form-submit cuando simplemente se pega la URL en un navegador diferente (porque es solo una solicitud GET)? – KrishPrabakar

36

Eso es porque el navegador no transmite esa parte al servidor, lo siento.

75

RFC 2396 sección 4.1:

Cuando se utiliza una referencia URI para realizar una acción de recuperación en el recurso identificado, el identificador de 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 que la acción de recuperación se haya completado con éxito. Como tal, no es parte de un URI, pero a menudo se usa junto con un URI.

(énfasis añadido)

+2

Estoy sorprendido. He leído mucho sobre SPA y no sabía eso. ¿Entonces el navegador envía tanta información sensible pero no el hash? Creo que debería ser en el futuro ... al menos como un encabezado HTTP separado. Esto está relacionado con: http://www.onebigfluke.com/2015/01/experimentally-verified-why-client-side.html?m=1 – bodrin

7

Probablemente, la única opción es para leerlo en el lado del cliente y transferir manualmente al servidor (GET/Post/Ajax). Saludos Artur

Usted puede ver también cómo jugar con botón de retroceso y el historial del navegador at Malcan

3

Sólo para descartar la posibilidad de que no está intentando realmente ver el fragmento de un GET/POST, y de hecho desea saber cómo acceder a esa parte de un objeto URI que tiene dentro de su código de servidor, está bajo Uri.Fragment (MSDN docs).

+7

IE8, Chrome y Firefox no enviarán el hash al servidor; por lo tanto, el Fragmento Uri siempre es una cadena vacía si examina Request.Url.Fragment en el lado del servidor (según las respuestas anteriores). – zcrar70

0

solución posible para peticiones GET:

Nueva Enlace formato: http://example.com/yourDirectory?hash=video01

llamar a esta función hacia la parte superior del controlador o http://example.com/yourDirectory/index.php:

function redirect() 
{ 
    if (!empty($_GET['hash'])) { 
     /** Sanitize & Validate $_GET['hash'] 
       If valid return string 
       If invalid: return empty or false 
     ******************************************************/ 
     $validHash = sanitizeAndValidateHashFunction($_GET['hash']); 
     if (!empty($validHash)) { 
      $url = './#' . $validHash; 
     } else { 
      $url = '/your404page.php'; 
     } 
     header("Location: $url"); 
    } 
} 
Cuestiones relacionadas