Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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
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...)
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:
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/
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"?
É 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í.
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>";
}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:
experimenta a funcao header_list e nos poste aki o q ela retornou...
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.
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);
}Na verdade, não é muito recomendado usar buffer :thumbsup:
>
Na verdade, não é muito recomendado usar buffer :thumbsup:
Opa, opa, esse comentário me interessa... Por quê?
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...
ob_start();
[...]
você ja enviou uma saida para o navegador por isso o header nao funciona, da erro...