اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

الكود التالي يعمل في اماكن معينة في الكود وأماكن لا

header("location:404");

إ1ا أضفته في أول الصفحة فإنه يعمل ولكن لا يعمل في وسطها ولا أخرها

بحثت عن هذا الموضوع فوجدت هذا الجواب 

https://stackoverflow.com/questions/423860/php-header-redirect-not-working

وأظن انه الجواب الصحيح جدا ولكن لم أفهمه بالرغم من لغتي الإنجليزية الجيدة فهل أحد ما يعرض لي حل مشكلتي مشكوراَ؟

Recommended Posts

  • 0
نشر

مرحبًا محمود.

المقصود من هذه الإجابة هو أنه حتى تعمل ( )header يجب أن يتم استدعائها قبل أن يتم إرسال أي output، سواءً كان هذا الناتج سطور أكواد html أو سطور فارغة.

و هذا ما ينص عليه php header manual

اقتباس

Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.

مثال:

<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

و هذا ما يفسر المشكلة التي تظهر لك

  • 0
نشر
بتاريخ 19 دقائق مضت قال Yomna Raouf:

 


<html>
<?php
/* This will give an error. Note the output
 * above, which is before the header() call */
header('Location: http://www.example.com/');
exit;
?>

 

شكرا على التوضيح ولكن اريد منك توضيح اخر اذا سمحتي :)

كود الphp الخاص بي على سبيل المسال هكذا

<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
	header("location: 404");
}

فإن هذا الكود لا يعمل وقد فهمت منك سبب عدم العمل وهو وجود output قبل ارسال الheader

ولكن انا اريد فعليا عمل redirect اذا لم يتحقق الشرط فكيف افعلها؟؟

حاولت بإستخدام هذا الكود ونفعت

<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
	?>
	<script>
		location.href = '404';
	</script>
	<?php
}

فأرجو الإفادة هل هذه هي الطريقة الأمثل لعمل redirect ??

  • 0
نشر
بتاريخ 3 ساعات قال محمود رضا موسى:

شكرا على التوضيح ولكن اريد منك توضيح اخر اذا سمحتي :)

كود الphp الخاص بي على سبيل المسال هكذا


<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
	header("location: 404");
}

فإن هذا الكود لا يعمل وقد فهمت منك سبب عدم العمل وهو وجود output قبل ارسال الheader

ولكن انا اريد فعليا عمل redirect اذا لم يتحقق الشرط فكيف افعلها؟؟

حاولت بإستخدام هذا الكود ونفعت


<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
	?>
	<script>
		location.href = '404';
	</script>
	<?php
}

فأرجو الإفادة هل هذه هي الطريقة الأمثل لعمل redirect ??

هذه ليست الطريقة المثلى لعمل ذلك.

لعمل ما تريد بدلاً من:

<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
	header("location: 404");
}

اكتب:

<?php

if(isset($_GET['name'])){
	?>
	<div>
      Hello: <?php echo $_GET['name'];?>
	</div>
	<?php
}else{
    http_response_code(303);
    header("location: 404");
}

لاحظ السطر المضاف وهو http_response_code وستسأل لماذا ؟

 

ﻷن المتصفح لا يكفيه فقط أن تعطيه Location header بل يحتاج للـhttp response أن يكون أحد أكواد redirect وفي مثالنا استعملنا 303 http status code والذي يعني See Other ، في كودك السابق كان status code هو 200 لذلك لم يقم المتصفح بـredirect

 

وفي مثالك الذي قلت بأنه عمل تعتمد على الجافاسكريبت للـredirect وهذه الطريقة غير مفضلة طالما أن السيرفر هو من عليه أن يقوم بالـredirect.

  • 0
نشر
بتاريخ 5 ساعات قال محمود رضا موسى:

فأرجو الإفادة هل هذه هي الطريقة الأمثل لعمل redirect ??

مرحبا محمود،

نعم يمكننا عمل إعادة التوجيه عن طريق جافاسكربت كما فعلت في الشيفرة البرمجية الثانية.

التي تضمنت:

<script>
	location.href = '404';
</script>

or
window.location.href='404';

ربما لن تعمل في حال تم إيقاف جافاسكربت في المتصفح (يحدث إعادة التوجيه هنا ف المتصفح وليس المخدم)

قم بتجريب التالي وأخبرنا بالنتائج:

<?php

if(!isset($_GET['name'])){
  header("location: 404");
  exit(); // or die(); or exit
}

?>

<div>
  Hello: <?php echo $_GET['name'];?>
</div>

نستخدم exit - die لنتأكد من توقف عمل الشيفرة البرمجية قبل إرسالها لعناصر HTML في حال تأخر تنفيذ إعادة التوجيه.

يمكنك تحديد باراميترات تابع إعادة التوجيه بالقيم التالية:

301 في حال كنت تريد إخبار أن الصفحة الحالية تم نقلها لمكان آخر بشكل دائم

302 تم نقل الصفحة بشكل مؤقت..

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

وعليك التأكد من أن ترميز الصفحة يتم باستخدام UTF-8 في ملف php.ini 

default_charset = "utf-8";

بالتوفيق

  • 0
نشر
بتاريخ On 1/4/2021 at 19:08 قال Wael Aljamal:

قم بتجريب التالي وأخبرنا بالنتائج:


<?php

if(!isset($_GET['name'])){
  header("location: 404");
  exit(); // or die(); or exit
}else{
  ?>
  <div>
    Hello: <?php echo $_GET['name'];?>
  </div>
	<?php
}

 

اشكركم جميعا على مشاركتكم ربما كان عليا عكس دالة if بحيث يكون الoutput تحت كود الredirect ولكن باقي الاجوبة لم تنفع ولكن اشكركم شكرا جزيلا على مشاركتكم 3>

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...