Mastering PHP Headers Part-1: Introduction to PHP Headers

Introduction to PHP Headers

ওয়েব ডেভেলপমেন্টের ক্ষেত্রে, ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ Hypertext Transfer Protocol (HTTP) দ্বারা ডিফাইন করা রুলস এর একটি সেট দ্বারা পরিচালিত হয়। এই যোগাযোগের কেন্দ্রবিন্দুতে রয়েছে HTTP headers, যা খুবই critical components যা কীভাবে ডেটা স্থানান্তর, প্রক্রিয়াকরণ এবং উপস্থাপন করা হয় তার একটি শেপ বা আকার দেয়। headers গুলি বোঝা এবং ম্যানিপুলেট করা ডেভেলপারদের কর্মক্ষমতা অপ্টিমাইজ করতে, নিরাপত্তা বাড়াতে এবং তাদের ওয়েব অ্যাপ্লিকেশনের আচরণ কাস্টমাইজ করার জন্য প্রয়োজনীয় হয়ে ওঠে।

Overview of HTTP

HTTP, বা Hypertext Transfer Protocol, World Wide Web এ data communication এর ভিত্তি। এটি একটি application layer protocol যা hypermedia document গুলোকে স্থানান্তর করতে দেয়, যেমন HTML. HTTP হল ইন্টারনেটের মাধ্যমে hypertext transmitting এর জন্য ব্যবহৃত প্রোটোকল। এখানে HTTP এর একটি ওভারভিউ দেওয়া হলো:

  • ১. Client-Server Model:
  • HTTP একটি client-server model অনুসরণ করে, যেখানে ক্লায়েন্টরা (যেমন, ওয়েব ব্রাউজার) resources এর জন্য request করে এবং সার্ভারগুলি (যেমন, ওয়েব সার্ভার) সেই resources গুলি প্রদান করে।

  • ২. Stateless Protocol:
  • HTTP হল একটি stateless protocol, যার অর্থ হল একটি ক্লায়েন্ট থেকে সার্ভারে প্রতিটি request স্বাধীন এবং পূর্ববর্তী request গুলির সাথে সম্পর্কহীন। সার্ভার দুটি রিকোয়েস্টের মধ্যে ক্লায়েন্ট সম্পর্কে কোনো তথ্য ধরে রাখে না।

  • ৩. Connectionless:
  • ক্লায়েন্ট থেকে প্রতিটি রিকোয়েস্ট স্বাধীনভাবে প্রসেস করা হয়, এবং সার্ভার থেকে রেসপন্স পাঠানোর পরে কানেকশন ক্লোজ করে দেওয়া হয়। এটি ক্লায়েন্ট এবং সার্ভার উভয়ের ওভারহেডকে হ্রাস করে।

  • ৪. Methods (Verbs):
  • HTTP বেশ কয়েকটি request method গুলোকে কে সংজ্ঞায়িত করে (যা verbs নামেও পরিচিত) যা একটি ডেটা কি কাজে ব্যবহৃত হবে তা নির্দেশ করে। সাধারণ রিকোয়েস্ট মেথড গুলোর মধ্যে রয়েছে:

    • GET: ডেটা কে Retrieve করার জন্য ব্যবহৃত হয়।
    • POST: ডেটাকে প্রসেস করার জন্য সাবমিটের কাজে ব্যবহৃত হয় ।
    • PUT: ডেটা আপডেট বা তৈরি করার জন্য ব্যবহৃত হয়।
    • DELETE: ডেটাকে ডিলেটের জন্য ব্যবহৃত হয়।
  • ৫. Status Codes:
  • HTTP response গুলিতে status code গুলোকে অন্তর্ভুক্ত থাকে যা রিকোয়েস্টের রেজাল্ট নির্দেশ করে। Common status code গুলোর মধ্যে নিম্নলিখিত কোডগুলো বহুল ব্যবহৃত :

    • 200 OK: অনুরোধটি সফল হয়েছে।
    • 404 Not Found: অনুরোধ করা সংস্থান পাওয়া যায়নি।
    • 500 Internal Server Error: সার্ভার একটি ত্রুটির সম্মুখীন হয়েছে৷

    এছাড়াও আরো বহু এইরকম Status Code গুলো রয়েছে। আপনি উইকিপেডিয়া বা মজিলা তে বিস্তারিত পাবেন।

  • ৬. Headers:
  • HTTP হেডার request বা response সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। তারা content type, content length এবং caching instructions এর মত বিবরণ অন্তর্ভুক্ত করে।

  • ৭. URL (Uniform Resource Locator):
  • ওয়েবে Resources গুলো URLs দ্বারা চিহ্নিত করা হয়। একটি URL ব্যবহার করা প্রোটোকল নির্দিষ্ট করে (যেমন, HTTP), server’s address, এবং সার্ভারের resource’s location.

  • ৮. HTTP Versions:
  • HTTP protocol এর বিভিন্ন versions রয়েছে, যার মধ্যে HTTP/1.1 সর্বাধিক ব্যবহৃত একটি। HTTP/2 এবং HTTP/3 performance, security, এবং efficiency উন্নত করার জন্য তৈরি করা হয়েছে।

  • ৯. Security:
  • যখন HTTP প্লেইন টেক্সটে ডেটা প্রেরণ করে, HTTPS (HTTP Secure) ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগ সুরক্ষিত করতে এনক্রিপশন (সাধারণত TLS বা SSL) ব্যবহার করে।

  • ১০. Cookies and Sessions:
  • HTTP একাধিক রিকোয়েস্ট জুড়ে অবস্থা বজায় রাখতে কুকিজ ব্যবহার সমর্থন করে। কুকি হল client’s side এ সংরক্ষিত ডেটার ছোট অংশ।

Basics of HTTP headers

HTTP headers গুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে পাঠানো রিকোয়েস্ট বা রেসপন্স সম্পর্কে অতিরিক্ত তথ্য প্রদান করে। তারা content type, length, caching directives এবং আরও অনেক কিছুর মতো গুরুত্বপূর্ণ বিশদ প্রকাশ করে। এখানে কিছু সাধারণ HTTP headers গুলির একটি ওভারভিউ রয়েছে:

  • ১. Content-Type:
  • এটি রিসৌর্স গুলোর media type নির্দিষ্ট করে। যেমন, HTML ফাইলের জন্য “text/html”, JSON ডেটার জন্য “application/json” ইত্যাদি।

  • ২. Content-Length:
  • অক্টেটে (8-বিট বাইট) response body এর size নির্দেশ করে।

  • ৩. Cache-Control:
  • কিভাবে ক্যাশিং করা উচিত তা নির্দেশ করে। এতে “no-cache,” “max-age” এবং “public” এর মতো নির্দেশ অন্তর্ভুক্ত থাকতে পারে।

  • ৪. Location:
  • redirections এ ব্যবহৃত হয় বা যখন একটি নতুন resource তৈরি করা হয়। এতে নতুন রিসোর্সের URL রয়েছে।

  • ৫. User-Agent:
  • রিকোয়েস্ট করা user agent (যেমন, browser বা device) সনাক্ত করতে ব্যবহৃত হয় ।

  • ৬. Server:
  • সার্ভার সফ্টওয়্যার সম্পর্কে তথ্য প্রদান করে।

  • ৭. Set-Cookie:
  • সার্ভার থেকে ক্লায়েন্টে কুকি পাঠাতে ব্যবহৃত হয়। এতে cookie name, value, expiration এবং অন্যান্য attributes এর মতো তথ্য অন্তর্ভুক্ত থাকে।

The role of headers in web development

ওয়েব ডেভেলপমেন্টে একটি গুরুত্বপূর্ণ ভূমিকা পালন করে Headers. যা ক্লায়েন্ট (যেমন, ওয়েব ব্রাউজার) এবং সার্ভারের মধ্যে যোগাযোগ সহজতর করে । তারা metadata এবং instructions প্রদান করে যা কীভাবে content process, deliver এবং display হয় তা নির্ধারণ করতে সাহায্য করে। এখানে ওয়েব ডেভেলপমেন্টে হেডারের কিছু key roles নিয়ে আলোচনা করা হলো:

  • ১. Content Negotiation:
  • Header গুলো, যেমন Accept header, ক্লায়েন্টদের তাদের পছন্দের content types, languages এবং character sets এর সাথে যোগাযোগ করার সুযোগ দেয়। সার্ভারগুলি ক্লায়েন্টের পছন্দগুলির সাথে সবচেয়ে ভাল মেলে এমন content দিয়ে রেসপন্স জানাতে পারে।

  • ২. Data Format Specification:
  • Content-Type header টি sent বা received করা ডেটার format নির্দিষ্ট করতে ব্যবহৃত হয়। উদাহরণস্বরূপ, এটি নির্দেশ করতে পারে যে content টি HTML, JSON, XML বা অন্য ফর্ম্যাটে রয়েছে৷

  • ৩. Caching Control:
  • Cache-Control এর মাধ্যমে, Expires, Last-Modified, এবং ETag -এর মতো হেডারগুলো caching behavior control করতে সাহায্য করে। তারা কখন এবং কিভাবে content cache করতে হবে, কর্মক্ষমতা উন্নত করতে এবং সার্ভারের লোড কমাতে ব্রাউজার বা মধ্যবর্তী cache কে নির্দেশ দেয়।

  • ৪. Security Policies:
  • Content-Security-Policy এবং Strict-Transport-Security এর মতো Headers গুলি client side এ security policies গুলি প্রয়োগ করতে সাহায্য করে, cross-site scripting (XSS) এর মতো ঝুঁকিগুলি হ্রাস করে এবং secure connections নিশ্চিত করে৷

  • ৫. Authentication and Authorization:
  • Authorization এর মতো Headers গুলি authentication এর উদ্দেশ্যে credential গুলো প্রেরণ করতে ব্যবহৃত হয়। উপরন্তু, বিভিন্ন headers (যেমন, WWW-Authenticate, Allow, Access-Control-Allow-Origin) resource গুলোর অ্যাক্সেস নিয়ন্ত্রণে ভূমিকা পালন করে।

  • ৬. Redirection:
  • একটি রিসোর্সের নতুন অবস্থান সম্পর্কে ক্লায়েন্টকে জানাতে অর্থাৎ HTTP redirects এর জন্য Location এর মতো Headers ব্যবহার করা হয়। URL redirections বাস্তবায়নের জন্য এটি অপরিহার্য।

  • ৭. Compression:
  • Content-Encoding এবং Accept-Encoding-এর মতো হেডারগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে content compression এর জন্য, data transfer size হ্রাস করতে এবং performance উন্নত করতে ব্যবহার করা হয়।

  • ৮. Browser Rendering Control:
  • X-Frame-Options এবং Content-Disposition-এর মত Header গুলি একটি পেজ কীভাবে ফ্রেম করা উচিত বা ব্রাউজার দ্বারা ডাউনলোডযোগ্য কনটেন্ট কীভাবে পরিচালনা করা উচিত তা নিয়ন্ত্রণ করে।

  • ৯. Cross-Origin Resource Sharing (CORS):
  • Access-Control-Allow-Origin এবং Origin এর মতো হেডারগুলি বিভিন্ন অরিজিন জুড়ে resources গুলিতে অ্যাক্সেস নিয়ন্ত্রণ করার জন্য, cross-origin request গুলিকে enabling বা restricting করার জন্য গুরুত্বপূর্ণ।

  • ১০. Session Management:
  • Set-Cookie এবং Cookie এর মতো হেডারগুলি ক্লায়েন্ট এবং সার্ভারের মধ্যে সেশনের তথ্য পরিচালনার সাথে জড়িত। কুকি গুলো, বিশেষ করে, প্রায়ই session tracking এবং user authentication এর জন্য ব্যবহৃত হয়।

সংক্ষেপে, web requests এবং responses গুলির আচরণ গঠনের জন্য header গুলি অপরিহার্য। তারা ক্লায়েন্ট এবং সার্ভারদের জন্য data transfer process এর বিভিন্ন দিক যোগাযোগের জন্য একটি standardized way প্রদান করে, ওয়েব ডেভেলপমেন্টে compatibility, security এবং efficient resource delivery নিশ্চিত করে।

PHP তে কিভাবে header গুলো সেট করা হয়?

PHP তে, header() ফাংশন ব্যবহার করে header গুলো সেট করা হয়। এই ফাংশন ব্রাউজারে একটি raw HTTP header পাঠায়। এটি লক্ষ করা উচিত যে ব্রাউজারে কোনও actual output পাঠানোর আগে header() ফাংশনটি অবশ্যই কল করা উচিত। এর মানে হল যে এটি স্ক্রিপ্টের শুরুতে, যেকোনো HTML tags, whitespace বা অন্যান্য content এর পূর্বে স্থাপন করা উচিত।

এখানে header() ফাংশনের basic syntax দেওয়া হলো:

header(string $header, bool $replace = true, int $http_response_code = null);
  • $header: header string পাঠানোর জন্য। এটি header name এবং value সহ একটি সম্পূর্ণ HTTP header line হওয়া উচিত।
  • $replace: এটি একটি boolean parameter নির্দেশ করে যে একই নামের পূর্ববর্তী header গুলো replace করা হবে কিনা। true (ডিফল্ট) হিসাবে সেট করা হলে, নতুন header টি আগেরটি প্রতিস্থাপন করবে। false সেট করা থাকলে, একই নামের সাথে বিদ্যমান header গুলিতে নতুন header যোগ করা হবে।
  • $http_response_code: header সহ পাঠানোর জন্য একটি optional HTTP response code যদি নির্দিষ্ট না করা হয়, পূর্বে সেট করা বা default status code ব্যবহার করা হবে।

এখানে PHP-তে header গুলো সেট করার কিছু common use cases রয়েছে:

১. Setting Content Type:

header('Content-Type: text/html');

২. Redirecting to Another Page:

header('Location: http://example.com/new-page.php');
exit; // It's important to exit to prevent further script execution

৩. Controlling Caching::

header('Cache-Control: no-cache, no-store, must-revalidate');
header('Expires: ' . gmdate('D, d M Y H:i:s', time() - 3600) . ' GMT');

৪. Setting Custom Headers:

header('X-Custom-Header: Hello from PHP!');

header গুলো সেট করার পরে exit বা die ফাংশন ব্যবহার করতে হয়। যাতে আর কোনো পিএইচপি স্ক্রিপ্ট এক্সিকিউশন না হয় । content ইতিমধ্যে ব্রাউজারে পাঠানোর পরে header গুলো modify করার চেষ্টা করার ফলে unexpected behavior বা errors গুলো প্রতিরোধ করার জন্য এটি গুরুত্বপূর্ণ।

PHP তে header গুলো ম্যানেজ করার জন্য কি কি ফাঙ্কশন রয়েছে?

PHP তে header গুলি ম্যানেজ করার জন্য বিভিন্ন ফাংশন রয়েছে, যা বিভিন্ন কাজ করতে ব্যবহৃত হয়। কিছু গুরুত্বপূর্ণ ফাংশন মধ্যে একটি কিংবা একধরণের কাজ করতে ব্যবহৃত হতে পারে:

১. headers_sent(): এটি তথ্য প্রদান করে যে হেডার ইতিমধ্যে প্রেরিত হয়েছে কিনা, যাতে সেট করতে পারি কিনা তা চেক করতে ব্যবহৃত হয়।

if (headers_sent($file, $line)) {
    echo "Headers already sent in $file on line $line";
} else {
    // Perform actions that require setting headers
    header('Location: https://example.com');
    exit;
}

২. header_remove(): এটি একটি নির্দিষ্ট হেডার অপসারণ করতে ব্যবহৃত হয়।

<?php
// Remove the X-Powered-By header
header_remove('X-Powered-By');

// Set a custom content type header
header('Content-Type: application/json');

// Rest of your PHP code here...

// Output JSON response
echo json_encode(['message' => 'Hello, World!']);
?>

৩. headers_list(): এটি সব প্রেরিত হেডারের তালিকা প্রদান করে।

$headers = headers_list();
print_r($headers);

৪. header_register_callback(): এটি একটি কলব্যাক ফাংশন রেজিস্টার করতে ব্যবহৃত হয়, যাতে হেডার প্রেরণের সময় কিছু কাস্টম একশন নেয়া যায়।

<?php

// Register a callback function to modify headers
header_register_callback('customHeaderCallback');

// Simulate user authentication (you would use your own authentication logic)
$isAuthenticated = true; // Change to false to simulate an unauthenticated user

// Function to be called before headers are sent
function customHeaderCallback() {
    global $isAuthenticated;

    // Check if the user is authenticated
    if ($isAuthenticated) {
        header('X-Auth-Status: Authenticated');
    } else {
        header('X-Auth-Status: Not Authenticated');
    }

    // Set a custom timestamp header
    header('X-Server-Time: ' . date('Y-m-d H:i:s'));
}

// Additional headers can be set after the callback
header('Content-Type: text/html');

// Rest of your PHP code...

?>

PHP তে সেট করা header গুলো কিভাবে দেখা যায় ?

এখন, এই headers গুলো পাঠাতে পিএইচপি ব্যবহার করে একটি বাস্তব উদাহরণ দেখা যাক. এই উদাহরণে, আমরা একটি সাধারণ PHP স্ক্রিপ্ট তৈরি করব যা headers গুলিকে নির্দেশ করে যে রেস্পন্সটি JSON format এ এবং প্রদর্শনের উদ্দেশ্যে একটি কাস্টম হেডার অন্তর্ভুক্ত করে৷

sent_headers.php File

<?php
// Set Content-Type header to indicate JSON response
header('Content-Type: application/json');

// Set a custom header for demonstration
header('X-Custom-Header: Hello from PHP!');

// Simulate some data to be sent as a JSON response
$data = [
    'message' => 'Hello, World!',
    'timestamp' => time(),
];

// Encode the data as JSON and output
echo json_encode($data);

?>

এবার আপনি অন্য যেকোনো পেজে নিম্নোক্ত উপায়ে headers গুলো রিসিভ করতে পারেন :

get_headers.php File

<?php
// URL of the other page
$url = 'http://localhost/webfeatures/sent_headers.php';

// Get headers
$headers = get_headers($url, 1); // The second parameter makes get_headers() return an associative array

// Check if headers were successfully retrieved
if ($headers !== false) {
    // Output the headers
    foreach ($headers as $name => $value) {
        echo "$name: $value <br>";
    }
} else {
    echo "Failed to retrieve headers.";
}
?>

Output:

0: HTTP/1.1 200 OK
Date: Thu, 16 Nov 2023 09:10:56 GMT
Server: Apache/2.4.56 (Win64) OpenSSL/1.1.1t PHP/8.2.4
X-Powered-By: PHP/8.2.4
X-Custom-Header: Hello from PHP!
Content-Length: 50
Connection: close
Content-Type: application/json

এছাড়াও আপনি curl ব্যবহার করে headers গুলো পেতে পারেন :

<?php
// URL of the other page
$url = 'http://localhost/webfeatures/sent_headers.php';

// Initialize cURL session
$ch = curl_init($url);

// Set cURL options to capture headers
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);

// Execute cURL session
$response = curl_exec($ch);

// Separate headers and content
list($headers, $content) = explode("\r\n\r\n", $response, 2);

// Close cURL session
curl_close($ch);

// Output headers
echo $headers;
?>

যদি রিমোট সার্ভার অনুমতি দেয়, আপনি file stream এর জন্য HTTP context options সেট করে stream_context_create ফাংশন এর মাধ্যমে headers গুলো পেতে পারেন। file_get_contents এর মতো ফাংশনগুলির মাধ্যমে রিকোয়েস্ট করার সময় এই পদ্ধতি টি কার্যকর হতে পারে। মনে রাখবেন কিছু সার্ভার এই পদ্ধতির অনুমতি নাও দিতে পারে।

<?php
// URL of the other page
$url = 'http://localhost/webfeatures/sent_headers.php';

// Set up HTTP context options
$options = [
    'http' => [
        'method' => 'GET',
        'header' => "Accept-language: en\r\n" .
                    "Cookie: foo=bar\r\n" .  // Add any necessary headers here
                    "User-Agent: PHP\r\n",
    ],
];

// Create HTTP context
$context = stream_context_create($options);

// Retrieve the contents
$content = file_get_contents($url, false, $context);

// Output the retrieved content
echo $content;
?>

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply