Voltar à página anterior com cabeçalho (“Localização:”); em PHP

124

O título dessa pergunta meio que explica minha pergunta. Como redireciono o visitante da página PHP de volta à sua página anterior com oheader( "Location: URL of previous page" );

Web designer
fonte
cabeçalho ('Localização:'. $ _SERVER ['HTTP_REFERER']);
raskul 5/04
De acordo com esta fonte w3schools.com/php/php_superglobals_server.asp , não é confiável porque nem todos os fornecedores o suportam
mohadennis

Respostas:

246

experimentar:

header('Location: ' . $_SERVER['HTTP_REFERER']);

Observe que isso pode não funcionar com páginas seguras (HTTPS) e é uma péssima ideia geral, pois o cabeçalho pode ser invadido, enviando o usuário para outro destino. O cabeçalho pode nem ser enviado pelo navegador.

Idealmente, você desejará:

  • Anexe o endereço de retorno à solicitação como uma variável de consulta (por exemplo,? Back = / list)
  • Defina uma página de retorno no seu código (por exemplo, todos os envios de formulário bem-sucedidos são redirecionados para a página de listagem)
  • Forneça ao usuário a opção de onde ele deseja ir (por exemplo, salve e continue editando ou apenas Salvar)
Dimitry
fonte
19
Coisas mais estranhas aconteceram :)
Dimitry 31 /
3
@ Col para que você possa provar um problema prático com isso?
Pekka
1
Usar o referenciador, após testar previamente se ele está definido e válido, em um contexto definido de página a página pode ser uma prática perfeitamente aceitável - a grande maioria dos navegadores envia um HTTP_REFERER adequado.
Pekka
1
@ Col Eu usei isso na produção quando tive que fazer algo para uma demonstração. Como você pode ver na minha resposta, forneço três outras soluções para as quais eu me voltaria, em vez do redirecionamento baseado em HTTP_REFERER.
Dimitry
2
@ Madmartigan que parece um comportamento realmente estranho, a única dica que posso ver na net causando alguns problemas de redirecionamento. De qualquer forma, eu concordo que usando o referer não é o caminho, se você precisa de 100% de segurança
Pekka
22

É tão simples, basta usar isso

header("location:javascript://history.go(-1)");

Está funcionando bem para mim

Hammad
fonte
2
Isso soou muito inteligente, mas no FF10 eu entendo. "Corrupted Content Error The page you are trying to view cannot be shown because an error in the data transmission was detected."Isso é basicamente inutilizável.
23412 Wesley Murch
Wesley Murch, Está funcionando bem para mim em quase todos os principais navegadores, incluindo o que você mencionou. Só funciona para você, caso você tenha chegado à página com algo na história.
Hammad
5
Isso pode fazer com que a página anterior seja veiculada no cache do navegador.
aksu
14

Você precisa salvar esse local de alguma forma.

Digamos que seja um formulário POST, basta colocar o local atual em um campo oculto e usá-lo no header()Local.

Seu senso comum
fonte
14

Apenas uma pequena adição: acredito que é uma coisa comum e conhecida adicionar exit;após a função de cabeçalho, caso não desejemos que o restante do código seja carregado ou executado ...

header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
6opko
fonte
É apenas "" para mim.
Alexander Guo
2

Apenas tente isso em Javascript:

 $previous = "javascript:history.go(-1)";

Ou você pode experimentá-lo em PHP:

if(isset($_SERVER['HTTP_REFERER'])) {
    $previous = $_SERVER['HTTP_REFERER'];
}
Minu Alex
fonte
1

Armazenar o URL anterior em uma variável de sessão é ruim, porque o usuário pode clicar com o botão direito do mouse em várias páginas e depois voltar e salvar.

a menos que você salve o URL anterior na variável da sessão em um campo oculto no formulário e após salvar o cabeçalho ("Localização: salvar URL da página de chamada");

rudy
fonte
por que não podemos simplesmente usar o $ _SERVER ['http_referrer']?
Vignesh