Конфигурация 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) по умолчанию 'SAMEORIGIN'

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

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[]) по умолчанию не установлено

Сессия

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

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"

Session 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 управление сессией
версия: 4.0