PDA

View Full Version : سوال: مشکل در انتقال به صفحه دیگر در host



sama01
جمعه 28 تیر 1387, 19:20 عصر
در local هیچ مشکلی ندارم. ولی در Host هیچ اتفاقی رخ نمی‌ده.


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


دلیلش و راه حلش چیه؟

sama01
شنبه 29 تیر 1387, 03:25 صبح
تو بررسی‌هایی که خودم کردم به این نتیجه رسیدم که قبل از فرمان header، به هر دلیلی header فرستاده شده.
جالب این‌جاست که در local مشکلی پیش نمی‌آد. ولی در host که البته لینوکسه، نسبت به این رویداد حساسیت نشان داده می‌شه.

کسی در مورد زمان ارسال header اطلاعاتی داره؟

tabib_m
شنبه 29 تیر 1387, 09:17 صبح
اگر دقیقا همون فایلی که روی لوکال تست میکنی رو میفرستی، نمیشه که هدرها در دو زمان مختلف ارسال بشن.
عمدتا هدرها زمانی ارسال میشن که چیزی echo بشه (کد های خارج از دستورات php هم شامل این قضیه میشن!)
اگر برنامه error میده، لطفا اینجا بذارش...

موفق باشید.

vahid4134
شنبه 29 تیر 1387, 10:39 صبح
شاید توی لوکالت output_buffering روشن هست ولی توی هاستت نه

yaqubian
شنبه 29 تیر 1387, 22:58 عصر
دوست عزیز
بهتره بجای header از دستور زیر استفاده کنی!
چون تو خیلی از موارد header کار نمی کنه!
موفق باشید

sama01
جمعه 04 مرداد 1387, 00:24 صبح
ممنونم.
در واقع پیام خطایی که در log‌ذخیره می‌شه چنین چیزی است:


[23-Jul-2008 19:29:23] PHP Warning: Cannot modify header information - headers already sent by (output started at /home/*******.php:36) in /home/*******.php on line 63

فعلا مشکل را با کد جناب یعقوبیان رفع کردم.
ولی سعی می‌کنم دلیل اصلی را پیدا و در صورت مفید بودن در همین‌جا درج کنم.

باز هم ممنونم.

tabib_m
شنبه 05 مرداد 1387, 09:58 صبح
http://barnamenevis.org/forum/search.php?searchid=978452

sama01
سه شنبه 08 مرداد 1387, 21:48 عصر
منظورتان را متوجه نشدم.
لینک جستجوی شما، حاوی هیچ موردی نیست. و من هم در جستجوهای پیشینم، به موردی بر نخورده‌ام.

tabib_m
چهارشنبه 09 مرداد 1387, 19:25 عصر
در خط 36 برنامه تون، چیزی echo یا ... شده که باعث شده هدرها ارسال بشن، طبیعتا بعد از اون دیگه نمیشه از دستورات هدر استفاده کرد.
قبل از استفاده از هدر، هیچ چیزی نباید به مرورگر ارسال شده باشه (چه echo شده باشه، و چه خارج از دستورات php باشه، چون همون حکم echo رو داره)

موفق باشید.

sama01
چهارشنبه 09 مرداد 1387, 20:25 عصر
فکر می‌کنم منظورتون رو متوجه شده باشم. یعنی header باید قبل از ثبت هر چیز دیگری در صفحه، ارسال شود. این کد را نگاه کنید:


<?php
include_once('../functions.php');
include_once('adminFuncs.php');
include_once('../global_var.php');

if (!isLogin()) {
echo ("<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=../login.php\">");
exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>مدیریت سایت</title>
<link href="../style.css" rel="stylesheet" type="text/css" />
<script src="../ajax.js" language="javascript" type="text/javascript"></script>

</head>

این کد در ابتدای صفحه‌ی مدیریت سایت قرار دارد. قبلا برای رفتن به صفحه login مشکل داشتم که به این شکل حلش کردم. ولی همان‌طور که می‌بینید، قبل از این خط، هیچ کدی برای صفحه HTML ارسال نشده.
الآن هم مشکل دیگری که دارم مربوط به جای دیگری است که البته به همین چند خط بر می‌گردد.
در این صفحه، بر اساس queryString مشخص می‌شود که چه محتوایی باید نمایش یابد که این کار توسط کدهایی که در فایل adminFuncs.php وجود دارد انجام می‌شود. یک از این حالت‌ها مربوط به بخش تنظیمات سایت است. وقتی در صفحه تنظیمات روی دکمه کلیک می‌شود، باید صفحه بعد از تغییر تنظیمات در db به صفحه‌ی دیگری منتقل شود. تنظیمات اعمال می‌شوند. ولی عمل انتقال انجام نمی‌شود. در فایل error_log هم این طور گفته شده است که در خط 17 فایل اصلی (که کد آن در بالا آمده است)، header ارسال شده است.

من الآن کمی گیج شده‌ام.
روی لوکال اصلا مشکلی نیست. ولی روی هاست این اتفاقات رخ می‌دهد که احتمالا به خاطر حساسیت لینوکسه. درسته؟

نمی‌دونم چه‌قدر توضیحاتم واضح بود. ممنون می‌شم کمکم کنید.

tabib_m
پنج شنبه 10 مرداد 1387, 10:21 صبح
وقتی یک فایل رو توی برنامه ت include میکنی، حکم این رو داره که تمامی محتوای اون فایل توی همین کدت وجود داره! کافیه که توی یکی از این سه تا فایلی که قبل از دستور هدر include کردی، چیزی echo شده باشه!! اونوقت هدرها ارسال میشن! در ضمن، بهتره به جای meta از همون header استفاده کنی و بعد از استفاده از دستور هدر، از دستور end استفاده کن... (کد فعلیت، هیچ امنیتی نداره!!!)
****
اگر وضعیت ارسال هدرها در لوکال و در هاست با هم فرق دارن، حتما یکی از فایلهات رو لوکال با روی هاست فرق داره! از این که همه ی فایل هات کاملا مشابه هستن مطمئن شو...

موفق باشید.

sama01
پنج شنبه 10 مرداد 1387, 10:42 صبح
خیلی ممنونم دوست عزیز.
همه‌ی فایل‌ها به جز فایل functions.php یکی هستند که تفاوت این دو فایل هم تنها در مشخصات اتصال به db است.
من قبلا دیده بودم که بعد از دستور header از exit‌ استفاده می‌شه که همین کار را هم کردم. منظورتان این است که به جای exit از end استفاده کنم؟ در مورد امنیت، آیا با این تغییر، مشکل رفع می‌شه؟

tabib_m
پنج شنبه 10 مرداد 1387, 17:07 عصر
همه‌ی فایل‌ها به جز فایل functions.php یکی هستند که تفاوت این دو فایل هم تنها در مشخصات اتصال به db است.
نمیدونم... مطمئنی که روی لوکال درست جواب میده؟ یا این که ممکنه فقط خطا نمایش داده نمیشه؟


من قبلا دیده بودم که بعد از دستور header از exit‌ استفاده می‌شه که همین کار را هم کردم. منظورتان این است که به جای exit از end استفاده کنم؟ در مورد امنیت، آیا با این تغییر، مشکل رفع می‌شه؟
:D ببخشید، میخواستم بنویسم die() نوشتم end!!
دستور die با exit فرقی نمیکنه... هر دو باعث میشن که کد به پایان برسه... مشکل اصلی کدت اینه که داری از meta استفاده میکنی... meta برای جاهایی که انتقال واجب هست، به درد نمیخوره، چون به رااااحتی قابل دور زدنه... در هر صورت، مهم اون die یا exit بعد از ریداریکت هست که باعث میشه در هر شرایطی اگر هم عمل ریدایرکت صورت نگرفت، کد به پایان برسه و صفحه برای کاربر ملاحظه نشه...

موفق باشید.

sama01
جمعه 18 مرداد 1387, 11:48 صبح
در ارتباط با این مشکل، خواندن این مطلب رو پیشنهاد می‌کنم.

کاربرد بافر کردن خروجی با ()header و ()setcookie (http://www.blog.phpmystery.com/?plink=43)

در این مطلب چگونگی ممانعت از ارسال محتوا پیش از ارسال header ها توضیح داده شده است. بدین ترتیب دیگر چنین خطایی رخ نمی‌دهد:

Cannot add header information - headers already sent
البته درمان درد نیست. ولی می‌شه به طور موقتی به عنوان مسکن مورد استفاده قرار داد.

tabib_m
شنبه 19 مرداد 1387, 00:46 صبح
البته بافر کردن، استفاده ی خودش رو داره و باید در موارد مورد نیاز ازش استفاده کرد و استفاده از بافر صرفا برای جلوگیری از ارسال هدرها (برای عدم برخورد با خطای مذکور) کار صحیحی نیست و نتایج نامطلوبی داره!