Mapa zgodności z RFC

Ta strona wymienia standardy, które mają znaczenie dla OxPHP jako serwera źródłowego: HTTP, TLS, pliki statyczne i bramę do PHP. Opisuje OxPHP 0.13.0. WebDAV, działanie jako proxy i współdzielone pamięci podręczne wykraczają poza jej zakres.

Standard liczy się jako zaimplementowany, gdy opisane w nim zachowanie jest obecne. Część tego zachowania to własna praca OxPHP, a część pochodzi z bibliotek HTTP, TLS i kompresji, na których OxPHP jest zbudowany i które konfiguruje.

Zaimplementowane w pełni

  • RFC 9112, HTTP/1.1: keep-alive, ciała przesyłane w trybie chunked, Expect: 100-continue i pipelining. Limit czasu ogranicza, jak długo klient może wysyłać swoje nagłówki.
  • RFC 9113, HTTP/2: przez TLS oraz przez zwykłe TCP dla klientów, którzy łączą się z uprzednią wiedzą (prior knowledge). Liczba równoczesnych strumieni i rozmiar nagłówków są ograniczone, ataki Rapid Reset i MadeYouReset są blokowane, a opróżniający się serwer sygnalizuje to ramką GOAWAY.
  • RFC 7541, HPACK: kompresja nagłówków HTTP/2 z limitem rozmiaru zdekodowanych nagłówków, który zatrzymuje żądania typu „HPACK bomb”.
  • RFC 8446 i RFC 5246, TLS 1.3 i 1.2: obie wersje, z minimalną wersją, którą można podnieść do 1.3. Wczesne dane 0-RTT są wyłączone, więc wczesne żądania nie mogą zostać powtórzone.
  • RFC 7301, ALPN: uzgadnianie TLS wybiera h2 lub http/1.1.
  • RFC 9110, żądania Range: pojedynczy zakres bajtów dla GET i HEAD, z odpowiedzią 206 lub 416. Żądanie kilku zakresów dostaje cały plik z 200, na co standard pozwala. Zakresy są wyłączane, gdy odpowiedź jest kompresowana.
  • RFC 9110, If-Range: respektowany tylko przy silnym walidatorze, jak wymaga standard.
  • RFC 9110, kodowanie zawartości: Brotli, gzip i Zstandard. Wagi w Accept-Encoding są respektowane, a q=0 oznacza, że klient odrzuca dane kodowanie. Skompresowane odpowiedzi mają Vary: Accept-Encoding i słaby ETag. Strumienie zdarzeń nigdy nie są kompresowane.
  • RFC 9110, Retry-After: wysyłany z 429 (czas pozostały do końca okna limitu żądań), z 503, gdy serwer się opróżnia lub zamyka, oraz z 529, gdy jest przeciążony.
  • RFC 6585, 429 Too Many Requests: ograniczanie liczby żądań na IP odpowiada 429 z Retry-After.
  • RFC 9110, daty HTTP: daty w nagłówkach są odczytywane i zapisywane w standardowym formacie.
  • RFC 10008, metoda QUERY: przyjmowana wraz z ciałem, które PHP odczytuje tak samo jak ciało POST. Ma własny limit rozmiaru ciała. Żądanie QUERY bez Content-Type dostaje 400.
  • RFC 7578, multipart/form-data: przesyłanie plików działa tak jak w każdej konfiguracji PHP.
  • RFC 9113 i RFC 6265, podzielone nagłówki Cookie: gdy klient wysyła Cookie jako kilka linii nagłówka, co klienci HTTP/2 robią często, OxPHP łączy je w jedną, zanim zobaczy je PHP.
  • RFC 8615, URI well-known: ścieżki pod /.well-known/ są serwowane, mimo że inne ścieżki z kropką są blokowane. Pliki PHP w tym katalogu nigdy nie są wykonywane.
  • RFC 1918, RFC 4193 i RFC 3927, sieci prywatne: słowo kluczowe private na liście zaufanych proxy obejmuje wszystkie te zakresy. Carrier-grade NAT (RFC 6598) nie jest uwzględniony i trzeba go wpisać ręcznie.
  • RFC 7034, X-Frame-Options: domyślnie SAMEORIGIN, wysyłany razem z pasującą dyrektywą CSP frame-ancestors oraz X-Content-Type-Options: nosniff. Nagłówki ustawione przez Twoją aplikację mają pierwszeństwo.

Obsługiwanych jest też kilka standardów spoza serii RFC:

Zaimplementowane częściowo

  • RFC 3875, CGI/1.1: standardowe zmienne CGI są w $_SERVER, a każdy nagłówek żądania trafia tam jako HTTP_*. Braki: nagłówek wysłany jako kilka linii nie jest łączony w jedną wartość, czego wymaga standard. $_SERVER zachowuje ostatnią linię, a API żądania pierwszą. REMOTE_HOST nie jest ustawiany.
  • RFC 7239, Forwarded: OxPHP odczytuje Forwarded i X-Forwarded-* od zaufanych proxy, a za Cloudflare także CF-Connecting-IP. Braki: wartość w cudzysłowie, która zawiera przecinek lub średnik, jest dzielona w złym miejscu. X-Real-IP nie jest obsługiwany.
  • RFC 9110, żądania warunkowe: pliki statyczne obsługują If-None-Match oraz If-Modified-Since i odpowiadają 304. Braki: If-Match, If-Unmodified-Since i 412 Precondition Failed.
  • RFC 9111, buforowanie HTTP: pliki statyczne dostają Cache-Control z konfigurowalnym max-age oraz ETag, Last-Modified i Vary. Braki: nie ma immutable, a każdy plik dostaje tę samą politykę niezależnie od typu i ścieżki.
  • RFC 9110, metody żądań: ciała są odczytywane dla POST, PUT, PATCH, DELETE i QUERY, a zbyt duże ciało jest odrzucane z 413, zanim zostanie odczytane. Braki: plik statyczny odpowiada na każdą metodę, w tym POST i DELETE, kodem 200 i swoją zawartością, podczas gdy nginx odpowiada 405 z nagłówkiem Allow.
  • RFC 7617, uwierzytelnianie Basic: nagłówek Authorization trafia do PHP jako HTTP_AUTHORIZATION. Braki: PHP_AUTH_USER, PHP_AUTH_PW i AUTH_TYPE nie są wypełniane.
  • RFC 3986, URI: dekodowanie procentowe i parsowanie hosta działają, także dla adresów IPv6, a ścieżki z segmentami . lub .. dostają 404. Braki: końcowy ukośnik jest usuwany przed routingiem, więc /dir serwuje indeks katalogu bez przekierowania na /dir/, a plik odpowiada także pod /file/.
  • RFC 6265, ciasteczka: ciasteczka, które pluginy OxPHP ustawiają na własne potrzeby, mają SameSite, HttpOnly, Secure i Max-Age. Ciasteczka Twojej aplikacji przechodzą jak zwykle przez setcookie() z PHP. Braki: dla źle sformatowanej pary ciasteczka cookie() z API żądania i $_COOKIE mogą zwrócić różne wartości.

Plan rozwoju

To propozycje uporządkowane według priorytetu. Żadna z nich nie jest zaplanowana na konkretne wydanie.

Wysoki priorytet

  • RFC 3875: łączenie nagłówka, który przychodzi jako kilka linii, w jedną wartość rozdzieloną przecinkami, tak aby PHP widział cały łańcuch X-Forwarded-For z kolejnych proxy.
  • RFC 7617: wypełnianie PHP_AUTH_USER i PHP_AUTH_PW na podstawie uwierzytelniania Basic. Aplikacje, które je odczytują, dostają dziś puste wartości, bez żadnego błędu.
  • RFC 6797, HSTS: wysyłanie Strict-Transport-Security w każdej odpowiedzi HTTPS, także dla plików statycznych i stron błędów. PHP nie może dodać tego nagłówka do plików statycznych, bo nigdy nie widzi tych żądań.

Średni priorytet

  • RFC 7239: poprawne parsowanie wartości w cudzysłowie w Forwarded.
  • RFC 9110: odpowiadanie 405 z Allow: GET, HEAD, gdy plik statyczny dostaje inną metodę, tak jak robi to nginx.
  • RFC 3986: przekierowanie /dir na /dir/ kodem 301 w trybie Tradycyjnym, tak aby względne linki w starszych aplikacjach były rozwiązywane poprawnie.
  • Nagłówki RateLimit (szkic IETF): wysyłanie RateLimit i RateLimit-Policy, tak aby klient widział swój limit, zanim go osiągnie. Dziś nagłówki X-RateLimit-* pojawiają się tylko w odpowiedzi 429.
  • W3C Server-Timing: raportowanie czasu oczekiwania w kolejce i czasu wykonania PHP w nagłówku Server-Timing. OxPHP już mierzy oba na potrzeby metryk i śladów.

Niski priorytet

  • RFC 9110: If-Match, If-Unmodified-Since i 412 dla plików statycznych. Pliki statyczne są tylko do odczytu, więc rzadko miałoby to znaczenie.
  • RFC 6455 i RFC 8441, WebSocket: WebSocket przez HTTP/1.1 i HTTP/2. Projekt jest wciąż dopracowywany.
  • RFC 8297, Early Hints: 103 Early Hints, dzięki któremu przeglądarki mogą zacząć wstępnie wczytywać zasoby, zanim odpowiedź będzie gotowa.
  • RFC 8446, certyfikaty klienta: wzajemne uwierzytelnianie TLS dla środowisk zero-trust.
  • RFC 9114, HTTP/3, wraz z RFC 7838, Alt-Svc: duży nakład pracy, a nie jest jasne, czy by się opłacił.

Rozważone i odrzucone

Granica przebiega między obsługą HTTP, która jest zadaniem serwera, a treścią należącą do konkretnej witryny, która nim nie jest.

  • RFC 9116, security.txt: plik zawiera kontakty w sprawach bezpieczeństwa tego, kto prowadzi witrynę, a serwer ich nie zna. Wbudowana wartość domyślna byłaby pusta albo błędnie wskazywałaby opiekunów OxPHP. Umieść plik w katalogu głównym dokumentów, a OxPHP zaserwuje go jak każdy inny plik statyczny. nginx, Apache i FrankenPHP również go nie generują.
  • RFC 3875, PATH_TRANSLATED: standard zaleca tę zmienną, gdy ustawione jest PATH_INFO. Istnieje ona dla skryptów CGI, które przetwarzają jakiś inny plik. W OxPHP uruchamianym skryptem jest zawsze SCRIPT_FILENAME, a zwykła konfiguracja nginx z PHP-FPM i php -S też tej zmiennej nie ustawiają. Jej wartość byłaby budowana z PATH_INFO wysłanego przez klienta, więc starszy kod, który dołącza $_SERVER['PATH_TRANSLATED'], wczytałby plik wybrany przez klienta.
  • RFC 7540, upgrade do h2c: w RFC 9113 usunięto uzgadnianie Upgrade: h2c. OxPHP serwuje HTTP/2 bez TLS klientom z uprzednią wiedzą i to wystarcza.

Zobacz też

  • TLS: certyfikaty, wersje i negocjacja HTTP/2
  • Kompresja: jak OxPHP wybiera Brotli, Zstandard lub gzip
  • Zaufane proxy: ustalanie rzeczywistego adresu klienta za proxy lub CDN
  • Zmienne superglobalne: co PHP znajduje w $_SERVER i pozostałych zmiennych superglobalnych
  • Przegląd architektury: jak OxPHP obsługuje żądanie od początku do końca
Znalazłeś błąd? Zgłoś go →