Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ademirs

MVC Redirecionamentos Falhando

Recommended Posts

Boa tarde amigos:

 

Algo está me deixando com dor de cabeça (Como se eu fosse o único...rsrs).

 

Seguinte:

Imaginem uma aplicação MVC rodando em dois servidores, A e B.

 

No servidor "A" (PHP Version 5.2.17) a aplicação funciona muito bem, sem erros, sem problemas.

No servidor "B" (PHP Version 5.2.17) é uma tragédia, simplesmente não funciona, dá erro.

 

Warning: Cannot modify header information - headers already sent by (output started at /home/[...]/index.php:0)
in /home/[...]/helpers/RedirHelper.php on line 27 

 

Este é o código que apresenta o erro:

 

<?php

ob_start();

[...]

       protected function goTo( $dados){

/*linha27*/ header("Location: /" . CAMINHO_ADM . $dados);

               //Usei esta P.O.G. abaixo, até funciona no Firefox e Chrome mas no IE8 e Safari não consigo fazer login
	//echo "<meta HTTP-EQUIV='Refresh' CONTENT='0; URL=http://www.meuprojeto.com.br".CAMINHO_ADM.$dados."'>";

    }

       public function goToUrl( $url ){

           header("Location: " . $url);

               //Usei esta P.O.G. abaixo, até funciona no Firefox e Chrome mas no IE8 e Safari não consigo fazer login
	//echo "<meta HTTP-EQUIV='Refresh' CONTENT='0; URL=".$url."'>";
           }

[...]
?>

 

Alguém teria alguma idéia do que estou fazendo de errado ou onde pode estar a solução?

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique essa 'linha 0' aí, pra ver se não há caracteres invisíveis. No seu editor, marque para ver todos os caracteres (parágrafos, tabulações, etc...)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Henrique, Olá Igor, olá amigos da comunidade.

Primeiramente obrigado pelas respostas.

 

Verifiquei a linha 0, e está limpa.

Tirei o ob_start(); e dai não funciona nem no servidor "A" que é Linux Centos - PHP 5.2.17, o "B" é Linux Debian - PHP 5.2.17.

 

Sei lá meus amigos, eu devo estar "errando feio" em algo muito simples, mas tá difícil eu saber onde.

 

:ermm:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Configure o log de erros do PHP e veja se há alguma mensagem

 

Configuração de log e eventos de erros do PHP

http://forum.imasters.com.br/topic/447379-configuracao-de-log-e-eventos-de-erros-do-php/

 

 

 

 

veja também

 

Dicas para uso de variáveis de sessão

http://forum.imasters.com.br/topic/342563-dicas-para-uso-de-variaveis-de-sessao/

Compartilhar este post


Link para o post
Compartilhar em outros sites

No servidor "A" a diretiva output_buffering está em >> 4096 e 4096

No servidor "B" a diretiva output_buffering está em >> no value e no value

 

Será que isso está afetando meu script no servidor "B"?

Compartilhar este post


Link para o post
Compartilhar em outros sites

É difícil dizer. A linha zero que você checou foi no index.php né? Só confirmando...

 

Posta seu index.php e os arquivos subsequentes até àquele que, de fato, usa esse "helper" aí.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

Sim Bruno, é a linha 0 do index do MVC.

Está assim:

<?php
ob_start();
session_start();

também tentei destas formas já:

<?php
ob_start();
if (!isset($_SESSION))
{
session_start();
}

 

<?php
session_start();
ob_start();

 

Assim não dá erro mas não efetiva o login

 

<?php
// Assim não dá erro mas não efetiva o login

protected function goTo( $dados ){
$path=$_SERVER['SERVER'];
echo "<script>location.href = '".$path.CAMINHO_ADM.$dados ."';</script>";
}
public function goToUrl( $url ){
echo "<script>location.href = '".$url."';</script>";
}

Compartilhar este post


Link para o post
Compartilhar em outros sites
No servidor "B" a diretiva output_buffering está em >> no value e no value

 

Sim, na verdade seu código está 'errado', vamos dizer assim, por isso no servidor B não funcional nem a 'pal'. Como no servidor A o output já está setado para 4096, independentemente de como está a saída de seus cabeçalhos ele sempre vai funcionar.

 

Agora o ideal, seria fazer o que o Bruno disse, poste a sequencia dos scripts até cair nesses helper's, para ver se não tem nenhuma saída e corrigir isso.

 

Abraços :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim, você precisa mesmo manipular o buffer de saída (output buffer)?

 

Estou mexendo com algo relativo ao buffer de saída atualmente e realmente é complicado.

 

Mantenha tudo de forma simples, removendo todas os usos de ob_* e trabalhando com as sessões da forma mais bpasica possível, algo como:

 

if( ! isset( $_SESSION ) ) {

   session_start();
}

$_SESSION['foo'] = 'bar';

Os redirecionamentos, esqueça-os por JavaScript. Faça com o Location. :thumbsup:

 

E então, onde a checagem se fizer necessária:

 

if( ! isset( $_SESSION ) ) {

   session_start();
}

if( ! isset( $_SESSION['foo'] ) ) {

   $obj -> goToUrl( 'http;//' );
}

// Usa $_SESSION['foo']

E o método redirecionador alterado...?

 

public function goToUrl( $url ){

   header( sprintf( 'Location: %s', $url ) );
}

Veja se resolve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá amigos, boa tarde.

 

Concordo André, realmente é algo que precisa ser visto e corrigido, farei isto.

Temporariamente, ajustei a diretiva output_buffering para 4096 e resolveu o problema, mas vou melhorar esse fonte sim.

 

Igor, segue abaixo o retorno do header_list:

 

array(3) {
  [0]=> string(38) "Expires: Thu, 19 Nov 1981 08:52:00 GMT"
  [1]=> string(77) "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0"
  [2]=> string(16) "Pragma: no-cache"
}

 

Bruno, ajustei da seguinte forma os redirecionamentos (Temporariamente com output_buffering = 4096 e ob_start();):

Vou estudar tuas dicas acima e depois posto aqui o que consegui...

 


protected function go( $dados ){
$path=$_SERVER['SERVER'];
header('Location: '.$path.CAMINHO_ADM.$dados);
}
public function goToUrl( $url ){
header('Location: '.$url);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade, não é muito recomendado usar buffer :thumbsup:

Opa, opa, esse comentário me interessa... Por quê?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiquei pensando sabe, se eu manter o output_buffering como "no value", será que isso não pode prejudicar de alguma maneira o desempenho dos Frameworks de segurança? Apenas uma reflexão, pode ser que falei bobagem...

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.