PHP / HTTP header

HTTP header

Хэрэглэгч таны сайт руу хандахад браузер болон сервер хоорондоо зөвхөн харагдах агуулга төдийгүй нэмэлт мэдээлэл — header — солилцдог. Header нь "агуулгын төрөл юу вэ?", "хэрэглэгчийг аль хуудас руу илгээх вэ?", "энэ хуудсыг хэр удаан кэш хийх вэ?" зэрэг зохицуулалтыг агуулдаг. PHP-д header() функцээр хариуны header-уудыг тохируулдаг — энэ нь мэргэжлийн вэб програм бүтээхэд зайлшгүй шаардлагатай мэдлэг юм.

header() функцийн үндсэн дүрэм

header() нь session ба cookie-тэй адилхан HTML-ийн өмнө дуудагдах ёстой — нэг ч тэмдэгт гаралтгүй байх үед:

php
<?php
// ✅ ЗӨВ — ямар ч гаралтын өмнө
header('Content-Type: application/json');
echo json_encode(['амжилт' => true]);

// ❌ БУРУУ — echo-ийн дараа header дуудаж болохгүй
echo "Сайн уу!";
header('Location: /'); // "headers already sent" алдаа гарна
?>
php
<?php
// ob_start() ашиглан гаралтыг буфер хийж болно
ob_start(); // Гаралтыг хуримтлуулж эхэлнэ

echo "Энэ мөр буферт хадгалагдана";

// Одоо header дуудаж болно
header('Content-Type: text/plain');
ob_end_flush(); // Буферийн агуулгыг гаргана
?>

Чиглүүлэлт — Location header

Хэрэглэгчийг өөр хуудас руу чиглүүлэхэд хамгийн их хэрэглэгддэг header:

php
<?php
// Байнгын чиглүүлэлт (301 — хайгуурын систем хуучин URL-г шинэ рүү шилжүүлнэ)
header('Location: https://www.example.mn/шинэ-хаяг', true, 301);
exit; // header()-ийн дараа exit заавал хэрэглэнэ!

// Түр чиглүүлэлт (302 — анхдагч)
header('Location: /нэвтрэх');
exit;

// Маягт боловсруулсны дараа чиглүүлэх (PRG загвар)
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    // Өгөгдөл хадгалах...
    $_SESSION['амжилт'] = "Амжилттай хадгаллаа!";
    header('Location: /бүтээгдэхүүнүүд');
    exit; // exit-гүй бол кодын үлдсэн хэсэг ажиллана!
}
?>

exit мартах нь нийтлэг алдаа. header('Location: ...') нь браузерт заавар өгдөг — PHP код хэвээр ажиллах тул мэдрэмжтэй үйлдлүүд давтагдаж болзошгүй.

Статус код тохируулах

HTTP статус код нь хариуны утга учрыг тодорхойлдог:

php
<?php
// http_response_code() — статус код тохируулах хамгийн хялбар арга
http_response_code(404);
echo "Хуудас олдсонгүй.";

// Нийтлэг статус кодууд
http_response_code(200); // OK — амжилттай
http_response_code(201); // Created — шинэ нөөц үүссэн
http_response_code(400); // Bad Request — буруу хүсэлт
http_response_code(401); // Unauthorized — нэвтрэх шаардлагатай
http_response_code(403); // Forbidden — хандах эрхгүй
http_response_code(404); // Not Found — олдсонгүй
http_response_code(422); // Unprocessable — баталгаажуулалт бүтэлгүйтсэн
http_response_code(500); // Internal Server Error — серверийн алдаа

// REST API хариу бэлдэх жишээ
function api_хариу(mixed $өгөгдөл, int $статус = 200): never {
    header('Content-Type: application/json; charset=utf-8');
    http_response_code($статус);
    echo json_encode($өгөгдөл, JSON_UNESCAPED_UNICODE);
    exit;
}

// Хэрэглэх жишээ
$id = isset($_GET['id']) ? (int)$_GET['id'] : null;

if ($id === null) {
    api_хариу(['алдаа' => 'id параметр шаардлагатай.'], 400);
}

$хэрэглэгч = null; // Өгөгдлийн сангаас хайсан боловч олдсонгүй гэж үзье

if ($хэрэглэгч === null) {
    api_хариу(['алдаа' => 'Хэрэглэгч олдсонгүй.'], 404);
}
?>

Агуулгын төрөл — Content-Type

Браузерт юу ирж байгааг зааж өгдөг:

php
<?php
// HTML (анхдагч — зааж өгөөгүй ч ийм гэж тооцно)
header('Content-Type: text/html; charset=utf-8');

// JSON — API хариу
header('Content-Type: application/json; charset=utf-8');

// CSV — файл татаж авах
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="тайлан.csv"');
echo "Нэр,И-мэйл,Нас\n";
echo "Болд,bold@example.mn,25\n";
echo "Сарнай,sarnai@example.mn,22\n";
exit;

// PDF татаж авах
header('Content-Type: application/pdf');
header('Content-Disposition: inline; filename="баримт.pdf"');
// PDF агуулгыг гаргана...

// Зураг
header('Content-Type: image/png');
readfile('/зам/зураг.png');
exit;
?>

Кэш удирдах header-ууд

Кэш нь хуудсыг дахин дахин серверээс авахгүйгээр браузерт хадгалдаг. Зөв тохируулах нь хуудасны хурдыг эрс нэмэгдүүлдэг:

php
<?php
// Кэш огт хийхгүй — нэвтрэлтийн хуудас, хувийн мэдээлэл
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Pragma: no-cache');

// 1 цаг кэш хийх
header('Cache-Control: public, max-age=3600');

// ETag — агуулга өөрчлөгдсөн эсэхийг шалгах
$агуулга = "Хуудасны агуулга";
$etag = '"' . md5($агуулга) . '"';
header("ETag: {$etag}");

if (isset($_SERVER['HTTP_IF_NONE_MATCH']) && $_SERVER['HTTP_IF_NONE_MATCH'] === $etag) {
    http_response_code(304); // Not Modified — агуулга өөрчлөгдөөгүй
    exit;
}

echo $агуулга;
?>

CORS header — JavaScript-ийн хил дамнасан хүсэлт

JavaScript front-end өөр домейноос API дуудах үед CORS (Cross-Origin Resource Sharing) header шаардлагатай:

php
<?php
// Бүх домейнд зөвшөөрөх (туршилтад)
header('Access-Control-Allow-Origin: *');

// Зөвхөн тодорхой домейнд
header('Access-Control-Allow-Origin: https://myapp.mn');
header('Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');

// Preflight хүсэлт (OPTIONS)
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
    http_response_code(204);
    exit;
}

header('Content-Type: application/json');
echo json_encode(['мэдэгдэл' => 'CORS зөвшөөрөгдлөө']);
?>

Дараагийн хичээлд:

Бүрэн REST API бүтээх аргыг судална. URL-н замаар нөөц ялгаж, HTTP аргуудыг (GET, POST, PUT, DELETE) зохицуулан, JSON хариу буцаадаг жинхэнэ API хэрэгжүүлнэ.