Cómo obtener Url Hash (#) desde el lado del servidor


133

Sé que en el lado del cliente (javascript) puede usar windows.location.hash pero no puede encontrar de todos modos para acceder desde el lado del servidor.


¿consiguió una solución a este problema, tengo marcadores con has en la url y quiero acceder al texto después del hash en el lado del servidor?
dotnetcoder

Las respuestas explican que esto no está disponible en el servidor, porque solo es interpretado por el agente de usuario. Estaba tratando de cambiar la pestaña activa, que estaba tratando de hacer eso en el lado del servidor. Terminé haciéndolo en el lado del cliente.
Ricky Supit

Respuestas:


134

Tuvimos una situación en la que necesitábamos persistir el hash de URL en las publicaciones posteriores de ASP.Net. Como el navegador no envía el hash al servidor de forma predeterminada, la única forma de hacerlo es usar Javascript:

  1. Cuando se envíe el formulario, tome el hash ( window.location.hash) y guárdelo en un campo de entrada oculto del lado del servidor. Póngalo 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. Al cargar la página en el cliente , verifique el valor de este campo oculto. Querrá encontrarlo en el DIV en el que está contenido, ya que no se conocerá la ID generada automáticamente. Sí, podría hacer algunos trucos aquí con .ClientID, pero nos pareció más simple usar el contenedor DIV, ya que permite que todo este Javascript viva en un archivo externo y se use de manera genérica.

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

Usamos jQuery para simplificar la selección del campo, etc., en general, termina siendo unas pocas llamadas de jQuery, una para guardar el valor y otra para restaurarlo.

Antes de enviar:

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

En la carga de la página:

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

IsHashValid()puede verificar " undefined" u otras cosas que no desea manejar.

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


44
Gran solución, pero ¿qué pasa con la solicitud GET?
Brujo

2
@Chris - Pero, ¿cómo se llama al evento de envío de formulario cuando simplemente pega la URL en un navegador diferente (porque es solo una solicitud GET)?
KrishPrabakar

@Warlock, independientemente de get / post, funcionará ya que está almacenando el hash en un campo oculto.
KMX

83

RFC 2396 sección 4.1:

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

(énfasis añadido)


3
Estoy sorprendido. He leído mucho sobre SPA y no lo sabía. ¿Entonces el navegador envía tanta información confidencial pero no el hash? Creo que debería en el futuro ... al menos como un encabezado HTTP separado. Esto está relacionado: onebigfluke.com/2015/01/…
bodrin

42

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


7

Probablemente, la única opción es leerlo en el lado del cliente y transferirlo manualmente al servidor (GET / POST / AJAX). Saludos Artur

También puedes ver cómo jugar con el botón Atrás y el historial del navegador en Malcan


3

Solo para descartar la posibilidad de que en realidad no esté tratando de ver el fragmento en un GET / POST y realmente quiera saber cómo acceder a esa parte de un objeto URI que tiene dentro de su código del lado del servidor, está bajo Fragmento Uri. ( Documentos de MSDN ).


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

0

Posible solución para solicitudes GET:

Nuevo formato de enlace: http://example.com/yourDirectory?hash=video01

Llame 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");
    }
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.