PDA

View Full Version : سوال: مشکل در ارسال یک متغیر به صفحه ای خاص و نیز مشکل در دریافت لینک ارجاع به صفحه ای دیگر



Ali_Sedaghat
دوشنبه 10 آذر 1399, 21:37 عصر
با سلام خدمت دوستان
فرض کنید که من در صفحه ی اصلی سایتم قسمتی دارم که در اون جا، جدیدترین اخبار ورزشی قرار می گیره.
کاربر وقتی روی این لینک ها کلیک می کنه، وارد صفحه ای میشه که اون خبر در اون جا قرار داده شده.
حالا شما در نظر بگیرید که تعدادی لینک هستن که اصلا صفحه ای برای اون ها وجود نداره. بنابراین وقتی کاربر روی اون لینک ها کلیک می کنه، با پیام خطای 404 مواجه میشه مبنی بر عدم وجود صفحه ی مزبور.
من در فایل 404.html به ناچار از کدهای Html استفاده کردم که اگه لینکی وجود نداشت، کاربر به صفحه ی error.php ریدایرکت بشه. متأسفانه کدهای Php در اون فایل اصلا عمل نمی کنن.
حالا کارهایی که من می خوام انجام بدم و توش دچار مشکل هستم به این شرح هستند:
1. من چه طور می تونم بفهمم که کاربر روی کدوم لینک کلیک کرده؟
2. با کلیک کردن کاربر روی لینکی که پیام خطا میده و به صفحه ی error.php ریدایرکت میشه؛ چه طور میشه لینک ارجاع رو به طور کامل در صفحه ی error.php دریافت کرد؟
برای این کار من از تابع زیر در فایل error.php استفاده کردم.
این تابع در مرورگر کروم، اصلا لینک ارجاع رو نمایش نمیده. البته قبلا لینک ارجاعی رو نمایش می داد اما الان اصلا نمایش میده.
ولی مرورگر فایرفاکس لینک ارجاع رو نمایش میده و مشکلی نداره.


$_SERVER['HTTP_REFERER']

3. من قصد دارم یک سری داده هایی رو از فایل error.php که دارای هیچ فرم یا فیلدی نیست به فایل اصلی که news.php هست انتقال بدم؛ بدون این که فرمی تعریف کنم یا بخوام از دکمه ی Submit استفاده کنم.
برای این کار از Curl استفاده کردم، اما متأسفانه هیچ داده ای رو به فایل news.php انتقال نداد.
حتی من اومدم در فایل های error.php و news.php از تابع session_start هم استفاده کردم و از تابع زیر هم استفاده کردم اما هیچ نشستی رو از فایل error.php به فایل news.php انتقال نداد.


$_SESSION['Session_News_Url_Referer']

ممنون میشم در این رابطه منو راهنمایی کنید.
با احترام.

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


http://www.mysite.com/news/1
http://www.mysite.com/news/2
http://www.mysite.com/news/3
http://www.mysite.com/news/4

کدهای موجود در فایل 404.html


<html>
<body onload="window.location = 'http://www.mysite.com/error.php'"></body>
</html>

کدهای موجود در فایل error.php


<?php
session_start();
$News_Url_Referer = $_SERVER['HTTP_REFERER']; //دریافت لینک ارجاعی و ذخیره ی آن در متغیر

$_SESSION['Session_News_Url_Referer'] = $News_Url_Referer; //ذخیره ی لینک ارجاعی در متغیر نشست

if (strpos($News_Url_Referer, 'news')){ //چک کردن لینک ارجاعی مبنی بر وجود کلمه ی مورد نظر، اگر وجود داشت دستورات داخل بلاک اجرا می شوند و لینک ارجاعی به فایل مورد نظر از طریق متود پست، ارسال می شود
$ch = curl_init();
curl_setopt($ch ,CURLOPT_URL ,"http://www.mysite.com/news.php");
curl_setopt($ch ,CURLOPT_POST ,true);
curl_setopt($ch ,CURLOPT_POSTFIELDS ,"News_Url_Referer=".$News_Url_Referer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
curl_close($ch);
header ("location: news.php"); //انتقال به صفحه یا فایل اخبار
}
else
echo 'Error!';
?>

کدهای موجود در فایل news.php


<?php
session_start();

echo 'News_Url_Referer --->' .$_SESSION['Session_News_Url_Referer'] .'<br>'; //نمایش لینک ارجاعی در متغیر نشست

if(isset($_POST['News_Url_Referer'])) //بررسی وجود متغیر لینک اجرایی که توسط سی یو آر ال، ارسال شده بود
echo $_POST['News_Url_Referer']; //نمایش مقدار ذخیره شده در متغیر مورد نظر که همون لینک ارجاعی می باشد
else
echo 'Error!';
?>

plague
سه شنبه 11 آذر 1399, 14:51 عصر
رفر یعنی آدرس قبلی شما داری از فایل news.php کاربر رو میفرستی به 404.html و از اونجا کاربر رو به error.php میفرستی
در نتیجه توی صفحه error.php رفر 404.html هستش ... شما در واقع 2 آدرس قبل رو میخای نه آدرس قبلی رو


HTTP_REFERER چیزیه که توسط مرورگر ست میشه یعنی شما میری توی یک صفحه بعد از اونجا میری به صفحه دوم
اینجا مرورگر شما تصمیم مییره که وقتی میخای بری تو صفحه دوم آدرس صفحه اول رو توی HTTP_REFERER بزاره
به اینا میگن هدر میتونی راجبشون تحقیق کنی این تابع نیست و برای php ]م نیست بلکه مرورگر شماست که اینا رو مقدار دهی میکنه

من نمیدونم وقتی میری توی 404 این رو مقدار ست میکنه مرورگر یا نه باید تست کنی
اگه ست کنه به طور خلاصه شما باید رفر رو توی 404 بگیری با javascript و وقتی کاربر رو میفرستی به صفحه error این رو باهاش بفرستی توی GET



document.location = 'http://site.com/error.php?ref=' + encodeURIComponent(document.referrer);

بعد توی error.php از تو get درش بیاری



echo urldecode($_GET['ref']);

Ali_Sedaghat
سه شنبه 11 آذر 1399, 20:04 عصر
رفر یعنی آدرس قبلی شما داری از فایل news.php کاربر رو میفرستی به 404.html و از اونجا کاربر رو به error.php میفرستی
در نتیجه توی صفحه error.php رفر 404.html هستش ... شما در واقع 2 آدرس قبل رو میخای نه آدرس قبلی رو


HTTP_REFERER چیزیه که توسط مرورگر ست میشه یعنی شما میری توی یک صفحه بعد از اونجا میری به صفحه دوم
اینجا مرورگر شما تصمیم مییره که وقتی میخای بری تو صفحه دوم آدرس صفحه اول رو توی HTTP_REFERER بزاره
به اینا میگن هدر میتونی راجبشون تحقیق کنی این تابع نیست و برای php ]م نیست بلکه مرورگر شماست که اینا رو مقدار دهی میکنه

من نمیدونم وقتی میری توی 404 این رو مقدار ست میکنه مرورگر یا نه باید تست کنی
اگه ست کنه به طور خلاصه شما باید رفر رو توی 404 بگیری با javascript و وقتی کاربر رو میفرستی به صفحه error این رو باهاش بفرستی توی GET



document.location = 'http://site.com/error.php?ref=' + encodeURIComponent(document.referrer);

بعد توی error.php از تو get درش بیاری



echo urldecode($_GET['ref']);

سلام دوست عزیز
ممنونم از پاسخ شما.
فکر کنم منظور من رو خوب متوجه نشدید.
بگذارید یه مثال بزنم.
فرض کنید من در صفحه ی ایندکس (اصلی) سایتم قسمتی رو دارم که در اون جا اومدم از سایت ورزش ۳ اخبارش رو برداشتم.
چون نمی خوام آدرس سایت ورزش ۳ در لینک خبرها باشه بنابراین آدرس سایت اونو با سایت خودم عوض می کنم.
وقتی کاربر میاد روی لینک ها کلیک می کنه به جای این که وارد سایت ورزش ۳ بشه مرورگر میاد مسیر خبر رو در سایت من جست وجو می کنه که قاعدتا این مسیر وجود نداره و پیام ۴۰۴ براش ظاهر میشه.
بنابراین کاربر از صفحه ی ایندکس من به صفحه ی ۴۰۴ ارجاع داده میشه.
بعد در کدی که بالا فرستادم کاربر بعد از ارجاع به فایل ۴۰۴ به طور اتوماتیک به فایل error.php منتقل میشه.
بعد در این فایل کلمه new رو جست وجو می کنه.
اگه پیدا کنه باید کاربر رو به همراه لینک ارجاعی به فایل news.php منتقل کنه.

از این ها بگذریم.
من چه طور می تونم یه فرم درست کنم و بعد بیام بدون این که دکمه ی submit رو در فرم تعریف کنم داده ها رو به صفحه ای دیگه منتقل کنم؟
فکر کنم اگه بتونم این کار رو انجام بدم مشکلم حل بشه.
با تقدیم احترام.

Ali_Sedaghat
سه شنبه 11 آذر 1399, 21:08 عصر
سلام مجدد خدمت دوستان
یه سوال در رابطه با Curl دارم.
چرا کد زیر کار نمی کنه؟


$News_Url_Referer = http://www.mysite.com/news/1;
$ch = curl_init();
curl_setopt($ch ,CURLOPT_URL ,"http://www.mysite.com/news.php");
curl_setopt($ch ,CURLOPT_POST ,true);
curl_setopt($ch ,CURLOPT_POSTFIELDS ,"News_Url_Referer=".$News_Url_Referer);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$result = curl_exec($ch);
curl_close($ch);

چرا مقداری که به این فیلد (News_Url_Referer) اختصاص داده شده به فایل news.php ارسال نمیشه؟
من چه طور می تونم مقدار این فیلد (News_Url_Referer) را در فایل news.php دریافت کرده و چاپ کنم؟
ممنون میشم کمک کنید.
با سپاس

plague
چهارشنبه 12 آذر 1399, 16:28 عصر
سلام دوست عزیز
ممنونم از پاسخ شما.
فکر کنم منظور من رو خوب متوجه نشدید.
بگذارید یه مثال بزنم.
فرض کنید من در صفحه ی ایندکس (اصلی) سایتم قسمتی رو دارم که در اون جا اومدم از سایت ورزش ۳ اخبارش رو برداشتم.
چون نمی خوام آدرس سایت ورزش ۳ در لینک خبرها باشه بنابراین آدرس سایت اونو با سایت خودم عوض می کنم.
وقتی کاربر میاد روی لینک ها کلیک می کنه به جای این که وارد سایت ورزش ۳ بشه مرورگر میاد مسیر خبر رو در سایت من جست وجو می کنه که قاعدتا این مسیر وجود نداره و پیام ۴۰۴ براش ظاهر میشه.
بنابراین کاربر از صفحه ی ایندکس من به صفحه ی ۴۰۴ ارجاع داده میشه.
بعد در کدی که بالا فرستادم کاربر بعد از ارجاع به فایل ۴۰۴ به طور اتوماتیک به فایل error.php منتقل میشه.
بعد در این فایل کلمه new رو جست وجو می کنه.
اگه پیدا کنه باید کاربر رو به همراه لینک ارجاعی به فایل news.php منتقل کنه.

دوست عزیز این توضیح عملکرد سایت ست که من متوجه شدم
سوال شما این بود که چرا رفر رو نمیده و نمیتونم رفر رو بگیرم که من هم راجب رفر توضیح دادم



این curl




$error = false ;
$post_data = ['News_Url_Referer'=>$News_Url_Referer];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/news.php" );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$output = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
}

curl_close($ch);

if($error )
{
echo "ERROR : $error";
}


echo $output ;

در حالت عادی وقتی با مرورگر یه فرم رو ثبت میکنی اگر تو صفحه هدف اررو یا مشکلی باشه تو مرورگر میبینی و متوجه میشی
ولی شما وقتی با curl ارسال میکنی خروجی اون صفحه هدف رو باید بعدش چاپ کنی ببینی چی خروجی میده و اینجوری اگر ارروری هست متوجه بشی
همیشه وقتی curl جوابی که میخای رو نمیده خروجیش رو چاپ کن و تو صفحه هدف هم یه سری echo یا var_dump بزار که خروجی تولید کنن اینجوری متوجه میشی که چه اتفاقاتی افتاده اونور

Ali_Sedaghat
شنبه 13 دی 1399, 08:50 صبح
دوست عزیز این توضیح عملکرد سایت ست که من متوجه شدم
سوال شما این بود که چرا رفر رو نمیده و نمیتونم رفر رو بگیرم که من هم راجب رفر توضیح دادم



این curl




$error = false ;
$post_data = ['News_Url_Referer'=>$News_Url_Referer];
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.mysite.com/news.php" );
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322");
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);

$output = curl_exec($ch);
if (curl_errno($ch)) {
$error = curl_error($ch);
}

curl_close($ch);

if($error )
{
echo "ERROR : $error";
}


echo $output ;

در حالت عادی وقتی با مرورگر یه فرم رو ثبت میکنی اگر تو صفحه هدف اررو یا مشکلی باشه تو مرورگر میبینی و متوجه میشی
ولی شما وقتی با curl ارسال میکنی خروجی اون صفحه هدف رو باید بعدش چاپ کنی ببینی چی خروجی میده و اینجوری اگر ارروری هست متوجه بشی
همیشه وقتی curl جوابی که میخای رو نمیده خروجیش رو چاپ کن و تو صفحه هدف هم یه سری echo یا var_dump بزار که خروجی تولید کنن اینجوری متوجه میشی که چه اتفاقاتی افتاده اونور

سپاس فراوان بابت وقت و کدی که گذاشتید.