Nette Documentation Preview

syntax
Конфигурация HTTP
*****************

.[perex]
Обзор параметров конфигурации Nette HTTP.

Если вы используете не весь фреймворк, а только эту библиотеку, прочитайте, [как загрузить конфигурацию|bootstrap:].


HTTP-заголовки
==============

```neon
http:
	# заголовки, которые отправляются с каждым ответом
	headers:
		X-Powered-By: MyCMS
		X-Content-Type-Options: nosniff
		X-XSS-Protection: '1; mode=block'

	# влияет на заголовок X-Frame-Options
	frames: ...      # (string|bool|null) по умолчанию 'SAMEORIGIN'
```

Из соображений безопасности фреймворк отправляет заголовок `X-Frame-Options: SAMEORIGIN`, который говорит, что страницу можно показывать внутри другой страницы (в элементе `<iframe>`), только если та находится на том же домене. В некоторых ситуациях это может быть нежелательно (например, если вы разрабатываете приложение для Facebook), поэтому поведение можно изменить: `frames: http://allowed-host.com` разрешает конкретный хост, `frames: true` разрешает вставку откуда угодно (заголовок опускается), а `frames: false` запрещает её полностью (`X-Frame-Options: DENY`).

По умолчанию Nette отправляет ещё и заголовки `X-Powered-By: Nette Framework 3` и `Content-Type: text/html; charset=utf-8`. Любой заголовок, в том числе эти стандартные, можно убрать, задав его значением пустую строку.


Content Security Policy
-----------------------

Заголовки `Content-Security-Policy` (CSP) легко настраиваются; их описание вы найдёте в [спецификации CSP |https://content-security-policy.com]. Директивы CSP (например, `script-src`) можно записывать либо строками согласно спецификации, либо массивами значений для лучшей читаемости. Тогда не нужно использовать кавычки вокруг ключевых слов вроде `'self'`. Nette также автоматически породит значение `nonce`, так что в заголовке будет отправлено что-то вроде `'nonce-y4PopTLM=='`.

```neon
http:
	# Content Security Policy
	csp:
		# строка согласно спецификации CSP
		default-src: "'self' https://example.com"

		# массив значений
		script-src:
			- nonce
			- strict-dynamic
			- self
			- https://example.com

		# bool в случае переключателей
		upgrade-insecure-requests: true
		block-all-mixed-content: false
```

В шаблонах используйте `<script n:nonce>...</script>`, и значение nonce подставится автоматически. Делать безопасные сайты в Nette действительно легко.

Похожим образом настраиваются заголовки `Content-Security-Policy-Report-Only` (их можно использовать одновременно с CSP) и [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
```


HTTP cookie
-----------

Вы можете изменить значения по умолчанию некоторых параметров метода [Nette\Http\Response::setCookie() |response#setCookie()] и работы с сессией.

```neon
http:
	# область действия cookie по пути
	cookiePath: ...          # (string) по умолчанию '/'

	# домены, которые могут принимать cookie
	cookieDomain: 'example.com'  # (string|domain) по умолчанию не задано

	# отправлять cookie только через HTTPS?
	cookieSecure: ...        # (bool|auto) по умолчанию auto

	# отключает отправку cookie, которую Nette использует для защиты от CSRF
	disableNetteCookie: ...  # (bool) по умолчанию false
```

Атрибут `cookieDomain` определяет, какие домены (источники) могут принимать cookie. Если он не указан, cookie принимает тот же (под)домен, который её задал, *исключая* его поддомены. Если `cookieDomain` указан, поддомены тоже включаются. Поэтому указание `cookieDomain` менее ограничительно, чем его отсутствие.

Например, если задано `cookieDomain: nette.org`, cookie доступны и на всех поддоменах вроде `doc.nette.org`. Того же можно добиться особым значением `domain`, то есть `cookieDomain: domain`.

Значение по умолчанию `auto` у атрибута `cookieSecure` означает, что если сайт работает по HTTPS, cookie будут отправляться с флагом `Secure` и, стало быть, будут доступны только по HTTPS.


HTTP-прокси
-----------

Если сайт работает за HTTP-прокси, укажите IP-адрес прокси, чтобы правильно работали определение HTTPS-соединения и IP-адреса клиента. То есть чтобы [Nette\Http\Request::getRemoteAddress() |request#getRemoteAddress()] и [isSecured() |request#isSecured()] возвращали верные значения, а ссылки в шаблонах порождались с протоколом `https:`.

```neon
http:
	# IP-адрес, диапазон (например, 127.0.0.1/8) или массив таких значений
	proxy: 127.0.0.1       # (string|string[]) по умолчанию не задано
```


Принудительный HTTPS .{data-version:3.3.4}
------------------------------------------

Безусловно принуждает схему запроса к HTTPS. Это полезно для сайтов, работающих только по HTTPS, за балансировщиком нагрузки или обратным прокси, который завершает TLS, но не передаёт заголовок `X-Forwarded-Proto`, так что стандартное определение HTTPS (даже с настроенным [#HTTP-прокси]) его не поймает.

```neon
http:
	# принудительно использовать схему HTTPS для всех запросов
	forceHttps: true       # (bool) по умолчанию false
```


Сессия
======

Основные настройки [сессий |sessions]:

```neon
session:
	# показывать панель сессии в Tracy Bar?
	debugger: ...        # (bool) по умолчанию false

	# время бездействия, после которого сессия истекает
	expiration: 14 days  # (string) по умолчанию '3 hours'

	# когда сессия должна запускаться?
	autoStart: ...       # (smart|always|never) по умолчанию 'smart'

	# обработчик, сервис, реализующий SessionHandlerInterface
	handler: @handlerService
```

Параметр `autoStart` управляет тем, когда должна запускаться сессия. Значение `always` означает, что сессия запускается всегда при старте приложения. Значение `smart` означает, что сессия запускается вместе с приложением, только если она уже существует, либо в момент, когда мы хотим из неё читать или в неё писать. Наконец, значение `never` отключает автоматический запуск сессии.

Кроме того, можно задать все [директивы сессии |https://www.php.net/manual/en/session.configuration.php] PHP (в формате camelCase), а также [readAndClose |https://www.php.net/manual/en/function.session-start.php#refsect1-function.session-start-parameters]. Например:

```neon
session:
	# 'session.name' записывается как 'name'
	name: MYID

	# 'session.save_path' записывается как 'savePath'
	savePath: "%tempDir%/sessions"
```


Cookie сессии
-------------

Cookie сессии отправляется с теми же параметрами, что и [другие cookie |#HTTP cookie], но именно для неё их можно изменить:

```neon
session:
	# домены, которые могут принимать cookie
	cookieDomain: 'example.com'   # (string|domain)

	# ограничение доступа с другого источника
	cookieSamesite: None          # (Strict|Lax|None) по умолчанию Lax
```

Атрибут `cookieSamesite` влияет на то, отправляется ли cookie при [запросах с другого источника |nette:glossary#SameSite cookie], что даёт некоторую защиту от атак [Cross-Site Request Forgery |nette:glossary#Cross-Site Request Forgery (CSRF)] (CSRF).


Сервисы DI
==========

Эти сервисы добавляются в DI-контейнер:

| Имя             | Тип                        | Описание
|-----------------|----------------------------|---------------------------
| `http.request`  | [api:Nette\Http\Request]   | [HTTP-запрос| request]
| `http.response` | [api:Nette\Http\Response]  | [HTTP-ответ| response]
| `session.session`| [api:Nette\Http\Session]   | [работа с сессией| sessions]
| `http.requestFactory`| [api:Nette\Http\RequestFactory] | фабрика, создающая HTTP-запрос

Конфигурация HTTP

Обзор параметров конфигурации Nette HTTP.

Если вы используете не весь фреймворк, а только эту библиотеку, прочитайте, как загрузить конфигурацию.

HTTP-заголовки

http:
	# заголовки, которые отправляются с каждым ответом
	headers:
		X-Powered-By: MyCMS
		X-Content-Type-Options: nosniff
		X-XSS-Protection: '1; mode=block'

	# влияет на заголовок X-Frame-Options
	frames: ...      # (string|bool|null) по умолчанию 'SAMEORIGIN'

Из соображений безопасности фреймворк отправляет заголовок X-Frame-Options: SAMEORIGIN, который говорит, что страницу можно показывать внутри другой страницы (в элементе <iframe>), только если та находится на том же домене. В некоторых ситуациях это может быть нежелательно (например, если вы разрабатываете приложение для Facebook), поэтому поведение можно изменить: frames: http://allowed-host.com разрешает конкретный хост, frames: true разрешает вставку откуда угодно (заголовок опускается), а frames: false запрещает её полностью (X-Frame-Options: DENY).

По умолчанию Nette отправляет ещё и заголовки X-Powered-By: Nette Framework 3 и Content-Type: text/html; charset=utf-8. Любой заголовок, в том числе эти стандартные, можно убрать, задав его значением пустую строку.

Content Security Policy

Заголовки Content-Security-Policy (CSP) легко настраиваются; их описание вы найдёте в спецификации CSP. Директивы CSP (например, script-src) можно записывать либо строками согласно спецификации, либо массивами значений для лучшей читаемости. Тогда не нужно использовать кавычки вокруг ключевых слов вроде 'self'. Nette также автоматически породит значение nonce, так что в заголовке будет отправлено что-то вроде 'nonce-y4PopTLM=='.

http:
	# Content Security Policy
	csp:
		# строка согласно спецификации CSP
		default-src: "'self' https://example.com"

		# массив значений
		script-src:
			- nonce
			- strict-dynamic
			- self
			- https://example.com

		# bool в случае переключателей
		upgrade-insecure-requests: true
		block-all-mixed-content: false

В шаблонах используйте <script n:nonce>...</script>, и значение nonce подставится автоматически. Делать безопасные сайты в Nette действительно легко.

Похожим образом настраиваются заголовки Content-Security-Policy-Report-Only (их можно использовать одновременно с CSP) и 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

Вы можете изменить значения по умолчанию некоторых параметров метода Nette\Http\Response::setCookie() и работы с сессией.

http:
	# область действия cookie по пути
	cookiePath: ...          # (string) по умолчанию '/'

	# домены, которые могут принимать cookie
	cookieDomain: 'example.com'  # (string|domain) по умолчанию не задано

	# отправлять cookie только через HTTPS?
	cookieSecure: ...        # (bool|auto) по умолчанию auto

	# отключает отправку cookie, которую Nette использует для защиты от CSRF
	disableNetteCookie: ...  # (bool) по умолчанию false

Атрибут cookieDomain определяет, какие домены (источники) могут принимать cookie. Если он не указан, cookie принимает тот же (под)домен, который её задал, исключая его поддомены. Если cookieDomain указан, поддомены тоже включаются. Поэтому указание cookieDomain менее ограничительно, чем его отсутствие.

Например, если задано cookieDomain: nette.org, cookie доступны и на всех поддоменах вроде doc.nette.org. Того же можно добиться особым значением domain, то есть cookieDomain: domain.

Значение по умолчанию auto у атрибута cookieSecure означает, что если сайт работает по HTTPS, cookie будут отправляться с флагом Secure и, стало быть, будут доступны только по HTTPS.

HTTP-прокси

Если сайт работает за HTTP-прокси, укажите IP-адрес прокси, чтобы правильно работали определение HTTPS-соединения и IP-адреса клиента. То есть чтобы Nette\Http\Request::getRemoteAddress() и isSecured() возвращали верные значения, а ссылки в шаблонах порождались с протоколом https:.

http:
	# IP-адрес, диапазон (например, 127.0.0.1/8) или массив таких значений
	proxy: 127.0.0.1       # (string|string[]) по умолчанию не задано

Принудительный HTTPS

Безусловно принуждает схему запроса к HTTPS. Это полезно для сайтов, работающих только по HTTPS, за балансировщиком нагрузки или обратным прокси, который завершает TLS, но не передаёт заголовок X-Forwarded-Proto, так что стандартное определение HTTPS (даже с настроенным HTTP-прокси) его не поймает.

http:
	# принудительно использовать схему HTTPS для всех запросов
	forceHttps: true       # (bool) по умолчанию false

Сессия

Основные настройки сессий:

session:
	# показывать панель сессии в Tracy Bar?
	debugger: ...        # (bool) по умолчанию false

	# время бездействия, после которого сессия истекает
	expiration: 14 days  # (string) по умолчанию '3 hours'

	# когда сессия должна запускаться?
	autoStart: ...       # (smart|always|never) по умолчанию 'smart'

	# обработчик, сервис, реализующий SessionHandlerInterface
	handler: @handlerService

Параметр autoStart управляет тем, когда должна запускаться сессия. Значение always означает, что сессия запускается всегда при старте приложения. Значение smart означает, что сессия запускается вместе с приложением, только если она уже существует, либо в момент, когда мы хотим из неё читать или в неё писать. Наконец, значение never отключает автоматический запуск сессии.

Кроме того, можно задать все директивы сессии PHP (в формате camelCase), а также readAndClose. Например:

session:
	# 'session.name' записывается как 'name'
	name: MYID

	# 'session.save_path' записывается как 'savePath'
	savePath: "%tempDir%/sessions"

Cookie сессии отправляется с теми же параметрами, что и другие cookie, но именно для неё их можно изменить:

session:
	# домены, которые могут принимать cookie
	cookieDomain: 'example.com'   # (string|domain)

	# ограничение доступа с другого источника
	cookieSamesite: None          # (Strict|Lax|None) по умолчанию Lax

Атрибут cookieSamesite влияет на то, отправляется ли cookie при запросах с другого источника, что даёт некоторую защиту от атак Cross-Site Request Forgery (CSRF).

Сервисы DI

Эти сервисы добавляются в DI-контейнер:

Имя Тип Описание
http.request Nette\Http\Request HTTP-запрос
http.response Nette\Http\Response HTTP-ответ
session.session Nette\Http\Session работа с сессией
http.requestFactory Nette\Http\RequestFactory фабрика, создающая HTTP-запрос