Configuration HTTP
******************
.[perex]
Aperçu des options de configuration de Nette HTTP.
Si vous n'utilisez pas tout le framework, mais seulement cette bibliothèque, lisez [comment charger la configuration|bootstrap:].
En-têtes HTTP
=============
```neon
http:
# en-têtes envoyés avec chaque réponse
headers:
X-Powered-By: MyCMS
X-Content-Type-Options: nosniff
X-XSS-Protection: '1; mode=block'
# influence l'en-tête X-Frame-Options
frames: ... # (string|bool|null) 'SAMEORIGIN' par défaut
```
Pour des raisons de sécurité, le framework envoie l'en-tête `X-Frame-Options: SAMEORIGIN`, qui indique qu'une page ne peut être affichée à l'intérieur d'une autre page (dans un élément `<iframe>`) que si elle se trouve sur le même domaine. Cela peut être indésirable dans certaines situations (par exemple si vous développez une application Facebook) ; le comportement peut donc être modifié en définissant `frames: http://allowed-host.com` pour autoriser un hôte précis, `frames: true` pour autoriser l'inclusion depuis n'importe où (l'en-tête est omis), ou `frames: false` pour l'interdire complètement (`X-Frame-Options: DENY`).
Par défaut, Nette envoie aussi les en-têtes `X-Powered-By: Nette Framework 3` et `Content-Type: text/html; charset=utf-8`. Vous pouvez supprimer n'importe quel en-tête, y compris ceux par défaut, en fixant sa valeur à une chaîne vide.
Content Security Policy
-----------------------
Les en-têtes `Content-Security-Policy` (CSP) se configurent facilement ; leur description se trouve dans la [spécification CSP |https://content-security-policy.com]. Les directives CSP (comme `script-src`) peuvent s'écrire soit sous forme de chaînes conformes à la spécification, soit sous forme de tableaux de valeurs, plus lisibles. Il n'est alors pas nécessaire d'entourer de guillemets les mots-clés comme `'self'`. Nette générera aussi automatiquement une valeur `nonce`, si bien que quelque chose comme `'nonce-y4PopTLM=='` sera envoyé dans l'en-tête.
```neon
http:
# Content Security Policy
csp:
# chaîne conforme à la spécification CSP
default-src: "'self' https://example.com"
# tableau de valeurs
script-src:
- nonce
- strict-dynamic
- self
- https://example.com
# bool dans le cas des interrupteurs
upgrade-insecure-requests: true
block-all-mixed-content: false
```
Utilisez `<script n:nonce>...</script>` dans les templates et la valeur du nonce sera renseignée automatiquement. Faire des sites web sûrs avec Nette est vraiment facile.
De la même façon, on peut configurer les en-têtes `Content-Security-Policy-Report-Only` (utilisables en parallèle de CSP) et la [Feature Policy|https://developers.google.com/web/updates/2018/06/feature-policy] :
```neon
http:
# Content Security Policy Report-Only
cspReportOnly:
default-src: self
report-uri: 'https://my-report-uri-endpoint'
# Feature Policy
featurePolicy:
unsized-media: none
geolocation:
- self
- https://example.com
```
Cookie HTTP
-----------
Vous pouvez changer les valeurs par défaut de certains paramètres de la méthode [Nette\Http\Response::setCookie() |response#setCookie()] et de la gestion des sessions.
```neon
http:
# portée du cookie par chemin
cookiePath: ... # (string) '/' par défaut
# domaines qui peuvent recevoir le cookie
cookieDomain: 'example.com' # (string|domain) non défini par défaut
# n'envoyer les cookies que via HTTPS ?
cookieSecure: ... # (bool|auto) auto par défaut
# désactive l'envoi du cookie que Nette utilise pour la protection CSRF
disableNetteCookie: ... # (bool) false par défaut
```
L'attribut `cookieDomain` détermine quels domaines (origines) peuvent accepter les cookies. S'il n'est pas indiqué, le cookie est accepté par le même (sous-)domaine que celui qui l'a défini, *à l'exclusion* de ses sous-domaines. Si `cookieDomain` est indiqué, les sous-domaines sont inclus eux aussi. Indiquer `cookieDomain` est donc moins restrictif que de l'omettre.
Par exemple, si `cookieDomain: nette.org` est défini, les cookies sont aussi disponibles sur tous les sous-domaines comme `doc.nette.org`. On peut aussi y parvenir avec la valeur spéciale `domain`, c'est-à-dire `cookieDomain: domain`.
La valeur par défaut `auto` de l'attribut `cookieSecure` signifie que si le site tourne en HTTPS, les cookies seront envoyés avec le drapeau `Secure` et ne seront donc disponibles que via HTTPS.
Proxy HTTP
----------
Si le site tourne derrière un proxy HTTP, indiquez l'adresse IP du proxy afin que la détection de la connexion HTTPS et l'adresse IP du client fonctionnent correctement. Autrement dit, pour que [Nette\Http\Request::getRemoteAddress() |request#getRemoteAddress()] et [isSecured() |request#isSecured()] renvoient les bonnes valeurs et que les liens soient générés avec le protocole `https:` dans les templates.
```neon
http:
# adresse IP, plage (par exemple 127.0.0.1/8), ou tableau de ces valeurs
proxy: 127.0.0.1 # (string|string[]) non défini par défaut
```
Forcer HTTPS .{data-version:3.3.4}
----------------------------------
Force sans condition le schéma de la requête en HTTPS. C'est utile pour les sites uniquement HTTPS qui tournent derrière un répartiteur de charge ou un reverse proxy terminant le TLS mais ne transmettant pas l'en-tête `X-Forwarded-Proto`, si bien que la détection HTTPS standard (même avec un [#Proxy HTTP] configuré) ne le remarquerait pas.
```neon
http:
# force le schéma HTTPS pour toutes les requêtes
forceHttps: true # (bool) false par défaut
```
Session
=======
Réglages de base des [sessions] :
```neon
session:
# afficher le panneau de session dans la Tracy Bar ?
debugger: ... # (bool) false par défaut
# durée d'inactivité au bout de laquelle la session expire
expiration: 14 days # (string) '3 hours' par défaut
# quand la session doit-elle démarrer ?
autoStart: ... # (smart|always|never) 'smart' par défaut
# handler, un service implémentant SessionHandlerInterface
handler: @handlerService
```
L'option `autoStart` détermine quand la session doit démarrer. La valeur `always` signifie que la session démarre dès que l'application démarre. La valeur `smart` signifie que la session ne démarre avec l'application que si elle existe déjà, ou au moment où nous voulons y lire ou y écrire. Enfin, la valeur `never` désactive le démarrage automatique de la session.
Vous pouvez en outre définir toutes les [directives de session |https://www.php.net/manual/en/session.configuration.php] de PHP (au format camelCase) ainsi que [readAndClose |https://www.php.net/manual/en/function.session-start.php#refsect1-function.session-start-parameters]. Exemple :
```neon
session:
# 'session.name' s'écrit 'name'
name: MYID
# 'session.save_path' s'écrit 'savePath'
savePath: "%tempDir%/sessions"
```
Cookie de session
-----------------
Le cookie de session est envoyé avec les mêmes paramètres que les [autres cookies |#Cookie HTTP], mais vous pouvez les changer spécialement pour lui :
```neon
session:
# domaines qui peuvent recevoir le cookie
cookieDomain: 'example.com' # (string|domain)
# restriction pour l'accès cross-origin
cookieSamesite: None # (Strict|Lax|None) Lax par défaut
```
L'attribut `cookieSamesite` détermine si le cookie est envoyé lors des [requêtes cross-origin |nette:glossary#Cookie SameSite], ce qui offre une certaine protection contre les attaques [Cross-Site Request Forgery |nette:glossary#Cross-Site Request Forgery (CSRF)] (CSRF).
Services DI
===========
Ces services sont ajoutés au conteneur DI :
| Nom | Type | Description
|-----------------|----------------------------|---------------------------
| `http.request` | [api:Nette\Http\Request] | [requête HTTP| request]
| `http.response` | [api:Nette\Http\Response] | [réponse HTTP| response]
| `session.session`| [api:Nette\Http\Session] | [gestion des sessions| sessions]
| `http.requestFactory`| [api:Nette\Http\RequestFactory] | factory qui crée la requête HTTP
Configuration HTTP
Aperçu des options de configuration de Nette HTTP.
Si vous n'utilisez pas tout le framework, mais seulement cette bibliothèque, lisez comment charger la configuration.
En-têtes HTTP
http:
# en-têtes envoyés avec chaque réponse
headers:
X-Powered-By: MyCMS
X-Content-Type-Options: nosniff
X-XSS-Protection: '1; mode=block'
# influence l'en-tête X-Frame-Options
frames: ... # (string|bool|null) 'SAMEORIGIN' par défaut
Pour des raisons de sécurité, le framework envoie l'en-tête X-Frame-Options: SAMEORIGIN, qui indique qu'une
page ne peut être affichée à l'intérieur d'une autre page (dans un élément <iframe>) que si elle se
trouve sur le même domaine. Cela peut être indésirable dans certaines situations (par exemple si vous développez une
application Facebook) ; le comportement peut donc être modifié en définissant frames: http://allowed-host.com pour
autoriser un hôte précis, frames: true pour autoriser l'inclusion depuis n'importe où (l'en-tête est omis), ou
frames: false pour l'interdire complètement (X-Frame-Options: DENY).
Par défaut, Nette envoie aussi les en-têtes X-Powered-By: Nette Framework 3 et
Content-Type: text/html; charset=utf-8. Vous pouvez supprimer n'importe quel en-tête, y compris ceux par défaut, en
fixant sa valeur à une chaîne vide.
Content Security Policy
Les en-têtes Content-Security-Policy (CSP) se configurent facilement ; leur description se trouve dans la spécification CSP. Les directives CSP (comme script-src) peuvent
s'écrire soit sous forme de chaînes conformes à la spécification, soit sous forme de tableaux de valeurs, plus lisibles. Il
n'est alors pas nécessaire d'entourer de guillemets les mots-clés comme 'self'. Nette générera aussi
automatiquement une valeur nonce, si bien que quelque chose comme 'nonce-y4PopTLM==' sera envoyé dans
l'en-tête.
http:
# Content Security Policy
csp:
# chaîne conforme à la spécification CSP
default-src: "'self' https://example.com"
# tableau de valeurs
script-src:
- nonce
- strict-dynamic
- self
- https://example.com
# bool dans le cas des interrupteurs
upgrade-insecure-requests: true
block-all-mixed-content: false
Utilisez <script n:nonce>...</script> dans les templates et la valeur du nonce sera renseignée
automatiquement. Faire des sites web sûrs avec Nette est vraiment facile.
De la même façon, on peut configurer les en-têtes Content-Security-Policy-Report-Only (utilisables en
parallèle de CSP) et la Feature Policy :
http:
# Content Security Policy Report-Only
cspReportOnly:
default-src: self
report-uri: 'https://my-report-uri-endpoint'
# Feature Policy
featurePolicy:
unsized-media: none
geolocation:
- self
- https://example.com
Cookie HTTP
Vous pouvez changer les valeurs par défaut de certains paramètres de la méthode Nette\Http\Response::setCookie() et de la gestion des
sessions.
http:
# portée du cookie par chemin
cookiePath: ... # (string) '/' par défaut
# domaines qui peuvent recevoir le cookie
cookieDomain: 'example.com' # (string|domain) non défini par défaut
# n'envoyer les cookies que via HTTPS ?
cookieSecure: ... # (bool|auto) auto par défaut
# désactive l'envoi du cookie que Nette utilise pour la protection CSRF
disableNetteCookie: ... # (bool) false par défaut
L'attribut cookieDomain détermine quels domaines (origines) peuvent accepter les cookies. S'il n'est pas
indiqué, le cookie est accepté par le même (sous-)domaine que celui qui l'a défini, à l'exclusion de ses
sous-domaines. Si cookieDomain est indiqué, les sous-domaines sont inclus eux aussi. Indiquer
cookieDomain est donc moins restrictif que de l'omettre.
Par exemple, si cookieDomain: nette.org est défini, les cookies sont aussi disponibles sur tous les sous-domaines
comme doc.nette.org. On peut aussi y parvenir avec la valeur spéciale domain, c'est-à-dire
cookieDomain: domain.
La valeur par défaut auto de l'attribut cookieSecure signifie que si le site tourne en HTTPS, les
cookies seront envoyés avec le drapeau Secure et ne seront donc disponibles que via HTTPS.
Proxy HTTP
Si le site tourne derrière un proxy HTTP, indiquez l'adresse IP du proxy afin que la détection de la connexion HTTPS et
l'adresse IP du client fonctionnent correctement. Autrement dit, pour que Nette\Http\Request::getRemoteAddress() et isSecured() renvoient les bonnes valeurs et que les liens soient
générés avec le protocole https: dans les templates.
http:
# adresse IP, plage (par exemple 127.0.0.1/8), ou tableau de ces valeurs
proxy: 127.0.0.1 # (string|string[]) non défini par défaut
Forcer HTTPS
Force sans condition le schéma de la requête en HTTPS. C'est utile pour les sites uniquement HTTPS qui tournent derrière un
répartiteur de charge ou un reverse proxy terminant le TLS mais ne transmettant pas l'en-tête X-Forwarded-Proto, si
bien que la détection HTTPS standard (même avec un Proxy HTTP configuré) ne le
remarquerait pas.
http:
# force le schéma HTTPS pour toutes les requêtes
forceHttps: true # (bool) false par défaut
Session
Réglages de base des sessions :
session:
# afficher le panneau de session dans la Tracy Bar ?
debugger: ... # (bool) false par défaut
# durée d'inactivité au bout de laquelle la session expire
expiration: 14 days # (string) '3 hours' par défaut
# quand la session doit-elle démarrer ?
autoStart: ... # (smart|always|never) 'smart' par défaut
# handler, un service implémentant SessionHandlerInterface
handler: @handlerService
L'option autoStart détermine quand la session doit démarrer. La valeur always signifie que la
session démarre dès que l'application démarre. La valeur smart signifie que la session ne démarre avec
l'application que si elle existe déjà, ou au moment où nous voulons y lire ou y écrire. Enfin, la valeur never
désactive le démarrage automatique de la session.
Vous pouvez en outre définir toutes les directives de
session de PHP (au format camelCase) ainsi que readAndClose.
Exemple :
session:
# 'session.name' s'écrit 'name'
name: MYID
# 'session.save_path' s'écrit 'savePath'
savePath: "%tempDir%/sessions"
Cookie de session
Le cookie de session est envoyé avec les mêmes paramètres que les autres cookies, mais vous
pouvez les changer spécialement pour lui :
session:
# domaines qui peuvent recevoir le cookie
cookieDomain: 'example.com' # (string|domain)
# restriction pour l'accès cross-origin
cookieSamesite: None # (Strict|Lax|None) Lax par défaut
L'attribut cookieSamesite détermine si le cookie est envoyé lors des requêtes cross-origin, ce qui offre une certaine protection
contre les attaques Cross-Site Request Forgery
(CSRF).
Services DI
Ces services sont ajoutés au conteneur DI :