আমি কীভাবে পিএইচপি-তে পুনর্নির্দেশ করব?


1261

পিএইচপি ব্যবহারের মাধ্যমে কোনও ব্যবহারকারীকে কোনও ভিন্ন পৃষ্ঠায় পুনঃনির্দেশ করা সম্ভব?

বলুন যে ব্যবহারকারী গিয়েছেন www.example.com/page.phpএবং আমি তাদের এটিকে পুনর্নির্দেশ করতে চাই www.example.com/index.php, আমি কীভাবে একটি মেটা রিফ্রেশ ব্যবহার না করে করব? এটা কি সম্ভব?

এটি এমনকি অননুমোদিত ব্যবহারকারীদের থেকে আমার পৃষ্ঠাগুলিকে সুরক্ষা দিতে পারে।


: আপনি পিএইচপি হেডার আপডেট করতে পারেন হেডার
জ্যাক Marrapese

11
@ স্যাম: সাইড নোডের মতো, পুনর্নির্দেশের মাধ্যমে কোনও প্রকার প্রয়োগ করবেন নাprotection from unauthorized users ; জিনিসগুলি কীভাবে করা উচিত তা নয়;)
স্ট্রে

7
পুনঃনির্দেশ সহ পৃষ্ঠাগুলি সুরক্ষিত করার ক্ষেত্রে কী সমস্যা? তাহলে সবচেয়ে ভাল উপায় কি?

6
@ প্রবিন্দআমারথুঙ্গ পুনঃনির্দেশ এই উপাদানগুলির মধ্যে একটি, তবে একমাত্র নয়। কেবল নিশ্চিত হন যে সুরক্ষিত উপাদানগুলি অননুমোদিত ব্যবহারকারীদের জন্য আউটপুট পাওয়া যায় না; ব্রাউজারের পুনর্নির্দেশ ক্লায়েন্ট-সাইড অক্ষম করা যেতে পারে, উদাহরণস্বরূপ: ব্রাউজারটি যদি পুনর্নির্দেশ না করে এবং মূল পৃষ্ঠাটি স্বাভাবিক হিসাবে আউটপুট হয়ে যায় তবে ব্যবহারকারী কী দেখতে পাবে? সৌজন্য বার্তা দিয়ে সাধারণ আউটপুট প্রতিস্থাপন করে সিএমএস সাধারণত পুনঃনির্দেশিত করে এবং সুরক্ষিত আইটেমগুলি মুদ্রণ করে না।
স্ট্রে

: @PravindaAmarathunga মার্কুস এর উত্তর থেকে লিঙ্ক চেক thedailywtf.com/Articles/WellIntentioned-Destruction.aspx
Strae

উত্তর:


1696

বিদ্যমান উত্তরের সংক্ষিপ্তসার এবং আমার নিজের দুটি সেন্ট:

1. বেসিক উত্তর

আপনি header()কোনও নতুন এইচটিটিপি শিরোনাম প্রেরণের জন্য ফাংশনটি ব্যবহার করতে পারেন তবে এটি কোনও HTML বা পাঠ্যের আগে ব্রাউজারে অবশ্যই প্রেরণ করতে হবে ( <!DOCTYPE ...>উদাহরণস্বরূপ ঘোষণার আগে )।

header('Location: '.$newURL);

2. গুরুত্বপূর্ণ বিশদ

মারা () বা প্রস্থান ()

header("Location: http://example.com/myOtherPage.php");
die();

আপনার কেন ব্যবহার করা উচিত die()বা exit(): ডেইলি ডাব্লুটিএফ

সম্পূর্ণ বা আপেক্ষিক ইউআরএল

জুন ২০১৪ সাল থেকে পরম এবং আপেক্ষিক উভয় ইউআরএল ব্যবহার করা যেতে পারে। আরএফসি 7231 দেখুন যা পুরাতন আরএফসি 2616 প্রতিস্থাপন করেছে , যেখানে কেবল পরম ইউআরএলকেই অনুমতি দেওয়া হয়েছিল।

স্থিতি কোড

পিএইচপি-র "অবস্থান" -র শিরোনামটি এখনও HTTP 302 -নির্দেশক কোড ব্যবহার করে , তবে আপনার ব্যবহার করা উচিত এটি এটি নয়। আপনার 301 (স্থায়ী পুনঃনির্দেশ) বা 303 (অন্যান্য) এর মধ্যে বিবেচনা করা উচিত ।

দ্রষ্টব্য: ডাব্লু 3 সি উল্লেখ করেছে যে 303-শিরোনামটি "অনেকগুলি প্রাক-HTTP / 1.1 ব্যবহারকারীর এজেন্টগুলির সাথে সামঞ্জস্যপূর্ণ নয় Currently বর্তমানে ব্যবহৃত ব্রাউজারগুলি সমস্ত এইচটিটিপি / 1.1 ব্যবহারকারী এজেন্ট sp

3. ডকুমেন্টেশন

এইচটিটিপি শিরোনাম এবং header()পিএইচপিতে ফাংশন

4. বিকল্প

আপনি বিকল্প পদ্ধতিটি ব্যবহার করতে পারেন http_redirect($url);যার জন্য পিইসিএল প্যাকেজ পেকল ইনস্টল করা দরকার।

5. সহায়ক কার্যাদি

এই ফাংশনটি 303 স্থিতি কোডটি অন্তর্ভুক্ত করে না:

function Redirect($url, $permanent = false)
{
    header('Location: ' . $url, true, $permanent ? 301 : 302);

    exit();
}

Redirect('http://example.com/', false);

এটি আরও নমনীয়:

function redirect($url, $statusCode = 303)
{
   header('Location: ' . $url, true, $statusCode);
   die();
}

6. ওয়ার্কআরাউন্ড

উল্লিখিত হিসাবে header()পুনঃনির্দেশগুলি কেবল কিছু লেখার আগেই কাজ করে। অন্তর্নিহিত এইচটিএমএল আউটপুট চাওয়া হলে এগুলি সাধারণত ব্যর্থ হয় । তারপরে আপনি এইচটিএমএল শিরোনামের মতো কাজ করতে পারেন (খুব পেশাদার নয়!):

 <meta http-equiv="refresh" content="0;url=finalpage.html">

অথবা একটি জাভাস্ক্রিপ্ট এমনকি পুনর্নির্দেশ।

window.location.replace("http://example.com/");

5
এই উত্তরটির সাথে কিছু সমস্যা: 303 "সঠিক" স্থিতি কোড নাও হতে পারে। 301 উদাহরণস্বরূপ গুগলের জন্য পছন্দসই হতে পারে। দ্বিতীয়ত, header('Location: '.$newURL);ব্রাউজারে কোনও এইচটিএমএল (বা পাঠ্য) প্রেরণের আগে হওয়া উচিত, অথবা এটি সঠিকভাবে কাজ করবে না।
চক লে বাট

6
দৈনিক ডাব্লুটিএফের গল্পটি একটি সাধারণ বিষয়, দুঃখের বিষয়। যাইহোক, এটি নিখোঁজ মারা যা সমস্যার কারণ নয়, এটি একটি খারাপ নকশা। প্রক্রিয়াটিকে সহিংসভাবে বন্ধ করা 99.9% ক্ষেত্রে ভুল। একটি সাধারণ, ক্লিনার সমাধান (যাইহোক আমার প্রিয় নয়) হ'ল একটি পুনর্নির্দেশের ধারণাটি নিক্ষেপ করা এবং এটি আপনাকে অ্যাপ্লিকেশন এন্ট্রি পয়েন্টে ধরা। এর পরে আপনি আপনার সমস্ত "পরে *" কল করতে পারবেন (লগ / ঘনিষ্ঠ সংযোগগুলি / যা কখনও)
Robertodecurnex

4
http-equiv="Location"সমস্ত ব্রাউজার দ্বারা সমর্থিত নয়। refreshপরিবর্তে আপনার ব্যবহার করা উচিত ! <meta http-equiv="refresh" content="0;url=http://example.com/">
টিমো 2002

71
আপনি এটির অর্থ না দিলে কখনও 301 ইস্যু করবেন না । 301 এর অর্থ স্থায়ী এবং স্থায়ী অর্থ স্থায়ী , যার অর্থ এটি ব্যবহারকারী এজেন্টদের দ্বারা ক্যাশে করা হবে, যার অর্থ লম্বা, ক্যাফিনে ভরা রাতগুলি অ্যাপ্লিকেশন লগের দিকে তাকিয়ে ভাবছে যে আপনি পাগল হয়ে যাচ্ছেন কারণ আপনি কসম খেয়েছেন যে কোনও পৃষ্ঠাটি কল করা বা আপডেট করা উচিত ছিল এবং আপনি শপথ করেছেন toশ্বরের কাছে এটি আপনার মেশিনে কাজ করে তবে ক্লায়েন্টের নয়। যদি আপনাকে অবশ্যই 301 এ কল করতে হয় তবে সংস্থানটিতে ক্যাশে-নিয়ন্ত্রণ সর্বোচ্চ-বয়স দিন put আপনার অসীম জ্ঞান নেই এবং আপনার মতো আচরণ করা উচিত নয়।
মাদুলাও

2
তবে বাইরে বেরোনোর ​​জন্য ডাই ব্যবহার করার কোনও কারণ আছে কি? প্রস্থানটি পরিষ্কার এবং আরও উপযুক্ত বলে মনে হচ্ছে।
ars265

122

এইচটিটিপি হেডার পাঠাতে header()ফাংশনটি ব্যবহার করুন :Location

header('Location: '.$newURL);

কেউ কেউ যা ভাবেন তার বিপরীতে die()পুনঃনির্দেশের সাথে কিছু করার নেই। এটি ব্যবহার করুন শুধুমাত্র যদি আপনি পুনর্নির্দেশ করতে চান পরিবর্তে স্বাভাবিক মৃত্যুদণ্ড।

ফাইল উদাহরণ.এফপি :

<?php
    header('Location: static.html');
    $fh = fopen('/tmp/track.txt', 'a');
    fwrite($fh, $_SERVER['REMOTE_ADDR'] . ' ' . date('c') . "\n");
    fclose($fh);
?>

তিনটি ফাঁসির ফলাফল:

bart@hal9k:~> cat /tmp/track.txt
127.0.0.1 2009-04-21T09:50:02+02:00
127.0.0.1 2009-04-21T09:50:05+02:00
127.0.0.1 2009-04-21T09:50:08+02:00

পুনরায় শুরু করা - বাধ্যতামূলক die()/ exit()এমন কিছু শহুরে কিংবদন্তি যার সত্যিকারের পিএইচপি এর সাথে কোনও সম্পর্ক নেই। শিরোনামটির "শ্রদ্ধা" Location:শিরোনামের সাথে এর কোনও সম্পর্ক নেই । শিরোনাম পাঠানো ক্লায়েন্ট ব্যবহার না করেই, পিএইচপি এক্সিকিউশন বন্ধ করে না।


8
ডাই () বা প্রস্থান () হ'ল ক্লায়েন্টদের জন্য যারা "অবস্থান: ..." শিরোনাম না
ক্লার

12
@ ক্লেয়ার: না, exit()পৃষ্ঠাটি বাকী বিষয়বস্তু প্রদর্শন করা থেকে বিরত রাখা (সীমাবদ্ধ পৃষ্ঠা মনে করুন) think ভের্টেক সঠিক, এটির HTTP অবস্থান শিরোনামের সাথে কোনও সম্পর্ক নেই এবং আপনার দরকার নেই exit। আমি এটিকে আমার উত্তরে অন্তর্ভুক্ত করা বেছে নিয়েছি কারণ, যে কেউ সহজ রিডাইরেক্ট করতে জানে না, তার পক্ষে কেউ একটি সহজ তবে অত্যন্ত গুরুত্বপূর্ণ পদক্ষেপ বাস্তবায়নের চেয়ে নিরাপদ খেলতে পারে যাতে সে উন্নত প্রক্রিয়ার সুযোগ নিতে সক্ষম হয় নিয়ন্ত্রণ।
অ্যালিক্স অ্যাক্সেল

1
তবে ব্রাউজারগুলি যে শিরোনামকে সম্মান করে তা পৃষ্ঠাটি ছেড়ে দেবে এবং আপনার স্ক্রিপ্টটি কার্যকর হওয়ার সময় সংযোগটি বন্ধ করবে। এটা সম্পূর্ণ খারাপ। পিএইচপি কিছু সময়ের জন্য স্ক্রিপ্টটি নিয়ে চলবে (এজন্য আপনার কোডটি কার্যকর করে) তবে জিনিসটি ভাঙ্গা রেখে ফাঁসির মাঝামাঝি সময়ে এলোমেলোভাবে বাতিল করতে পারে। উপেক্ষা_ইউজার_এবার্ট () কল করা এটি প্রতিরোধ করবে, তবে আন্তরিকভাবে আমি এটির পক্ষে উপযুক্ত নয়। কেবল আপনার এইচটিএমএল রাইটিং স্টাফ দিয়ে চলুন (সম্ভবত অব্যর্থ হলেও) তবে হেডারের পরে ডিস্ক বা ডাটাবেসে লেখার জিনিসগুলি ('অবস্থান:') করবেন না; পুনর্নির্দেশের আগে ডিস্কে লিখুন সম্ভব হলে। [এছাড়াও: ইউআরএল নিখুঁত হওয়া উচিত]]
ফ্রান্সেসকোএমএম

ব্রাউজারটি এইচটিটিপি প্রোটোকল সনাক্ত করার আগে পুনর্নির্দেশের কোনও উপায় আছে কি? আমাকে পুনর্নির্দেশের প্রয়োজন কারণ হ'ল আমি আমার সমস্ত ডোমেনের জন্য পর্যাপ্ত SSL শংসাপত্র পেতে পারি না। আমি .htaccessপুনঃনির্দেশের জন্য ব্যবহার করব , তবে চূড়ান্ত ডোমেনটিতে পুনঃনির্দেশিত কোন ডোমেনে কোনওভাবে পাস করার জন্য আমার একটি উপায় দরকার?
ওল্ডবয়

109
function Redirect($url, $permanent = false)
{
    if (headers_sent() === false)
    {
        header('Location: ' . $url, true, ($permanent === true) ? 301 : 302);
    }

    exit();
}

Redirect('http://www.google.com/', false);

মরতে ভুলবেন না () / প্রস্থান ()!


6
এবং আউটপুট বাফারিং ভুলবেন না বা আপনি 'ইতিমধ্যে প্রেরিত শিরোনাম' দিয়ে শেষ করবেন।
কুরোকি কাজী

8
... এবং "আপনাকে out n সেকেন্ডের মধ্যে page নেপেজে পুনঃনির্দেশিত করা হবে, পুনর্নির্দেশ না হলে এখানে $ লিঙ্কটি ক্লিক করুন" কিছু ব্রাউজার এবং কিছু ব্রাউজারের সেটিংস সেই পুনঃনির্দেশে ব্যর্থ হতে পারে বলে সোমালিস্টাইন প্রিন্ট আউট ভুলে যাবেন না Some
স্ট্রেইট

3
@ ডানিএল: এই ধরণের পুনর্নির্দেশটি "$ n সেকেন্ড" লাগবে না। এটি আদৌ ঘটলে তা তাত্ক্ষণিক হবে এবং যে কোনও মানানসই ব্রাউজারটি এটি পরিচালনা করে। আমি মনে করি আপনি "মেটা রিফ্রেশ" পুনর্নির্দেশের কথা ভাবছেন যা লোকেরা যখন আরও ভাল জানেন না তখন তারা ব্যবহার করে।
rmeador 16

1
@ আরমিডোর ... পুরানো ব্রাউজার এবং বিশেষ ব্রাউজারগুলির জন্য। মেটা-পুনঃনির্দেশ ব্যর্থ হওয়ার ক্ষেত্রে একটি লিঙ্ক সহ "আপনাকে x সেকেন্ডে পৃষ্ঠাতে আপনাকে পুনঃনির্দেশিত করা হবে" এর সাথে মেটা-পুনর্নির্দেশ ব্যর্থ হলে আপনার প্রথমে আপনার অবস্থানের শিরোনামটি করা উচিত। এটি একটি পুনর্নির্দেশ করার সঠিক এবং ব্যর্থ-নিরাপদ উপায়।
অ্যান্ড্রু মুর

3
অ্যান্ড্রু: কীভাবে এইচটিটিপি ব্রাউজার অবস্থানকে সম্মান করতে পারে না:?
বারটেক করুন

102

প্রতিধ্বনি ব্যবহার করে পিএইচপি থেকে আউটপুট জাভাস্ক্রিপ্ট, যা কাজ করবে।

echo '<script type="text/javascript">
           window.location = "http://www.google.com/"
      </script>';

আপনি পৃষ্ঠা আউটপুটটি বাফার না করে এবং পরে পুনঃনির্দেশ শর্তের জন্য পরীক্ষা না করে আপনি পিএইচপি তে সত্যই তা করতে পারবেন না। এটি খুব ঝামেলা হতে পারে। মনে রাখবেন যে শিরোনামগুলি পৃষ্ঠা থেকে প্রেরণ করা প্রথম জিনিস। পুনঃনির্দেশের বেশিরভাগ সাধারণত পৃষ্ঠায় পরে প্রয়োজন হয়। তার জন্য আপনাকে পৃষ্ঠার সমস্ত আউটপুট বাফার করতে হবে এবং পরে পুনঃনির্দেশ শর্তের জন্য পরীক্ষা করতে হবে। এই মুহুর্তে আপনি হয় পৃষ্ঠা ব্যবহারকারী শিরোনাম () পুনর্নির্দেশ করতে পারেন বা কেবল বাফার আউটপুট প্রতিধ্বনি করতে পারেন।

বাফারিং সম্পর্কে আরও সুবিধা (সুবিধা)

আউটপুট বাফারিং কী?


2
সহজ এবং মূল উত্তর! একটি সাধারণ পৃষ্ঠা পুনর্নির্দেশের জন্য দুর্দান্ত!
স্ট্যাথিস অ্যান্ড্রোনিকোস

এবং এইভাবে আপনি সাধারণ Cannot modify header information - headers already sent byত্রুটির দিকে চালিত হন না ।
কাই নোক

1
@ এইচএমডি, জাভাস্ক্রিপ্ট অক্ষম থাকলে কী হবে?
ইসতিয়াক আহমেদ

@ ইসতিয়াআহ্মেড জাভাস্ক্রিপ্ট আজকাল প্রায় সর্বদা সক্ষম থাকে তবে যদি এটি অক্ষম থাকে তবে আপনি পিএইচপি বাফার ব্যবহার করতে পারেন। এই তাই প্রশ্নের উত্তর যে। আপনি যদি পিএইচপি বাফারিং ব্যবহার করে থাকেন তবে আপনার অনুমান করার মতো এই পদ্ধতিটির দরকার নেই।
হামাদ খান

ভুয়া, আপনি বাফারিং ছাড়াই এটি পিএইচপিতে (এবং হওয়া উচিত): কোনও নকশাকৃত পৃষ্ঠায় কোনও প্রকার HTML টি বিষয়বস্তু ব্যবহারকারীর কাছে প্রেরণের আগে সমস্ত প্রাসঙ্গিক পিএইচপি প্রক্রিয়াজাতকরণ হওয়া উচিত। এইভাবে পিএইচপি পুনঃনির্দেশগুলি ভাল কাজ করবে।
MestreLion

91

1. সাথে শিরোনাম ফাংশন ব্যবহার করে exit()

<?php 
     header('Location: target-page.php');
     exit();
?>

তবে আপনি যদি শিরোনাম ফাংশন ব্যবহার করেন তবে কিছু সময় আপনি "শিরোনামের মতো ইতিমধ্যে পাঠানো সতর্কতা" পেয়ে যাবেন যা সমাধান করতে শিরোনাম পাঠানোর আগে প্রতিধ্বনি বা মুদ্রণ না করে অথবা আপনি কেবল শিরোনাম ফাংশনটি ব্যবহার করতে পারেন die()বা exit()পরে করতে পারেন ।

2. হেডার ছাড়া

<?php 
    echo "<script>location.href='target-page.php';</script>";
?>

এখানে আপনি কোনও সমস্যার মুখোমুখি হবেন না

ob_start()এবং সাথে শিরোনাম ফাংশন ব্যবহার করেob_end_flush()

<?php
ob_start(); //this should be first line of your page
header('Location: target-page.php');
ob_end_flush(); //this should be last line of your page
?>

কবজির মতো কাজ করুন। আমি <? পিএইচপি প্রতিধ্বনি "<script> অবস্থান. href = ' google.fr/ '; </script>" ব্যবহার করি ; ?> এটি পরীক্ষা করতে এবং এটি যা চেয়েছিল তা করেছিল
ডক্টরড্রয়েড হাইতি 27'19

1
দ্বিতীয় সমাধান জেএস প্রতিবন্ধীদের সাথে কাজ করবে না।
তাজনি

55

এই উত্তরগুলির বেশিরভাগ একটি খুব গুরুত্বপূর্ণ পদক্ষেপ ভুলে যাচ্ছেন !

header("Location: myOtherPage.php");
die();

সেই গুরুত্বপূর্ণ দ্বিতীয় লাইনটি ছেড়ে যাওয়ার ফলে আপনি ডেইলি ডাব্লুটিএফ-এর সমাপ্তি দেখতে পাবেন । সমস্যাটি হ'ল ব্রাউজারগুলিকে আপনার পৃষ্ঠাটি যে শিরোনাম দেয় তা সম্মান করতে হবে না , তাই শিরোনামগুলি উপেক্ষা করার সাথে সাথে বাকী পৃষ্ঠাটি পুনর্নির্দেশ ছাড়াই কার্যকর করা হবে।


1
স্ক্রিপ্টটি মারার আগে ব্যবহারকারীকে কিছু আউটপুট দেওয়ার কী আছে? আপনি জানেন, লোকেরা কী
ঘটবে

3
আপনি ধরে নিচ্ছেন যে স্ক্রিপ্টটির পুনর্নির্দেশ করা ছাড়া কিছুই করার নেই। যা আদৌ সত্য হতে পারে না।
ভের্টেক

13
@ ডানিএল: এটিকে মরতে পরিবর্তন করুন ("আমার শিরোনামগুলি উপেক্ষা করুন!")
নিকফ

3
die();আপনার দেওয়া সহজ ব্যাখ্যাটি আমি পছন্দ করেছি - আপনি এটি না করলে ব্যবহারকারী এটি ব্যবহার না করে এক মুহুর্তের জন্য সম্পূর্ণ পৃষ্ঠাটি দেখতে পাবেন; ব্যবহারকারীকে পুনঃনির্দেশিত করা হবে এবং কোনও অস্থায়ী সামগ্রী ফাঁক + 1 দেখাবে না
TheBlackBenzKid

শিরোনাম প্রেরণের পরে, ব্রাউজারকে কিছুই পাঠায় না এমন ক্রিয়াকলাপ, তবে ক্রিয়াকলাপটি লগ করে বা রেকর্ডিং লেনদেন শেষ করে এমন কার্যকর কার্যকলাপ হওয়া সম্ভব। এই কারণে, ডাই / প্রস্থান করার প্রয়োজনীয়তা স্ক্রিপ্টের উপর নির্ভর করে।
ড্যানএলেন

28

ব্যবহার করুন:

<?php header('Location: another-php-file.php'); exit(); ?>

বা যদি আপনি ইতিমধ্যে পিএইচপি ট্যাগগুলি খোলা থাকেন তবে এটি ব্যবহার করুন:

header('Location: another-php-file.php'); exit();

আপনি বাহ্যিক পৃষ্ঠাগুলিতেও পুনঃনির্দেশ করতে পারেন, যেমন:

header('Location: https://www.google.com'); exit();

আপনি অন্তর্ভুক্ত exit()বা অন্তর্ভুক্ত করা হয়েছে তা নিশ্চিত করুন die()


25

পৃষ্ঠাগুলিতে অ্যাক্সেস নিয়ন্ত্রণ করতে এবং বৈধ ব্যবহারকারীদেরও অনুমোদিত করতে আপনি সেশন ভেরিয়েবলগুলি ব্যবহার করতে পারেন:

<?php
    session_start();

    if (!isset( $_SESSION["valid_user"]))
    {
        header("location:../");
        exit();
    }

    // Page goes here
?>

http://php.net/manual/en/reserved.variables.session.php

সম্প্রতি, আমি সাইবার আক্রমণ পেয়েছি এবং সিদ্ধান্ত নিয়েছি, অ্যাডমিন প্যানেল বা ওয়েব অ্যাপ্লিকেশনটির সংরক্ষিত অংশ অ্যাক্সেস করার চেষ্টা করা ব্যবহারকারীদের আমার জানা দরকার।

সুতরাং, আমি একটি পাঠ্য ফাইলে আইপি ঠিকানা এবং ব্যবহারকারীর সেশনের জন্য একটি লগ অ্যাক্সেস যুক্ত করেছি, কারণ আমি আমার ডাটাবেসটিকে বিরক্ত করতে চাই না।


19

এই উত্তরগুলির মধ্যে অনেকগুলি সঠিক, তবে তারা ধরে নেয় আপনার একটি নিখুঁত URL আছে, যা সম্ভবত নাও হতে পারে। আপনি যদি কোনও আপেক্ষিক ইউআরএল ব্যবহার করতে চান এবং বাকিটি উত্পন্ন করতে চান তবে আপনি এর মতো কিছু করতে পারেন ...

$url = 'http://' . $_SERVER['HTTP_HOST'];            // Get the server
$url .= rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); // Get the current directory
$url .= '/your-relative/path-goes/here/';            // <-- Your relative path
header('Location: ' . $url, true, 302);              // Use either 301 or 302

16

header( 'Location: http://www.yoursite.com/new_page.html' );


ব্রাউজারটি এইচটিটিপি প্রোটোকল সনাক্ত করার আগে পুনর্নির্দেশের কোনও উপায় আছে কি? আমাকে পুনর্নির্দেশের প্রয়োজন কারণ হ'ল আমি আমার সমস্ত ডোমেনের জন্য পর্যাপ্ত SSL শংসাপত্র পেতে পারি না। আমি .htaccessপুনঃনির্দেশের জন্য ব্যবহার করব , তবে চূড়ান্ত ডোমেনটিতে পুনঃনির্দেশিত কোন ডোমেনে কোনওভাবে পাস করার জন্য আমার একটি উপায় দরকার?
ওল্ডবয়

16

নিম্নলিখিত কোড ব্যবহার করুন:

header("Location: /index.php");
exit(0);   

14

আমি ইতিমধ্যে এই প্রশ্নের উত্তর দিয়েছি, তবে আমি আবার এটি করব কারণ ইতিমধ্যে আমি শিখেছি যে আপনি যদি সিএলআই-তে চালাচ্ছেন তবে বিশেষ ঘটনা রয়েছে (পুনর্নির্দেশগুলি ঘটতে পারে না এবং এটি করা উচিত নয় exit()) অথবা যদি আপনার ওয়েবসারভার হয় পিএইচপি (এফ) সিজিআই হিসাবে চলমান ( Statusসঠিকভাবে পুনঃনির্দেশের জন্য এটির পূর্বে সেট শিরোনাম প্রয়োজন)।

function Redirect($url, $code = 302)
{
    if (strncmp('cli', PHP_SAPI, 3) !== 0)
    {
        if (headers_sent() !== true)
        {
            if (strlen(session_id()) > 0) // If using sessions
            {
                session_regenerate_id(true); // Avoids session fixation attacks
                session_write_close(); // Avoids having sessions lock other requests
            }

            if (strncmp('cgi', PHP_SAPI, 3) === 0)
            {
                header(sprintf('Status: %03u', $code), true, $code);
            }

            header('Location: ' . $url, true, (preg_match('~^30[1237]$~', $code) > 0) ? $code : 302);
        }

        exit();
    }
}

আমিও বিভিন্ন HTTP- র ফেরৎ কোড সমর্থনকারী ইস্যু নিয়ে নাড়াচাড়া করেছি ( 301, 302, 303এবং 307), যেমন আমার আগের উত্তরের মন্তব্য বক্তৃতা করেন। বর্ণনা এখানে:

  • 301 - স্থায়ীভাবে সরানো হয়েছে
  • 302 - পাওয়া গেছে
  • 303 - অন্যান্য দেখুন
  • 307 - অস্থায়ী পুনঃনির্দেশ (HTTP / 1.1)

11

দর্শকদের অন্য পৃষ্ঠায় পুনর্নির্দেশ করতে (শর্তাধীন লুপে বিশেষত কার্যকর), কেবল নিম্নলিখিত কোডটি ব্যবহার করুন:

<?php
    header('Location: mypage.php');
?>

এই ক্ষেত্রে, mypage.phpপৃষ্ঠার ঠিকানা যা আপনি দর্শকদের পুনর্নির্দেশ করতে চান। এই ঠিকানাটি নিখুঁত হতে পারে এবং এই বিন্যাসে পরামিতিগুলিও অন্তর্ভুক্ত করতে পারে:mypage.php?param1=val1&m2=val2)

আপেক্ষিক / সম্পূর্ণ পাথ

আপেক্ষিক বা পরম পাথগুলির সাথে কাজ করার সময়, সার্ভারের মূল (DOCUMENT_ROOT) থেকে একটি নিখুঁত পথ চয়ন করা আদর্শ। নিম্নলিখিত ফর্ম্যাটটি ব্যবহার করুন:

<?php
    header('Location: /directory/mypage.php');
?>

যদি কখনও লক্ষ্য পৃষ্ঠাটি অন্য সার্ভারে থাকে তবে আপনি সম্পূর্ণ ইউআরএল অন্তর্ভুক্ত করুন:

<?php
    header('Location: http://www.ccm.net/forum/');
?>

এইচটিটিপি শিরোনাম

HTTP প্রোটোকল অনুসারে, HTTP শিরোনাম অবশ্যই প্রেরণ করতে হবে before কোনও ধরণের সামগ্রী । এর অর্থ হ'ল শিরোনামের আগে কোনও অক্ষর আর প্রেরণ করা উচিত নয় - এমনকি খালি স্থানও নয়!

অস্থায়ী / স্থায়ী পুনঃনির্দেশগুলি

ডিফল্টরূপে, উপরে উপস্থাপনের ধরণটি একটি অস্থায়ী। এর অর্থ হ'ল গুগল অনুসন্ধানের মতো অনুসন্ধান ইঞ্জিনগুলি সূচীকরণের সময় পুনঃনির্দেশটিকে বিবেচনায় নেবে না।

আপনি যদি কোনও পৃষ্ঠাগুলি স্থায়ীভাবে অন্য স্থানে সরিয়ে নিয়েছেন এমন সার্চ ইঞ্জিনগুলিকে অবহিত করতে চান তবে নিম্নলিখিত কোডটি ব্যবহার করুন:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: new_address');
?>

উদাহরণস্বরূপ, এই পৃষ্ঠায় নিম্নলিখিত কোড রয়েছে:

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: /pc/imprimante.php3');
    exit();
?>

আপনি উপরের লিঙ্কটিতে ক্লিক করলে আপনি স্বয়ংক্রিয়ভাবে এই পৃষ্ঠায় পুনঃনির্দেশিত হন। তদতিরিক্ত, এটি একটি স্থায়ী পুনঃনির্দেশ (স্থিতি: 301 স্থায়ীভাবে সরানো)। সুতরাং, আপনি যদি গুগলে প্রথম URL টি টাইপ করেন তবে আপনাকে স্বয়ংক্রিয়ভাবে দ্বিতীয়, পুনঃনির্দেশিত লিঙ্কে পুনঃনির্দেশ করা হবে।

পিএইচপি কোড এর ব্যাখ্যা

শিরোনাম () এর পরে অবস্থিত পিএইচপি কোডটি সার্ভারের দ্বারা ব্যাখ্যা করা হবে, এমনকি দর্শনার্থী পুনঃনির্দেশে নির্দিষ্ট করা ঠিকানায় চলে যায়। বেশিরভাগ ক্ষেত্রে, এর অর্থ হ'ল সার্ভারের বোঝা হ্রাস করার জন্য header()আপনার exit()ফাংশনটির কার্যকারিতা অনুসরণ করতে একটি পদ্ধতি প্রয়োজন :

<?
    header('Status: 301 Moved Permanently', false, 301);
    header('Location: address');
    exit();
?>

কেন (দ্বিতীয় অনুচ্ছেদের শেষের দিকে)? আপনি কি এর &paraপরিবর্তে বলতে চান (তাই পুরোটি পড়ে mypage.php?param1=val1&param2=val2))? (এইচটিএমএল সত্তা প্যারা ) হ'ল "¶" - সম্ভবত কোনও বাহ্যিক প্রোগ্রাম রূপান্তর করেছে?)
পিটার মর্টেনসেন

9

ব্যবহার করুন:

<?php
    header('Location: redirectpage.php');
    header('Location: redirectpage.php');
    exit();
    echo "<script>location.href='redirectpage.php';</script>";
?>

এটি একটি নিয়মিত এবং সাধারণ পিএইচপি পুনর্নির্দেশ, তবে আপনি নীচের কোডটি দিয়ে কয়েক সেকেন্ড অপেক্ষা করে একটি পুনর্নির্দেশ পৃষ্ঠা তৈরি করতে পারেন:

<?php
    header('refresh:5;url=redirectpage.php '); // Note: here 5 means 5 seconds wait for redirect.
?>

7

শব্দার্থক ওয়েবের প্রাক্কালে, যথার্থতা বিবেচনা করার মতো বিষয়। দুর্ভাগ্যক্রমে, পিএইচপি-র "লোকেশন" -র শিরোনাম এখনও HTTP 302 - পুনঃনির্দেশ কোড ব্যবহার করে , যা কড়াভাবে, পুনঃনির্দেশের জন্য সেরা নয়। পরিবর্তে এটি ব্যবহার করা উচিত, এটি হ'ল 303

ডাব্লু 3 সি যথেষ্ট উল্লেখযোগ্য যে 303-শিরোনামটি "অনেকগুলি প্রাক-এইচটিটিপি / 1.1 ব্যবহারকারী এজেন্টগুলির" সাথে সামঞ্জস্যপূর্ণ নয়, যা বর্তমান ব্যবহারে কোনও ব্রাউজারের পরিমাণ নয়। সুতরাং, 302 একটি প্রতীক, যা করা উচিত নয় ব্যবহার করা ।

... বা আপনি এটিকে অন্য সবার মতোই উপেক্ষা করতে পারবেন ...


7

আপনি নীচের মত কিছু জাভাস্ক্রিপ্ট পদ্ধতি ব্যবহার করতে পারেন

  1. self.location="http://www.example.com/index.php";

  2. window.location.href="http://www.example.com/index.php";

  3. document.location.href = 'http://www.example.com/index.php';

  4. window.location.replace("http://www.example.com/index.php");


জাভাস্ক্রিপ্ট ক্লায়েন্টের উপর চলে যা আপনি যা খুঁজছেন তা হতে পারে বা নাও পারে।
ছারভে

7

হ্যাঁ, আপনি শিরোনাম () ফাংশনটি ব্যবহার করতে পারেন ,

header("Location: http://www.yourwebsite.com/user.php"); /* Redirect browser */
exit();

এবং সেরা অনুশীলন হ'ল ঠিক পরে প্রস্থান () ফাংশন কল করাheader() নীচের কোড সম্পাদন এড়াতে ।

ডকুমেন্টেশন অনুসারে, header()কোনও আসল আউটপুট প্রেরণের আগে অবশ্যই ফোন করা উচিত।


6

অন্যদের মতো এখানেও লোকেশন শিরোনাম প্রেরণ করে বলেছেন:

header( "Location: http://www.mywebsite.com/otherpage.php" );

তবে ব্রাউজারে অন্য কোনও আউটপুট প্রেরণের আগে আপনাকে এটি করা দরকার।

এছাড়াও, আপনি যদি নির্দিষ্ট পৃষ্ঠাগুলি থেকে অ-অনুমোদনপ্রাপ্ত ব্যবহারকারীদের ব্লক করতে এটি ব্যবহার করতে যাচ্ছেন, যেমনটি আপনি উল্লেখ করেছেন, মনে রাখবেন যে কিছু ব্যবহারকারী এজেন্টরা এটিকে উপেক্ষা করবে এবং যে কোনও উপায়ে বর্তমান পৃষ্ঠায় চালিয়ে যাবে, সুতরাং আপনাকে মরতে হবে ( ) আপনি এটি প্রেরণের পরে।


but you need to do it before you've sent any other output to the browser. অসাধারণ!! আমি ইতিমধ্যে ত্রুটি প্রেরণে শিরোনামগুলি কেন পেয়েছি তা কয়েক মিনিটের জন্য অনুসন্ধান করা হয়েছে। +1 টি !!
জোশ

আরও সাধারণ, আপনার / আপনার স্ক্রিপ্ট সম্পূর্ণ / বন্ধ আছে। die()এটি করার একটাই উপায়।
মোগানআআআর

6

আমার মতামত এখানে:

আইএমএইচও, আগত অনুরোধটিকে পুনর্নির্দেশ করার সর্বোত্তম উপায় হ'ল লোকেশন শিরোনাম ব্যবহার করে

<?php
    header("Location: /index.php");
?>

এই বিবৃতিটি কার্যকর হয়ে গেলে এবং আউটপুট প্রেরণ করা হয়ে গেলে, ব্রাউজারটি ব্যবহারকারীকে পুনরায় নির্দেশনা দেওয়া শুরু করবে। তবে, শিরোনাম পাঠানোর আগে কোনও আউটপুট (কোনও প্রতিধ্বনি / var_dump) হয়নি তা নিশ্চিত করুন, অন্যথায় এটি ত্রুটির দিকে পরিচালিত করবে।

যদিও এটি যা প্রাথমিকভাবে বলা হয়েছিল তা অর্জনের জন্য দ্রুত এবং নোংরা উপায়, তবে এটি শেষ পর্যন্ত এসইওর বিপর্যয় হিসাবে পরিণত হবে, কারণ এই জাতীয় পুনঃনির্দেশকে সর্বদা 301/302 পুনঃনির্দেশ হিসাবে ব্যাখ্যা করা হয়, তাই অনুসন্ধান ইঞ্জিনগুলি সর্বদা আপনার দেখতে পাবে পৃষ্ঠার পুনঃনির্দেশিত পৃষ্ঠা হিসাবে এবং কোনও ল্যান্ডিং পৃষ্ঠা / প্রধান পৃষ্ঠার কিছু নয়।

সুতরাং এটি ওয়েবসাইটের এসইও সেটিংসকে প্রভাবিত করবে।


1
প্রস্থান ()
হ্যাডার

@docesam .. একমত .. প্রস্থান () অবিলম্বে শিরোনাম () কল করার পরে কল করা উচিত। তবে আমি অনুভব করি, এই শিরোনাম () বিবৃতিটির পরে যদি ব্রাউজারে আর আউটপুট না থাকে তবে প্রস্থান ()
ভাস্কর প্রামানিক

হ্যাঁ তবে আপনাকে ব্যাখ্যা করতে হবে কারণ কেউ আপনার কোডের লাইনটি তার স্ক্রিপ্টে অনুলিপি করতে পারে এবং এর ফলে কী ভুল হয়েছে তা নির্ধারণ করে নিজের চারপাশে দীর্ঘ সময় ঘুরতে পারে।
একনাদিল্লি

1
@ ভাস্কর প্রামানিক কল্পনা করুন যে আপনাকে একটি দরজা দ্রুত লক করতে হবে, তবে এটি ইতিমধ্যে তালাবদ্ধ হয়েছে কি না তা নিশ্চিত করতে আপনাকে আবার এগুলিকে টান / ধাক্কা /
টুটা

5

পিএইচপি দিয়ে পুনঃনির্দেশ করার সর্বোত্তম উপায় হ'ল নিম্নলিখিত কোডটি ...

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

কোনও কোড পরে কাজ করবে না তা নিশ্চিত করুন

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

উপরের লাইনের আগে সমস্ত কোড অবশ্যই কার্যকর করা উচিত।

ধরা যাক,

মামলা 1:

echo "I am a web developer";
header("Location: /index.php");

এটি অবস্থানটিতে সঠিকভাবে পুনঃনির্দেশ করা হবে (index.php)।

কেস 2:

return $something;
header("Location: /index.php");

উপরের কোডটি অবস্থানটিতে পুনর্নির্দেশ করবে না (index.php)।


ইতিমধ্যে একটি উত্তর আছে যার মধ্যে 1085 রয়েছে যা আপনার সরবরাহিত তথ্য এবং আরও অনেক কিছু অন্তর্ভুক্ত করে।
প্যাট্রিক হুন্ড

5

হ্যাঁ, পিএইচপি ব্যবহার করা সম্ভব। আমরা অন্য পৃষ্ঠায় পুনর্নির্দেশ করব।

নিম্নলিখিত কোড ব্যবহার করে দেখুন:

<?php
    header("Location:./"); // Redirect to index file
    header("Location:index.php"); // Redirect to index file
    header("Location:example.php");
?>

4

1. ব্যবহার করে header, একটি অন্তর্নির্মিত পিএইচপি ফাংশন

ক) পরামিতি ছাড়াই সরল পুনর্নির্দেশ

<?php
   header('Location: index.php');
?>

খ) জিইটি পরামিতিগুলির সাথে পুনঃনির্দেশ করুন

<?php
      $id = 2;
      header("Location: index.php?id=$id&msg=succesfully redirect");
  ?>

২. পিএইচপি-তে জাভাস্ক্রিপ্টের মাধ্যমে পুনর্নির্দেশ করুন

ক) পরামিতি ছাড়াই সরল পুনর্নির্দেশ

<?php
     echo "<script>location.href='index.php';</script>";
 ?>

খ) জিইটি পরামিতিগুলির সাথে পুনঃনির্দেশ করুন

<?php
     $id = 2;
     echo "<script>location.href='index.php?id=$id&msg=succesfully redirect';</script>";
   ?>

জাভাস্ক্রিপ্ট বিটটি একরকম ছিল যা সাইটের চূড়ান্ত হোস্টিংয়ে কাজ করছিল; আমি বিশ্বাস করি এটি ক্যাশিংয়ের বিষয় তবে এর সাথে সাথেই এটি সমাধান করেছি।
সিডিসেনজ

3

আমরা এটি দুটি উপায়ে করতে পারি:

  1. ব্যবহারকারী আসে https://bskud.com/PINCODE/BIHAR/index.php তারপর পুনর্নির্দেশ https://bskud.com/PINCODE/BIHAR.php

    নীচের পিএইচপি কোড দ্বারা

    <?php
        header("Location: https://bskud.com/PINCODE/BIHAR.php");
        exit;
    ?>

    উপরের কোডটি https://bskud.com/PINCODE/BIHAR/index.php এ সংরক্ষণ করুন

  2. কোনও শর্ত সত্য হলে অন্য পৃষ্ঠায় পুনর্নির্দেশ করুন:

    <?php
        $myVar = "bskud";
        if ($myVar == "bskud") {
    ?>
    
    <script> window.location.href="https://bskud.com";  </script>
    
    <?php
        }
        else {
            echo "<b>Check the website name again</b>";
        }
    ?>

এটা কি? আপনার নিজের ওয়েবসাইটে লিঙ্ক ব্যবহার করবেন না দয়া করে। এবং দ্বিতীয় উদাহরণটি জাভাস্ক্রিপ্ট পুনর্নির্দেশ ব্যবহার করে এবং পিএইচপি header()ফাংশনটি ব্যবহার করে না ।
স্ক্রিপ্টম্যান

2

ব্যবহার করুন:

<?php
    $url = "targetpage"
    function redirect$url(){
        if (headers_sent()) == false{
            echo '<script>window.location.href="' . $url . '";</script>';
        }
    }
?>

1
আপনি কি আপনার কোড এর ফাংশন ব্যাখ্যা করতে পারেন? আপনার উত্তরটির দৈর্ঘ্য এবং সামগ্রীর কারণে পতাকাঙ্কিত হয়েছিল।
www139

2

এটি করার একাধিক উপায় রয়েছে তবে আপনি যদি পছন্দ করেন তবে phpআমি header()ফাংশনটি ব্যবহারের পরামর্শ দেব ।

মূলত

$your_target_url = www.example.com/index.php”;
header(“Location : $your_target_url”);
exit();

যদি আপনি এটি একটি খাঁজ আপ লাথি পেতে চান, এটি ফাংশন এ ব্যবহার করা ভাল। এইভাবে, আপনি এটিতে প্রমাণীকরণ এবং অন্যান্য চেকিং এলিমেন্ট যুক্ত করতে সক্ষম হন।

ব্যবহারকারীর স্তরটি পরীক্ষা করে চেষ্টা করি।

সুতরাং, ধরুন আপনি একটি অধিবেশন ব্যবহারকারীর কর্তৃপক্ষের স্তর সংরক্ষণ করেছেন u_auth

মধ্যে function.php

<?php
    function authRedirect($get_auth_level,
                          $required_level,
                          $if_fail_link = www.example.com/index.php”){
        if ($get_auth_level != $required_level){
            header(location : $if_fail_link);
            return false;
            exit();
        }
        else{
            return true;
        }
     }

     . . .

তারপরে আপনি প্রতিটি পৃষ্ঠার জন্য ফাংশনটি কল করবেন যা আপনি প্রমাণীকরণ করতে চান।

page.phpঅন্য যে কোনও পৃষ্ঠাতে লাইক দিন ।

<?php

    // page.php

    require function.php

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 5
    authRedirect($_SESSION[‘u_auth’], 5);

    // Redirects to www.example.com/index.php if the
    // user isn’t authentication level 4
    authRedirect($_SESSION[‘u_auth’], 4);

    // Redirects to www.someotherplace.com/somepage.php if the
    // user isn’t authentication level 2
    authRedirect($_SESSION[‘u_auth’], 2, www.someotherplace.com/somepage.php”);

    . . .

তথ্যসূত্র;


2

আমি সময়ের সাথে সাথে পুনঃনির্দেশের ধরণটি পছন্দ করি।

<?php

header("Refresh: 5;url=índex.php");

2

রাউটিংয়ের জন্য শিরোনাম ফাংশন ব্যবহার করা

<?php
     header('Location: B.php');
     exit();
?>

মনে করুন আমরা এ.এফ.পি ফাইল থেকে বিএইচপি পর্যন্ত যেতে চাইছি<button> বা তার সাহায্য নিতে হবে তার চেয়ে বেশি <a>। একটি উদাহরণ দেখতে দিন

<?php
if(isset($_GET['go_to_page_b'])) {
    header('Location: B.php');
    exit();

}
?>

<p>I am page A</p>
<button name='go_to_page_b'>Page B</button>

B.php

<p> I am Page B</p>

আপনি সঠিক সমাধান প্রদান করতে পারেন বা একটি ভাল?
মেহেদী আবদুল্লাহ

ইতিমধ্যে প্রচুর সমাধান রয়েছে। আপনার সমাধানটিতে পিএইচপি ট্যাগ ছাড়াই এইচটিএমএল এবং পিএইচপি মিশ্রিত রয়েছে। দ্বিতীয়ত আপনি এইচটিএমএল কোড প্রিন্ট করার পরে শিরোনাম প্রেরণ করেন, এটি কার্যকর হবে না। এবং উদাহরণস্বরূপ ফাইলগুলির নাম খারাপ। আপনি তাদের এএফপি এবং বিএফপি নামকরণ করবেন না। আমি জানি এটি কেবল উদাহরণ, তবে তবুও আপনার নামকরণ কনভেনশন সম্পর্কে যত্ন নেওয়া উচিত।
তাজনি

1

আপনি যদি আপাচে চলছেন তবে আপনি পুনর্নির্দেশের জন্য .htaccess ব্যবহার করতে পারেন।

Redirect 301 / http://new-site.com/

1

headerপুনর্নির্দেশ করতে আপনি পিএইচপি ফাংশনটি ব্যবহার করার চেষ্টা করতে পারেন । আপনি আউটপুট বাফার সেট করতে চাইবেন যাতে আপনার ব্রাউজারটি স্ক্রিনে পুনর্নির্দেশের সতর্কতাটি ফেলে না।

ob_start();
header("Location: " . $website);
ob_end_flush();

1
শিরোনাম () এর সাথে সাথে প্রস্থান () ব্যবহার করা উচিত। এছাড়াও আউট বাফারিং কিছু সময়ের জন্য স্বয়ংক্রিয়ভাবে ডিফল্ট হয়ে গেছে।
EKanadily

0

আর একবার চেষ্টা কর

 $url = $_SERVER['HTTP_REFERER'];
 redirect($url);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.