Конфигурация 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
HTTP cookie
Вы можете изменить значения по умолчанию некоторых параметров метода 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 сессии отправляется с теми же параметрами, что и другие 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-запрос |