Конфігурація 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 cookies доступні також на всіх піддоменах, таких як doc.nette.org. Того ж можна досягти також за допомогою спеціального значення domain, тобто cookieDomain: domain.

Стандартне значення auto для атрибута cookieSecure означає, що якщо сайт працює на HTTPS, cookies будуть надсилатися з прапором 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