Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Nie za krótkie rozważania nad funkcją header()
Forum PHP.pl > Forum > Przedszkole
MySQL
Z czasem kazdy programista dochodzi to etapu, gdzie porzuca nauke przez bezmyslne wklepytanie kodu z ksiazki czy ze strony, a zaczyna zastanawiac sie nad tym jak to wszystko sie tam dzieje.
W moim przypadku swoje rozwazania stanely nad funkcja header() o bogatych umiejetnosciach ale biednej dokumentacji (moim zdaniem).

Zaczynamy rolleyes.gif

PYTANIE 1.
Standardowa strona (X)HTML sila rzeczy nie korzysta z funkcji header bo nie moze ale za to wstawia sie rozne rzeczy w znaczniki meta np.:
  1. <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
  2. <meta http-equiv="Expires" content="Fri, 01 Jan 2010 01:00:00 GMT" />
  3. <meta http-equiv="Last-Modified" content="Tue, 12 May 2009 12:00:00 GMT" />
  4. <meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate" />
  5. <meta http-equiv="Cache-Control" content="post-check=0, pre-check=0" />
  6. <meta http-equiv="Pragma" content="no-cache" />
  7. <meta http-equiv="Reply-To" content="chor@umk.pl" />
  8. <meta http-equiv="Content-Language" content="pl" />
Celowo pokazalem tylko atrybuty http-equiv, gdzyz tylko one definiuja wartości dla nagłówka strony. W znaczniku meta moga byc jeszcze atrybuty name.
Zauwazyc mozna (po niezbyt wnikliwej analizie), ze funkcja header() wykorzystuje tylko wartosci atrybutu http-equiv i odpowiadajaca mu wartosc atrybutu content. Pierwsze pytanie jest wiec nastepujace:

PYT: Czy stosujac w skrypcie *.php funkcje header mozna juz nie pisac tych znacznikow <meta> z atrybutem http-equiv?

PYTANIE 2. (techniczne i krotkie)
Kazdy kto zetknal sie z ta funkcja przeczytal ze wysyla ona surowy naglowek HTTP
Cytat(http://php.net.pl/manual/pl/function.header.php)
header() is used to send a raw HTTP header.
Nie bede sie rozwodzic nad samym protokolem, gdyz jest on wysmienicie opisany na stronie RFC Sourcebook.

PYT: Czy funkcja header jest odpowiedzialna za przekazanie serwerowi (komputerowi na ktorym jest zainstalowany interpreter PHP) informacji jak ma uzupelnic naglowek protokolu HTTP przed wyslaniem do klienta (do przegladarki dzialajacej na komputerze klienckim)?

PYTANIE 3. (rozwiniecie mysli z pyt. 2)
Googlujac z haslem header i czytajac to co moze ona przyjac jako swoj parametr, pewnie znajdzie sie okolo 10 - 15 wartosci, np:
  1. <?php
  2. header('Content-Type: application/xhtml+xml; charset=utf-8');
  3. header('Expires: Thu, 01 Jan 2009 01:00:00 GMT');
  4. header('Last-Modified: '.($gmd = gmdate('D, d M Y H:i:s')).' GMT');
  5. header('Cache-Control: no-store, no-cache, must-revalidate');
  6. header('Cache-Control: post-check=0, pre-check=0', false);
  7. header('Pragma: no-cache');
  8. header('Reply-To: chor@umk.pl');
  9. header('Content-Language: pl');
  10. ?>
Jednakze na podanej wyzej przeze mnie stronie RFC Sourcebook widac, ze protokol HTTP ma bardzo duzo pol w naglowku.

PYT: Czy znajac dopuszczalne wartosci tych pol z naglowka tego protokolu moge z powodzeniem stosowac je do funkcji header() w skrypcie jezeli uznam to za konieczne?

PYTANIE 4. (strona kodowa)
Pisze skrypty wykorzystujac kodowanie utf-8. Jezeli zlicze miejsca, gdzie jest jakakolwiek deklaracja strony kodowej to okaze sie ze sa trzy takie miejsca:
  1. <?php
  2. ...
  3.  header('Content-Type: application/xhtml+xml; charset=utf-8');
  4.  ...
  5.  echo '<'.'?xml version="1.0" encoding="UTF-8" standalone="no" ?'.'>'."\n";
  6.  echo '<'.'?xml-stylesheet type="text/css" href="style.css" ?'.'>'."\n";
  7. ?>
  8. <!DOCTYPE html
  9.  PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  10.  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  11. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
  12. <head>
  13.  <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
  14. ...
Widzimy, ze w linii 4, 6 i 14 sa deklaracje tej strony kodowej.

PYT: Czy sa one wszystkie potrzebne? Zwlaszcza deklaracja w linii 4 i 14 (bo deklaracja w linii 6 nie jest obowiazkowa. Jak sie nie napisze to domyslne kodowanie dla XML jest wlasnie w utf-8)?

____________________________________________

Mam nadzieje ze nikogo nie zanudzilem winksmiley.jpg

PS. Za kazda rzeczowa odpowiedz przydziele plusika smile.gif Nie chodzi mi o to zeby zrobic z tego watku jakas zabawe ale naprawde zalezy mi na odpowiedzi na te pytania
Crozin
Proszę zmień swój post bo przesadziłeś z jego upiększaniem (kolory, wytłuszczanie).

Odpowiedź na większość swoich pytań możesz... samemu otrzymać.
1) Ściągamy Firefoxa.
2) Instalujemy dodatek firebug.
3) Sprawdzamy przy jego pomocy jakie nagłówki zostały wysłane w odpowiedzi na żądanie przeglądarki.
wNogachSpisz
[cytat]

Czy funkcja header jest odpowiedzialna za przekazanie serwerowi (komputerowi na ktorym jest zainstalowany interpreter PHP) informacji jak ma uzupelnic naglowek protokolu HTTP przed wyslaniem do klienta (do przegladarki dzialajacej na komputerze klienckim)?

[/cytat]

Tia. po to to jest.

Nie zaszkodzi napisać tu i tu, nie wiadomo jak wygląda implementacja programu parsujacego te informacje dane, co zrobi jesli w jedym miejscu bedzie taka a w drugim inna deklaracja.
Standardowe naglowki wysylane przez serwer w zupelnosci wystarczaja do poprawnego wyswietlenia strony www.


Nastrasz administratora swojego serwera tworzac skrypt wysylajacy naglowek o kodzie 500 smile.gif
MySQL
Crozin No dobra. Jezeli mam rozumiec, ze Twoj post jest odpowiedzia na pytanie nr 2, to zakladam, ze jest to odpowiedz twierdzaca winksmiley.jpg

PS. Ale bez urazy... Nie lubie odpowiedzi typu: Sciagnij, Zainstaluj, Zobacz. Pamietaj, ze kazdy ma swoje upodobania co do korzystania z software'u i sugerowanie komus aby sciagnal i zainstalowal jakas aplikacje zeby sprawdzic jedna rzecz i odpowiedziec na jedno krotkie pytanie ('tak', 'nie') troszke mija sie z celem. Ja jestem zwolennikiem Opery, a druga rzecz teraz pisze z komputera nieswojego (w dodatku na Linuksie), gdzie choc jest Firefox, to nie mam uprawnien do doinstalowywania czegokolwiek.
Gdybym wszystko instalowal co ludzie sugeruja to co dwa miesiace musialbym reinstalowac system od nowa bo pracowac by sie na nim nie dalo winksmiley.jpg


OK zostalo jeszcze kilka pytan winksmiley.jpg
sowiq
1. TAK. Możesz to sprawdzić np. ustawiając kodowanie tylko w jednym miejscu.
2. Nie rozumiem za bardzo o co pytasz.
3. Tak, o ile wszystkie przeglądarki (czyt.: IE też) to obsłużą. Bo chyba wszyscy wiedzą gdzie badzIEwie ma standardy...
4. Nagłówek w linii 14 nic Ci nie da. Dokument będzie wczytywany jako XHTML tylko jeśli przeglądarka dostanie nagłówek przed rozpoczęciem wczytywania treści strony. Z tego wynika, że czasami (zawsze?) nagłówki wysłane za pomocą header() są lepszym rozwiązaniem.

Jest takie małe i bardzo fajne rozszerzenie do FF jak LiveHTTPHeaders. Potestuj.
MySQL
Cytat(MySQL @ 12.05.2009, 12:17:18 ) *
PYT: Czy funkcja header jest odpowiedzialna za przekazanie serwerowi (komputerowi na ktorym jest zainstalowany interpreter PHP) informacji jak ma uzupelnic naglowek protokolu HTTP przed wyslaniem do klienta (do przegladarki dzialajacej na komputerze klienckim)?
Cytat(sowiq @ 12.05.2009, 13:30:03 ) *
2. Nie rozumiem za bardzo o co pytasz.

Mialem na mysli co to jest ten 'surowy naglowek'. Kiedys (teraz sie z tego sam smieje) myslalem, ze funkcja header() uzupelnia po prostu kod (X)HTML'a, w taki sposob, ze nie trzeba pisac odpowiednich znacznikow <meta>. Chociaz poniekad jest to prawda, poniewaz jak napisales w odpowiedzi na pierwsze pytanie mozna nie pisac wowczas tych znacznikow (ale nie jest juz prawda ze uzupelnia kod przed wyslaniem o odpowiednie znaczniki <meta>) winksmiley.jpg

Czyli wracajac do drugiego pytania. Chodzi mi o to czy dobrze mysle, ze funkcja header() "wypelnia" po prostu pola w naglowku protokolu HTML wiadomosci wysylanej do przegladarki na komputerze klienta.
sowiq
~wNogachSpisz odpowiedział Ci. Jest właśnie tak jak napisałeś.

A co do meta http-equiv - to właśnie te nagłówki powstały, żeby zastąpić header(), a nie odwrotnie winksmiley.jpg

I jeszcze jedno:
Cytat
funkcja header() "wypelnia" po prostu pola w naglowku
Ja bym tego tak nie nazwał, bo znaczyłoby to, że jeśli nie wywołasz header(), to nagłówek idzie pusty. Funkcja po prostu tworzy kolejne nagłówki.

Zainstaluj sobie rozszerzenie do FF, które podałem wcześniej i spróbuj ustawić jakiś oderwany od rzeczywistości nagłówek. Zobacz:
  1. <?php
  2. header("Test: test");
  3. ?>
Cytat
GET /test.php HTTP/1.1
[...]

HTTP/1.x 200 OK
[...]
Test: test
[...]
Content-Type: text/html
wNogachSpisz
jakie naglowki poza: content type, kodowanie i cache moga jeszcze kolidowac ze soba? tongue.gif
MySQL
Przed chwila sprawdzilem na FF jedna rzecz:
Kiedy w skrypcie *.php mialem zarowno funkcje header() jak i odpowiadajace im znaczniki meta, to kiedy wybralem "Pokaz informacje o stronie". Byly tam wyszczegolnione uzyte atrybuty ze znacznikow meta.
Kiedy usunalem naglowki, to choc kodowanie nadal bylo utf-8 (czyli faktycznie uzywajac header() mozna pominac naglowki) to jednak w "Pokaz informacje o stronie" nie bylo ich...

Przyklad: Jezeli jakis robot indeksuje strony w internecie i wejdzie na strone, ktora zabrania indeksowania to odczytuje ta wiadomosc (zabraniajaca indeksowania) z naglowka protokolu HTML przesylanej strony czy ze znacznika <meta>?

Cytat(sowiq)
Dokument będzie wczytywany jako XHTML tylko jeśli przeglądarka dostanie nagłówek przed rozpoczęciem wczytywania treści strony.
A konkretnie jaki musi dostac zeby wiedziala ze przetwarza wlasnie dokument XHTML'a? Ja to robie w taki sposob, jak czegos brakuje to prosze o uzupelnienie:
  1. <?php
  2. header('Content-Type: application/xhtml+xml; charset=utf-8');
  3.   echo '<'.'?xml version="1.0" encoding="UTF-8" standalone="no" ?'.'>'."\n";
  4. ?>
  5. <!DOCTYPE html
  6.   PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  7.   "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  8. <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl">
Takie cos wystarczy czy trzeba jeszcze jakis naglowek dodac (albo cos zmienic)?
sowiq
Sam sobie odpowiedz. http-equiv = ekwiwalent http. Znaczy to tylko tyle, że każdy nagłówek wysłany przez serwer możesz ustawić w meta-tagach. Problem tylko w tym, że nie wszystkie zadziałają poprawnie (np. wspomniane wcześniej definiowanie MIME dla xhtml).

[edit]
Zmieniłeś posta i moja odpowiedź nie trzyma się kupy z niczym tongue.gif

@up,
IE Ci tego nie łyknie. Ja używałem czegoś w tym stylu:
  1. <?php
  2. $xhtml = false;
  3. if (preg_match('/application/xhtml+xml(?![+a-z])(;q=(0.d{1,3}|[01]))?/i', $_SERVER['HTTP_ACCEPT'], $matches)) {
  4.   $xhtmlQ = isset($matches[2])?($matches[2]+0.2)&#581;
  5.   if (preg_match('/text/html(;q=(0d{1,3}|[01]))s?/i', $_SERVER['HTTP_ACCEPT'], $matches)) {
  6.   $htmlQ = isset($matches[2]) ? $matches[2] : 1;
  7.   $xhtml = ($xhtmlQ >= $htmlQ);
  8.   } else {
  9.   $xhtml = true;
  10.   }
  11. }
  12. if ($xhtml) {
  13.   header('Content-Type: application/xhtml+xml; charset=utf-8');
  14. } else {
  15.   header('Content-Type: text/html; charset=utf-8');
  16. }
  17. ?>


A Pokaż informacje o stronie najprawdopodobniej zczytuje te informacje z mea-tagów.
Pytałeś jeszcze o wyszukiwarki - najprawdopodobniej olewają one wszelkie nagłówki i dobrze jest zawrzeć meta-tagi właśnie dla nich.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.