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-continuei 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
h2lubhttp/1.1. - RFC 9110, żądania Range: pojedynczy zakres bajtów dla GET i HEAD, z odpowiedzią
206lub416. Żądanie kilku zakresów dostaje cały plik z200, 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-Encodingsą respektowane, aq=0oznacza, że klient odrzuca dane kodowanie. Skompresowane odpowiedzi mająVary: Accept-Encodingi słaby ETag. Strumienie zdarzeń nigdy nie są kompresowane. - RFC 9110,
Retry-After: wysyłany z429(czas pozostały do końca okna limitu żądań), z503, gdy serwer się opróżnia lub zamyka, oraz z529, gdy jest przeciążony. - RFC 6585,
429 Too Many Requests: ograniczanie liczby żądań na IP odpowiada429zRetry-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. ŻądanieQUERYbezContent-Typedostaje400. - 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łaCookiejako 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
privatena 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ślnieSAMEORIGIN, wysyłany razem z pasującą dyrektywą CSPframe-ancestorsorazX-Content-Type-Options: nosniff. Nagłówki ustawione przez Twoją aplikację mają pierwszeństwo.
Obsługiwanych jest też kilka standardów spoza serii RFC:
- W3C Trace Context: śledzenie rozproszone kontynuuje przychodzące
traceparentitracestatealbo rozpoczyna nowy ślad, gdy ich brak. - WHATWG Server-Sent Events: odpowiedź PHP z
Content-Type: text/event-streamjest strumieniowana do klienta w miarę zapisywania. - Format tekstowy Prometheus 0.0.4: serwer wewnętrzny publikuje metryki pod
/metricsw tym formacie, obok endpointów health. Można ograniczyć, z jakich adresów wolno je odczytywać.
Zaimplementowane częściowo
- RFC 3875, CGI/1.1: standardowe zmienne CGI są w
$_SERVER, a każdy nagłówek żądania trafia tam jakoHTTP_*. Braki: nagłówek wysłany jako kilka linii nie jest łączony w jedną wartość, czego wymaga standard.$_SERVERzachowuje ostatnią linię, a API żądania pierwszą.REMOTE_HOSTnie jest ustawiany. - RFC 7239,
Forwarded: OxPHP odczytujeForwardediX-Forwarded-*od zaufanych proxy, a za Cloudflare takżeCF-Connecting-IP. Braki: wartość w cudzysłowie, która zawiera przecinek lub średnik, jest dzielona w złym miejscu.X-Real-IPnie jest obsługiwany. - RFC 9110, żądania warunkowe: pliki statyczne obsługują
If-None-MatchorazIf-Modified-Sincei odpowiadają304. Braki:If-Match,If-Unmodified-Sincei412 Precondition Failed. - RFC 9111, buforowanie HTTP: pliki statyczne dostają
Cache-Controlz konfigurowalnymmax-ageorazETag,Last-ModifiediVary. Braki: nie maimmutable, 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, kodem200i swoją zawartością, podczas gdy nginx odpowiada405z nagłówkiemAllow. - RFC 7617, uwierzytelnianie Basic: nagłówek
Authorizationtrafia do PHP jakoHTTP_AUTHORIZATION. Braki:PHP_AUTH_USER,PHP_AUTH_PWiAUTH_TYPEnie 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/dirserwuje 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,SecureiMax-Age. Ciasteczka Twojej aplikacji przechodzą jak zwykle przezsetcookie()z PHP. Braki: dla źle sformatowanej pary ciasteczkacookie()z API żądania i$_COOKIEmogą 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-Forz kolejnych proxy. - RFC 7617: wypełnianie
PHP_AUTH_USERiPHP_AUTH_PWna podstawie uwierzytelniania Basic. Aplikacje, które je odczytują, dostają dziś puste wartości, bez żadnego błędu. - RFC 6797, HSTS: wysyłanie
Strict-Transport-Securityw 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
405zAllow: GET, HEAD, gdy plik statyczny dostaje inną metodę, tak jak robi to nginx. - RFC 3986: przekierowanie
/dirna/dir/kodem301w trybie Tradycyjnym, tak aby względne linki w starszych aplikacjach były rozwiązywane poprawnie. - Nagłówki RateLimit (szkic IETF): wysyłanie
RateLimitiRateLimit-Policy, tak aby klient widział swój limit, zanim go osiągnie. Dziś nagłówkiX-RateLimit-*pojawiają się tylko w odpowiedzi429. - 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-Sincei412dla 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 jestPATH_INFO. Istnieje ona dla skryptów CGI, które przetwarzają jakiś inny plik. W OxPHP uruchamianym skryptem jest zawszeSCRIPT_FILENAME, a zwykła konfiguracja nginx z PHP-FPM iphp -Steż tej zmiennej nie ustawiają. Jej wartość byłaby budowana zPATH_INFOwysł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
$_SERVERi pozostałych zmiennych superglobalnych - Przegląd architektury: jak OxPHP obsługuje żądanie od początku do końca