Autor Zpráva
blahapet
Profil
Ahoj všem, omlouvám se, jestli tento příspěvek sem nepatří, ale řeším dost prapodivnou věc. Na hostingu One Bit vytvářím stránky restaurace, kde v PHP kódu na noha místech používám fci Header() pro přesměrování. K tomu ale mně z neznámých důvodů nedojde. Řeším to i s tamější podporou, která tvrdí, že jsem již hlavičku vygeneroval před použitím fce feader(). Nemyslím si, že to je tak. Vytvořil jsem v rootu soubor redirect.php s jediným řádkem PHP kódu:

<?php

header('Location: http://www.restaurace-pirat.cz/kontakt/');

?>

Soubor je zde: www.restaurace-pirat.cz/redirect.php

Ať ho nahraji na jakoukoli doménu třeba na Český Hosting, např. zde: www.svetlokamenu.cz/redirect.php, k přesměrování normálně dojde.

Napadá někoho zkušenějšího, čím by to mohlo být? jestli já dělám chybu a nebo je chyba někde v nastavení PHP či čehokoliv jiného u nich?

Díky moc.
Kajman
Profil
Máte editor, který zobrazí případný BOM na začátku toho php souboru?
blahapet
Profil
Netuším jaký. Poradíte?
Kajman
Profil
Pro ověření stačí třeba
hexed.it
blahapet
Profil
Používám PSPad... Jestli myslíte BOM jako tady, tak jsem zkoušel kódování UTF-8 BOM i no BOM, ale bez úspěchu.
Kajman
Profil
Tak ještě zkuste na server nahrát ten soubor s unixovými konci řádků.
blahapet
Profil
Děkuji moc za nasměrování. V podstatě se jedná o to, jak píšou výše na JeČas. Stačí tedy o řádek výše připsat header("Content-type: text/html; charset=utf-8");, resp.

<?php
header("Content-type: text/html; charset=utf-8");
header('Location: http://www.restaurace-pirat.cz/kontakt/');
?>

Zkuste teď kliknout na odkaz výše... Jenže další problém mi nastal, když jsem to chctěl na One Bitu udělat v praxi a v index.php, kde do něho inkluduji soubor config.php, tak v něm přidám nahoru řádek header() s kódováním a ono nic... Jenže pak se mi to povedlo, protože ten řádek musí být úplně nahoře, tzn.

ne tak:

<?php


header("Content-type: text/html; charset=utf-8");

ale takto:

<?php header("Content-type: text/html; charset=utf-8");

případně i takto:

<?php
header("Content-type: text/html; charset=utf-8");

Dost zajímavá zkušenost. Jen mi nejde do hlavy, proč někde to šlapalo a jinde ne. Díky


Se z toho picnu... tak ne :-( , jak jsem psal teď výše, tak to nefunguje... Ten redirect.php šlape, ale pokud to dám úplně nahoru do configu, tak zase nic... Se z toho už po*eru...
anonym_
Profil *
blahapet:
Ne, prázdné řádky v PHP tomu nevadí. Funkci header (a případně dalším, které musí být před jakýmkoliv výstupem) vadí případný volný řádek/BOM/cokoliv před samotným <?php. Odentrování v rámci PHP pak už ničemu nevadí a je jedno, jestli použiješ mezeru (to je ten jednořádkový zápis), jeden enter (poslední zápis) nebo 3 entery.
blahapet
Profil
Tak už se to dořešilo s podporou One Bitu, přeposílám naši konverzaci, kdyby někdo měl podobné problémy:

_______________________________________________________________________________________________

Dobrý den,

teď uplně nerozumím - co přesně není ideální? Vše se podle mě chová přesně tak, jak má.

Z redirect.php jsem na chvíli odebral header("Content-type: text/html; charset=utf-8"); a i nadále redirect.php funguje správně, přesměruje se, není nutné. Nemohl jste mít třeba nějakou starou variantu v cache browseru?

Ze souboru sms-send.php odstraňte vše před <?php a přesměrování bude fungovat, viz popis předchozím emailu.

Pokud to nechcete řešit, vytvořte v adresáři soubor .user.ini s řádkem
output_buffering=On

----------------------------------------------------------------------------------------------------------------------------------

Dobrý den,

upravil jsem redirect.php, aby na začátku chybně obsahoval výstup, a přesměrovává se - output_buffering tedy funguje.
Nastavení .user.ini si PHP čte při spawnování threadu a pokud jste byl dost rychlý, mohl jste těsně po úpravě ini trefit ještě thread, který si konfiguraci ještě nenačetl. Pro jistotu jsem všechny běžící ukončil, aby žádný s původní konfiguraci neběžel. Mělo by být teď 100% funkční.
________________________________________________________________________________________________________________________


anonym:
Ne, prázdné řádky v PHP tomu nevadí. Funkci header (a případně dalším, které musí být před jakýmkoliv výstupem) vadí případný volný řádek/BOM/cokoliv před samotným <?php. Odentrování v rámci PHP pak už ničemu nevadí a je jedno, jestli použiješ mezeru (to je ten jednořádkový zápis), jeden enter (poslední zápis) nebo 3 entery.


OK, díky moc za vysvětlení,
anonym_
Profil *
blahapet:
Ze souboru sms-send.php odstraňte vše před <?php a přesměrování bude fungovat, viz popis předchozím emailu.
Rada odstranit výstup před header byla správná, což ti bylo řečeno i zde.

Ostatně se to píše i v PHP manuálu:
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

A ještě z téže stránky jeden příklad, že header nemusí být úplně nahoře, ale klidně v kódu níže, není-li před ní žádný výstup: www.php.net/manual/en/function.header.php#61903. Před fcí header je definice nějakých proměnných, atd., které jsou v pořádku, není tam výstup (ani před započetím PHP, ani v rámci něj před zavoláme header).
blahapet
Profil
Jj, už to chápu, před <?php nesmí být nic nahoře. Proč to tedy někde jde a jinde nikoliv...?
anonym_
Profil *
blahapet:
IMHO to nefungovalo nikde, nebo nebyly ty soubory identické (např. jeden s BOM, druhý bez). Každopádně, jak to má být správně, víš, pracuj s tím.
blahapet
Profil
Diky moc. Takže to chápu dobře, že je lepší BOM nepoužívat.
Kajman
Profil
Ne, tohle nebyla chyba BOM. Měl jste tam prázdný řádek a <?php bylo až na druhém řádku, ale nám se zobrazil kód, kde bylo <?php hned na začátku prvního řádku. Kdyby tam byl vidět prázdný řádek, bylo by to hned jasné.
blahapet
Profil
Aha... Ale je stejně zajímavý, že jeden hosting no netoleruje a druhý ano. Že by rozdílné verze PHP či jiné nastavení?
Kajman
Profil
Ano, jiné nastavení. Někde asi mají nastavené bufferování výstupu (oddělený obsah od http hlaviček). Http hlavičky totiž nelze poslat po nějakém obsahu, proto při vypnutém bufferování se další pokusy nastavit hlavičky ignorují a měl byste to vidět, pokud si logujete chyby a varování v php.
blahapet
Profil
Díky moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0