Архив на категория: Web Development

HTTP Client Hints API

Какво е Client Hints API?

Client Hints (CH) API е набор от HTTP хедъри за проактивна комуникация и трансфер на ресурси и съдържание (content-negotiation).
Към момента на писане на статията статуса на предложението е „Experimental„.
Ето и какво ще разгледаме днес:

Как функционира?

Client Hints API функционира на application ниво, и по-конкретно като extension на самият HTTP протокол, но само, когато е наличен TLS. Представлява размяна хедъри към заявките, които дават различни параметри (ресурси, информация за използваната мрежа, скорост и др.) за клиента свързващ се към сървъра като за целта сървъра инициира комуникацията, че иска тези данни. Ако погледнем следния пример – при заявка за даден ресурс на сървъра:

Сървърът връща този ресурс, добавяйки следният Accept-CH хедър:

Accept-CH = <sh-list>

И по-конкретно:

Accept-CH: Sec-CH-Example, Sec-SH-Example-2

Когато клиентът (обикновено вашият браузър) получи този хедър, това индикира, че източника (сървъра) поддържа Client Hints.

Пример за комуникация

По-цялостен и реалистичен пример за комуникация, би изглеждал така.
Client:

GET https://example.com/

Server:

Accept-CH: viewport-width, dpr, device-memory, rtt, downlink, ect
Accept-CH-Lifetime: 30

Client:

Viewport-Width: 1920
DPR: 1
Device-Memory: 8
RTT: 50
Downlink: 10
ECT: 4g

Кои са хедърите в спецификацията?

Accept-CH – Списък с необходимите хедъри от сървъра (origin)
Accept-CH-Lifetime
Viewport-Width – Ширината на дисплея в пиксели
DPR – Device Pixel Ration, индикира съотношението на физическите пиксели на дисплея към логическите в CSS (aka CSS pixel ratio)
Device-Memory* – Приблизителното стойност на оперативна памет на клиента. Примерни стойности: 0.25, 0.5, 1, 4, 8 т.н.
RTT* – Round Trip Time в милисекунди. Тъй като говорим в контекста на протокол от application layer-а, а не стандартния TTL в transport layer-а, стойностите са закръглени до 25-тата милисекунда.
Downlink* – Индикира скоростта на клиента в Mbps (megabits per second), отново закръглена.
ECT* – Effective Connection Time. Валидни стойности: 4g, 3g, 2g и slow-2g.
Save-Data – Специфичен хедър за Android у-ва, които сървъра не може да „изисква“ в първоначалния списък на Accept-CH. Активира Data Saver мерките за минимизиране на трафика. Валидна стойност: On.
Sec-CH-UA – Името на браузъра и major версията му. Примерна стойност: „Google Chrome“; v=“83″.
Sec-CH-UA-Platform – Индикира име на ОС и версията ѝ.
Sec-CH-UA-Arch – Информация за архитектурата на клиента.
Sec-CH-UA-Model – Определя модела на използваното устройство.
Sec-CH-UA-Mobile – Индикира дали response-а (като UX) трябва да е конкретно за мобилни устройства.

Допълнителна информация

Can I Use – Client Hints (DPR, Width, Viewport-Width)
Chrome Platform Status – Client Hints
Mozilla Developer Network – Client Hints
HTTP Client Hints Proposal

* С оглед превенция на fingerprinting, стойностите се закръглят

Redirecting your domain to a new URL on Apache using .htaccess (including SSL/TLS (HTTPS))

Redirecting to a new URL (domain and/or path)

Make sure you’ve got mod_rewrite on and your rewrite base is propertly set:

RewriteEngine On
RewriteBase /

Redirecting a domain

Describe all the domains that you want redirected. In this case we want to redirect both alpha-domain.com and its subdomain www.alpha-domain.com:

RewriteCond %{HTTP_HOST} ^alpha-domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.alpha-domain.com$

And point those requests that match the condition to the new domain by using:

RewriteRule (.*)$ https://beta-domain.com/$1 [R=301,L]

As a summary, this is what we should have in the .htaccess file:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^alpha-domain.com$ [OR]
RewriteCond %{HTTP_HOST} ^www.alpha-domain.com$
RewriteRule (.*)$ https://beta-domain.com/$1 [R=301,L]

Redirecting to secure connection (TLS/SSL (aka HTTPS))

Below is all there’s needed. If you want to ensure the user is always redirected to TLS in addition to a new domain, just omit the first two lines if you already have them in the .htaccess file:

RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS}  !=on 
RewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R,L] 

NB: This one is domain-agnostic, so in the case of redirecting to a new domain, make sure you have redirected the user to the new domain, before sending him on the secure connection.