Як виправити помилку "Заголовки вже надіслані" в PHP


831

Під час запуску мого сценарію я отримую кілька помилок на кшталт цієї:

Попередження: Неможливо змінити інформацію заголовка - заголовки, які вже надіслані ( вихід запущений у /some/file.php:12 ) у /some/file.php у рядку 23

У рядках, зазначених у повідомленнях про помилки, містяться header()та setcookie()дзвінки.

Що може бути причиною цього? І як це виправити?



Переконайтеся, що жодного тексту не виводиться ( ob_startі тут ob_end_clean() може виявитися корисним). Потім ви можете встановити файл cookie або сеанс, рівний, ob_get_contents()а потім використовувати ob_end_clean()для очищення буфера.
Джек Так

Використовуйте safeRedirectфункцію в моїй бібліотеці PHP: github.com/heinkasner/PHP-Library/blob/master/extra.php
heinkasner

5
~~~~~~~~~~ Ваш файл НЕ UTF-8UTF-8 (Without BOM)
БУДЬ

Відповіді:


2997

Немає результатів перед надсиланням заголовків!

Функції, що надсилають / змінюють заголовки HTTP, потрібно викликати перед тим, як буде зроблено будь-який вихід . summary ⇊ Інакше виклик не вдасться:

Попередження: Неможливо змінити інформацію заголовка - заголовки вже надіслані (вихід запущений у скрипті: рядок )

Деякі функції, що змінюють заголовок HTTP:

Вихід може бути:

  • Ненавмисне:

    • Пробіл до <?phpабо після?>
    • UTF-8 Байт Марк спеціально
    • Попередні повідомлення про помилки або повідомлення
  • Навмисний:

    • print, echoІ інші функції отримання вихідних
    • <html>Попередній <?phpкод необроблених розділів .

Чому це відбувається?

Щоб зрозуміти, чому заголовки повинні бути надіслані перед виходом, необхідно переглянути типовий HTTP- відповідь. PHP-скрипти в основному генерують вміст HTML, але також передають набір заголовків HTTP / CGI веб-серверу:

HTTP/1.1 200 OK
Powered-By: PHP/5.3.7
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8

<html><head><title>PHP page output page</title></head>
<body><h1>Content</h1> <p>Some more output follows...</p>
and <a href="/"> <img src=internal-icon-delayed> </a>

Сторінка / вихід завжди слід заголовки. PHP спочатку повинен передати заголовки веб-серверу. Це можна зробити лише один раз. Після подвійної лінії розриву вона більше не може їх змінювати.

Коли PHP отримує перший вихід ( print, echo, <html>) він буде змивати всі зібрані заголовки. Після цього він може надіслати всі потрібні результати. Але надсилати подальші заголовки HTTP неможливо.

Як можна дізнатися, де відбувся передчасний вихід?

header()Попередження містить всю необхідну інформацію , щоб знайти причину проблеми:

Попередження: Неможливо змінити інформацію заголовка - заголовки вже надіслані (вихід розпочато з / www / usr2345 / htdocs / auth.php: 52 ) у /www/usr2345/htdocs/index.php у рядку 100

Тут "рядок 100" посилається на сценарій, де header() виклик не вдався.

Примітка " Вихід, розпочатий з " в круглих дужках є більш значущою. Він позначає джерело попереднього виходу. У цьому прикладі це auth.php і лінія52 . Ось де вам довелося шукати передчасний вихід.

Типові причини:

  1. Друк, відлуння

    Навмисний вихід із операторів printта echoоператорів скасує можливість надсилати заголовки HTTP. Щоб уникнути цього, потік додатків повинен бути реструктурований. Використовуйте функції та схеми шаблонів. Переконайтеся, що header()дзвінки відбуваються до того, як повідомлення будуть виписані.

    Функції, що створюють вихід, включають

    • print, echo, printf,vprintf
    • trigger_error, ob_flush, ob_end_flush, var_dump,print_r
    • readfile, passthru, flush, imagepng,imagejpeg


    серед інших та визначених користувачем функцій.

  2. Сирі області HTML

    Нерозділені розділи HTML у .phpфайлі також є прямим висновком. Умови сценарію, які викликають header()виклик, повинні бути відмічені перед будь-якими необробленими <html>блоками.

    <!DOCTYPE html>
    <?php
        // Too late for headers already.

    Використовуйте схему шаблонів, щоб відокремити обробку від вихідної логіки.

    • Розмістіть форму обробки коду на вершинах сценаріїв.
    • Використовуйте тимчасові змінні рядків для відстрочки повідомлень.
    • Фактична логіка виводу та змішаний вихід HTML повинні дотримуватися останніх.

  3. Пробіли раніше <?phpдля попереджень "script.php рядок 1 "

    Якщо попередження стосується виводу в рядку 1, то це, головним чином, провідна пробіл , текст або HTML перед початковим <?phpмаркером.

     <?php
    # There's a SINGLE space/newline before <? - Which already seals it.

    Аналогічно це може статися для доданих сценаріїв або розділів скриптів:

    ?>
    
    <?php

    PHP фактично з'їдає один рядок рядків після закритих тегів. Але це не компенсує кілька нових рядків або вкладок або пробілів, зміщених у такі прогалини.

  4. UTF-8 BOM

    Проблеми можуть бути лише переривами рядків та пробілами. Але є також "невидимі" послідовності символів, які можуть викликати це. Найвідоміше UTF-8 BOM (Byte-Order-Mark), який не відображається більшістю текстових редакторів. Це послідовність байтів EF BB BF, яка є необов'язковою та надмірною для документів, що кодуються UTF-8. Однак PHP має сприймати це як вихідний вихід. Він може відображатися як символи у висновку (якщо клієнт інтерпретує документ як латинське-1) або подібний "сміття".

    Зокрема, графічні редактори та IDE на базі Java не враховують його наявність. Вони не візуалізують його (зобов'язаний стандартом Unicode). Однак більшість редакторів і консольних програм:

    редактор джойсів, що показує запасник BOM UTF-8, а редактор MC крапка

    Там легко розпізнати проблему на початку. Інші редактори можуть визначити його присутність у меню файлів / налаштувань (Блокнот ++ у Windows може визначити та усунути проблему ). Інший варіант перевірки присутності BOM - це звернення до гексексидатора . У системах * nix hexdumpзазвичай доступний, якщо не графічний варіант, який спрощує аудит цих та інших питань:

    Бекс-гексидатор, який показує utf-8 bom

    Просте виправлення - встановити текстовий редактор для збереження файлів як "UTF-8 (без BOM)" або подібної номенклатури. Часто новачки в іншому випадку вдаються до створення нових файлів і просто копіюють і вставляють попередній код назад.

    Корекційні утиліти

    Існують також автоматизовані інструменти для вивчення та переписування текстових файлів ( sed/awk або recode). Спеціально для PHP є phptagsтег tidier . Він переписує тісні та відкриті теги у довгі та короткі форми, але також легко виправляє провідні та кінцеві пробіли, проблеми Unicode та UTF-x BOM:

    phptags  --whitespace  *.php

    Це розумно використовувати в цілому, включаючи каталог або проект.

  5. Пробіл після ?>

    Якщо джерело помилок згадується як за закриттям,?> то тут виписано деякий пробіл або неочищений текст. Кінцевий маркер PHP не припиняє виконання сценарію в цей момент. Будь-які текстові / пробільні символи після нього будуть записані як вміст сторінки.

    Зазвичай рекомендується, зокрема, новачкам, що слід відмовитись від ?>закритих тегів PHP. Це уникає невеликої частини цих випадків. ( include()dВинуватцем часто є сценарії.)

  6. Джерело помилок, зазначене як "Невідомо в рядку 0"

    Зазвичай це розширення PHP або php.ini, якщо джерело помилок не конкретизоване.

    • Іноді це gzipналаштування кодування потоку абоob_gzhandler .
    • Але це також може бути будь-який подвійно завантажений extension=модуль, що генерує неявне повідомлення про запуск / попередження PHP.

  7. Попередні повідомлення про помилки

    Якщо інша заява або вираз PHP викликає роздрукування попереджувального повідомлення або повідомлення, це також зараховується як передчасний вихід.

    У цьому випадку вам потрібно усунути помилку, затримати виконання оператора або придушити повідомлення, наприклад, isset()або @()- коли жодна з них не перешкоджає налагодженню згодом.

Немає повідомлення про помилку

Якщо у вас є error_reportingабо display_errorsвимкнено функцію php.ini, тоді жодне попередження не з’явиться. Але ігнорування помилок не призведе до усунення проблеми. Заголовок досі не може бути надісланий після передчасного виведення.

Тож, коли header("Location: ...")переадресація мовчки виходить з ладу, дуже доцільно перевірити попередження. Повторіть їх за допомогою двох простих команд на скрипті виклику:

error_reporting(E_ALL);
ini_set("display_errors", 1);

Або set_error_handler("var_dump");якщо все інше не вдається.

Говорячи про заголовки переадресації, вам часто слід використовувати подібну ідіому для кінцевих кодових шляхів:

exit(header("Location: /finished.html"));

Переважно навіть функція утиліти, яка друкує повідомлення користувача у разі header()відмов.

Буферування на виході як вирішення

Буферування вихідних PHP є вирішенням для усунення цієї проблеми. Він часто працює надійно, але не повинен замінювати правильну структуру програми та відокремлення результатів від логіки управління. Її фактична мета - мінімізація часто перенесених передач на веб-сервер.

  1. output_buffering= Параметр , проте може допомогти. Налаштуйте його в php.ini або через .htaccess або навіть .user.ini на сучасних настройках FPM / FastCGI.
    Включення дозволить PHP завантажувати вихід, а не миттєво передавати його веб-серверу. Таким чином, PHP може агрегувати заголовки HTTP.

  2. Це також може бути пов'язано із закликом ob_start(); зверху до сценарію виклику. Однак це є менш надійним з кількох причин:

    • Навіть якщо <?php ob_start(); ?>запускається перший сценарій, пробіли або BOM можуть раніше переміщуватися, що робить його неефективним .

    • Він може приховати пробіли для виводу HTML. Але як тільки логіка програми намагається надсилати бінарний вміст (наприклад, створене зображення), буферизований сторонній вихід стає проблемою. ( ob_clean() Потрібна як більш повна проблема.)

    • Буфер має обмежений розмір і може легко перевищуватися, якщо залишити його за замовчуванням. І це теж не рідкісна поява, яку важко відстежити, коли це трапиться.

Тому обидва підходи можуть стати ненадійними - зокрема при переключенні між налаштуваннями розробки та / або виробничими серверами. Ось чому буферизація вихідних даних вважається просто милицею / суворо вирішується.

Дивіться також основний приклад використання в посібнику та додаткові плюси та мінуси:

Але це працювало на іншому сервері !?

Якщо раніше ви не отримували попередження заголовків, то налаштування вихідної буферизації php.ini змінилося. Ймовірно, не налаштовано на поточному / новому сервері.

Перевірка с headers_sent()

Ви завжди можете використовувати headers_sent()зонд, якщо все-таки можливо ... надсилати заголовки. Що корисно умовно надрукувати інформацію або застосувати іншу логіку резервного використання.

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}

Корисними шляхами резервного вирішення є:

  • <meta>Тег HTML

    Якщо ваш додаток структурно важко виправити, то простим (але дещо непрофесійним) способом дозволити переадресацію є введення <meta>тегу HTML . Перенаправлення можна досягти за допомогою:

     <meta http-equiv="Location" content="http://example.com/">

    Або з короткою затримкою:

     <meta http-equiv="Refresh" content="2; url=../target.html">

    Це призводить до недійсного HTML при використанні минулого <head>розділу. Більшість браузерів все ще приймають це.

  • Переспрямування JavaScript

    Як альтернатива, переадресація JavaScript може використовуватися для переспрямувань сторінки:

     <script> location.replace("target.html"); </script>

    Хоча це часто більш сумісне з HTML, ніж <meta>обхідне рішення, воно покладається на клієнтів, що підтримують JavaScript.

Обидва підходи, однак, роблять прийнятні резервні помилки, коли справжні дзвінки HTTP-заголовка () не вдається. В ідеалі ви завжди поєднуєте це із зручним для користувача повідомленням та посиланням, яке можна натиснути, як останню інстанцію. (Що, наприклад, робить розширення PECL http_redirect () .)

Чому setcookie()і session_start()теж впливають

І те setcookie()й session_start()інше потрібно надіслати Set-Cookie:заголовок HTTP. Тому застосовуються ті самі умови, і подібні повідомлення про помилки будуть генеруватися для передчасних вихідних ситуацій.

(Звичайно, на них також впливають відключені файли cookie у браузері або навіть проблеми з проксі-серверами. Функціонал сеансу, очевидно, також залежить від вільного місця на диску та інших параметрів php.ini тощо).

Подальші посилання


Також звичайний notepad.exe є складним. Я використовую NetBeans зазвичай, що не додає BOM, навіть якщо файл закодований таким чином. Пізніше редагування файлу в блокноті змінює речі, особливо щодо IIS як веб-сервера. Схоже, апаш відкидає (підрозділ додається) БОМ.
Тесон

4
Видалення закриття ?>з кінця файлів PHP зазвичай є хорошою практикою, яка також допомагає мінімізувати ці помилки. Небажаний пробіл не з’явиться в кінці файлів, і ви все одно зможете пізніше додати заголовки до відповіді. Це також зручно, якщо ви використовуєте вихідний буфер, і не хотілося б бачити додані небажані пробіли в кінці частин, що генеруються включеними файлами.
Микита 웃

Дивна річ, я перемістив свій файл з хостингу cPanel Linux на VPS. Перед тим, як він працював належним чином, але тут він показав цю помилку (у мене був заголовок html-коду перед заголовком). Чому?
Пабло Ескобар

@Purushotamrawat Ви читали частину про " Але це працювало на іншому сервері !? "
mario

1
@PeterSMcIntyre BT UTF8, імовірно, (виправити це) / не включено вихідну буферизацію (не покладайтеся на це).
Маріо

199

Це повідомлення про помилку спрацьовує, коли щось надсилається перед відправкою заголовків HTTP (з setcookieабо header). Загальні причини виведення чого-небудь перед заголовками HTTP:

  • Випадкові пробіли, часто на початку або в кінці файлів, наприклад:

     <?php
    // Note the space before "<?php"
    ?>

       Щоб цього уникнути, просто не залишайте закриття ?>- це все одно не потрібно.

  • Порядок байтів позначає на початку файлу php. Вивчіть свої файли php за допомогою шестигранного редактора, щоб дізнатись, чи так це. Вони повинні починатися з байтів 3F 3C. Ви можете безпечно видалити BOM EF BB BFз початку файлів.
  • Явний вихід, такі як заклики echo, printf, readfile, passthru, код перед тим і <?т.д.
  • Якщо встановлено display_errorsвластивість php.ini, надсилається попередження, яке надає php . Замість помилки програміста помилка, php мовчки виправляє помилку і видає попередження. Хоча ви можете змінити конфігурації display_errorsабо error_reporting , вам слід скоріше усунути проблему.
    Поширеними причинами є доступ до невизначених елементів масиву (наприклад, $_POST['input']без використання emptyчи issetперевірки, чи встановлений вхід), або використання невизначеної константи замість літерального рядка (як у $_POST[input]примітці, пропустіть лапки).

Увімкнення буферизації виходу повинно усунути проблему; весь вихід після дзвінка до ob_startбуферизований в пам'яті, поки ви не відпустите буфер, наприклад, з ob_end_flush.

Однак, поки буферизація вихідних даних уникає проблем, ви дійсно повинні визначити, чому ваша програма виводить тіло HTTP перед заголовком HTTP. Це було б як подзвонити по телефону та обговорити свій день та погоду, перш ніж сказати абоненту, що він має неправильний номер.


його допомога мені дякую
Vishwa Pratap

122

Я раніше отримував цю помилку багато разів, і я впевнений, що всі програмісти PHP отримали цю помилку хоча б раз.

Можливе рішення 1

Ця помилка могла бути викликана порожніми пробілами до початку файлу або після закінчення файлу. Ці порожні пробіли тут не повинні бути.

ЕКС) ТУТ БУДЬ НЕ БУДЬ ТЕХНІЙ ПРОСТОР ТУТ

   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE

Перевірте всі файли, пов’язані з файлом, який викликає цю помилку.

Примітка. Іноді EDITOR (IDE) на зразок gedit (редактор Linux за замовчуванням) додає один файл у файл збереження. Цього не повинно статися. Якщо ви використовуєте Linux. ви можете використовувати VI-редактор для видалення пробілів / рядків після?> в кінці сторінки.

Можливе рішення 2: Якщо це не ваш випадок, тоді використовуйте ob_start для виведення буферизації:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

Це активує буферизацію вихідних даних, і ваші заголовки будуть створені після завантаження сторінки.


18
ob_start()просто приховує проблему; не використовуйте його для вирішення цієї конкретної проблеми.
Ja͢ck

@ Ja͢ck Якщо я цього не використовую ob_start(), то що мені робити для вирішення цієї проблеми:Headers already sent
Shafizadeh

@Sajad, якщо ви отримуєте помилку спеціально через редактора, який ви використовуєте, вам слід попрямувати з налаштуваннями, щоб перестати викликати проблему або переключити редактори. Якщо ви отримуєте помилку з будь-якої іншої причини, вам слід прочитати відповіді в цьому запитанні (конкретно прийняту відповідь), щоб з’ясувати, що проблема насправді, і вирішити її.
Samsquanch

3
ob_start()не "приховує" проблему, вона вирішує проблему.
TMS

1
У мене виникла така проблема, коли я завантажував свої файли на сервер, який підтримував навіть PHP5.3 Використовувати сервер з PHP 5.6 або більше
GGSoft

86

Замість нижнього рядка

//header("Location:".ADMIN_URL."/index.php");

писати

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

або

?><script><?php echo("location.href = '".ADMIN_URL."/index.php?msg=$msg';");?></script><?php

Це обов'язково вирішить вашу проблему. Я зіткнувся з тією ж проблемою, але вирішив, записавши розташування заголовка вище.


41

Ти робиш

printf ("Hi %s,</br />", $name);

перед встановленням файлів cookie, що заборонено. Ви не можете надіслати жодний вихід перед заголовками, навіть порожнім рядком.


32

Саме через цей рядок:

printf ("Hi %s,</br />", $name);

Не слід надрукувати / повторювати нічого перед тим, як надсилати заголовки.


31

ОБЩІ ПРОБЛЕМИ:

(скопійовано з: джерела )

=====================

1)echo.. перед header(.......);командою не повинно бути жодного виводу (тобто або HTML-кодів) .

2) видаліть пробіл (або новий рядок ) до <?phpта після ?>тегів.

3) ЗОЛОТЕ ПРАВИЛО! - перевірте, чи у цьому файлі php (а також у includeінших файлах) UTF8 без кодування BOM (а не лише UTF-8 ). У багатьох випадках це проблема (адже у закодованому файлом UTF8 файл має особливий характер на початку файлу php, який не показує ваш текстовий редактор) !!!!!!!!!!!

4) Після header(...);того, як ви повинні використовуватиexit;

5) завжди використовуйте посилання 301 або 302:

header("location: http://example.com",  true,  301 );  exit;

6) Увімкніть повідомлення про помилки та знайдіть помилку. Ваша помилка може бути викликана функцією, яка не працює. Коли ви вмикаєте повідомлення про помилки, завжди слід спочатку виправити помилку. Наприклад, це може бути "Попередження: date_default_timezone_get (): Не безпечно покладатися на налаштування часового поясу системи." - тоді далі вниз ви можете побачити помилку "заголовки не надіслані". Виправивши помилку верхньої (першої) сторінки, завантажте свою сторінку знову. Якщо у вас все ще є помилки, то знову виправте найбільшу помилку.

7) Якщо жодне з перерахованих вище не допомагає, використання перенаправлення JAVSCRIPT (однак, настійно нерекомендований метод) може бути останнім шансом у користувацьких випадках ...:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

Чому явно налаштовано 301чи 302важливо?
Яніс Елмеріс

26

Проста порада: простий пробіл (або невидимий спеціальний знак) у вашому сценарії, безпосередньо перед першим <?phpтегом, може спричинити це! Особливо, коли ви працюєте в команді, і хтось використовує "слабкий" IDE або заблукав у файлах з дивними текстовими редакторами.

Я бачив ці речі;)


22

Ще одна погана практика може викликати цю проблему, яка ще не заявлена.

Дивіться цей фрагмент коду:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

Все гаразд, правда?

Що робити, якщо "a_important_file.php" це:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------

Це не вийде? Чому? Тому що вже створюється новий рядок.

Тепер, хоча це не є загальним сценарієм, що робити, якщо ви використовуєте рамку MVC, яка завантажує багато файлів перед передачею речей на ваш контролер? Це не рідкісний сценарій. Будьте готові до цього.

З PSR-2 2.2:


  • Усі файли PHP ПОВИНЕН використовувати Unix LF (linefeed) line ending.
  • Усі файли PHP ОБОВ'ЯЗКОВО закінчуються символом a single blank line.
  • Тег закриття?> ОБОВ'ЯЗКОВО має бути omittedз файлів, що містятьonly php

Повірте, дотримання цих стандартів може врятувати вам багато годин від вашого життя :)


2
Відповідно до кількох стандартів (наприклад, Zend), ви ні ?>в якому разі не повинні ставити закриваючий тег у жоден файл
Daniel W.

Я не можу відтворити це в середовищі Windows, оскільки воно працює за допомогою будь-якої комбінації (додавання закриваючих тегів, пробілів, натискання клавіші введення тощо). Схоже, ця проблема трапляється здебільшого в Linux.
Молодший Мейхе

@JuniorM Це має бути відтвореним. Чи можете ви поділитися кодом, який ви експериментували в суті або щось подібне?
д.м.н. Сахіб Бін Махбоб

Я в Windows 7, з останнім встановленим Wamp. Я думаю, що ця помилка пов'язана з прихованими символами для кінця рядка. Проблема була причиною мого Wordpress 'shortcodes.php. Я додав до цього файлу просту функцію, і вона почала запускати цю помилку "надіслані заголовки". Я порівняв свій shortcodes.php з wordpress ', і це було нормально, за винятком CR LF(типовий кінець рядка для Windows). Я вирішую це, завантажуючи оригінальний файл LFзамість Wordpress repo, який має (Linux-кінець рядка), CR LFі я також перемістив свою функцію на тему function.php. За матеріалами: bit.ly/1Gh6mzN
Junior Mayhé

@Sahib, зауважте, що досі я не можу відтворити те, що сказано у цій відповіді. Відповідь цілком чудова для середовища Linux. Я перевірив такі речі, як порожнє між ?> <?php, видалення та додавання єдиного порожнього рядка, доданого та пропущеного закривального тегу ?>. У Windows + Wamp всі ці комбінації працюють чудово. Wierd ...
Молодший Мейхе

15

Іноді, коли у процесі розробки є робочі станції WIN та системи LINUX (хостинг), і в коді ви не бачите жодного виводу перед відповідним рядком, це може бути форматування файлу та відсутність закінчення рядка Unix LF (linefeed) .

Що ми зазвичай робимо для того, щоб швидко виправити це, - перейменувати файл і в системі LINUX створити новий файл замість перейменованого, а потім скопіювати вміст у нього. Багато разів це вирішує проблему, оскільки деякі файли, створені в WIN одного разу, переміщені на хостинг, викликають цю проблему.

Це виправлення - це легке виправлення сайтів, якими ми управляємо через FTP, а іноді може заощадити наших нових членів команди деякий час.


2

Зазвичай ця помилка виникає, коли ми надсилаємо заголовок після відлуння або друку. Якщо ця помилка виникає на певній сторінці, тоді переконайтеся, що ця сторінка нічого не лунає перед тим, як звертатись до неї start_session().

Приклад непередбачуваної помилки:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

Ще один приклад:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Висновок: Не виводити жодного символу перед викликом session_start()або header()функціонувати навіть без пробілу чи нової лінії

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.