Muy sencillo: el procedimiento de
login lo que tiene que hacer es devolver una redirección (Location:) a la URL indicada en la variable HTTP_REFERER que recibe de la página que provocó el fallo de autenticación.
Es decir: la página de
login que aparece ante el usuario puede ser creada mediante un cgi, que recibe en el HTTP_REFERER la dirección que ha usado el usuario para entrar cuando no estaba autenticado. Ese valor lo puedes esconder en uno de los campos ocultos del formulario de
login o en las variables de estado en el lado del servidor si usas el método de sesiones.
Cuando el usuario responde al formulario de
login, éste comprueba quién es y si le permite paso, hace un
Location: hacia el valor que indique el campo oculto.
Esto es incluso compatible con el caso de que el usuario entre en la primera página del sistema.
Seguro que hay otras formas. Por ejemplo, pasar la información del HTTP_REFERER en el propio URL, como si fuera una petición GET.
Esto se puede ver en las páginas de Wikipedia. Si entras en una página especial, te redirige a la página de 'identificarse', con una dirección como esta:
http://es.wikipedia.org/w/index.php?tit ... eguimientoIntenté entrar en la página "Especial:Seguimiento" pero no me dejó. Allí aparece un enlace a la página a la página "Especial:Entrar" para hacer el
login y, además, en el mismo URL, queda registrado el dónde tiene que volver cuando me autentique (el valor del parámetro
returnto).