HTML-страница не получает куки через libcurl - PullRequest
0 голосов
/ 16 мая 2011

я изменил свой предыдущий код. вы можете увидеть мой предыдущий пост, если ваш установил cookie через curl Но вот новое начало, мой новый код выглядит следующим образом у меня есть php-файл с использованием curl, как это

<?php
$ch=curl_init();
$url="http://localhost/javascript%20cookies/test_cookies.php";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_COOKIEFILE,dirname(__FILE__) . "/cookie.txt");
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_exec($ch);
curl_close($ch);
?>

файл test_cookies.php выглядит следующим образом

<?php
if($_COOKIE['user']==1)
{
header("Set-Cookie:user=1; color=blue");
header("Location:http://localhost/javascript%20cookies/test_cookies.html");
}
?>

файл test_cookies.html содержит некоторый javascript, который проверяет наличие файлов cookie, и, если он находит эти файлы cookie, он соответствующим образом отображает текст. php-файл с кодом curl отправляет файлы cookie, а test_cookies.php устанавливает файлы cookie и перенаправляет на страницу test_cookies.html но эта страница не получает куки и, следовательно, не отображает содержимое соответствующим образом. может кто-нибудь сказать мне, в чем проблема сейчас?

вот заголовки, которые я отображаю в Firefox при установке CURLOPT_HEADER в true

HTTP/1.1 302 Found Date: Mon, 16 May 2011 15:03:59 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 X-Powered-By: PHP/5.3.1 Set-Cookie: user=1; color=blue Location: http://localhost/javascript%20cookies/test_cookies.html Content-Length: 0 Content-Type: text/html HTTP/1.1 200 OK Date: Mon, 16 May 2011 15:03:59 GMT Server: Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 mod_apreq2-20090110/2.7.1 mod_perl/2.0.4 Perl/v5.10.1 Last-Modified: Mon, 16 May 2011 12:13:24 GMT ETag: "11000000013d0c-493-4a363950a70f3" Accept-Ranges: bytes Content-Length: 1171 Content-Type: text/html

Вы можете видеть, что отображаются два набора заголовков. Это потому, что я делаю 2 вызова в заголовок?

Ответы [ 2 ]

1 голос
/ 18 мая 2011

Теперь я объясню, что я пытался сделать.У меня была html-страница с запросом некоторого кода подтверждения, а затем он отправил этот код проверки в php-скрипт, который при проверке кода установил cookie и перенаправил на ту же html-страницу.html-страница имела некоторый внешне связанный javascript, который при проверке значения cookie отображал содержимое страницы с некоторыми изменениями.я сейчас пишу код для этого

HTML-файл с содержанием и формой

test_cookies.html

    //some css,javascript and html and then a form
<form method="post" action="http://localhost/javascript%20cookies/test_cookies.php">

php-файл, который проверяеткод

test_cookies.php

if($_POST['value']=="code")
setcookie("user",1);
if($_POST['value']!="code")
setcookie("user",1,time()-1);
header("Location:http://localhost/javascript%20cookies/test_cookies.html");

и теперь файл php с кодом curl

curl_cookies.php

<?php
$ch=curl_init();
$url="http://localhost/javascript%20cookies/test_cookies.php";
$post="value=code";     //here i have hard-coded the pst value for a demo but i could have got this from the user
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_HEADER,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$res=curl_exec($ch);
curl_close($ch);
preg_match('/Location: (.*)\s/',$res,$location);
preg_match('/Set-Cookie: (.*)\s/',$res,$cookie);
$cookie=rtrim($cookie[0])."; path=/ ";         //path needed to be changed because curl_cookies.php and test_cookies.html are in different directories. 
header($cookie);
header($location[0]);
?>

это наконец сработало, и браузер отображает измененный контент.эта вещь научила меня многому о http.Спасибо всем, кто помог мне, когда я был в темноте.

1 голос
/ 17 мая 2011

Не ясно, чего вы пытаетесь достичь с помощью кода. Вам лучше помочь, если вы объясните, почему вы это делаете. Вполне вероятно, что ваш подход неверен, и вы можете получить конечный результат с другим / более простым подходом.

А теперь, чтобы ответить на ваш вопрос, вот что происходит:

  1. Из вашего браузера вы отправляете запрос GET на curl.php (имя, которое я использую для вашего первого файла),
  2. curl в этом файле проверяет cookie.txt и находит user=1, поэтому он отправляет запрос GET на test_cookies.php и отправляет cookie с запросом
  3. test_cookies.php видит, что user=1 имеет значение true, поэтому отправляет заголовок на curl.php и просит установить два куки: user=1 и color=blue (для первого куки это бессмысленно, user = 1 уже установлен, но давайте проигнорируем это, поскольку никакого вреда не причинено)
  4. Вы не установили опцию CURLOPT_COOKIEJAR, поэтому, когда curl.php получает заданный заголовок файла cookie, это не наплевать (ничего не происходит)
  5. Далее test_cookies.php отправляет заголовок перенаправления на curl.php, так как вы установили CURLOPT_FOLLOWLOCATION,1, curl.php отправляет еще один запрос GET, на этот раз, чтобы получить test_cookies.html
  6. Содержимое test_cookies.html возвращается к curl.php,
  7. curl_exec($ch); вызывает возврат содержимого (источник test_cookies.html) в ваш браузер,
  8. Ваш браузер анализирует то, что он получил, и выполняется JavaScript. Он проверяет наличие cookie с именем user и не находит его, поэтому отображает содержимое, если cookie не существует (потому что его нет).

Теперь вы можете спросить, что произойдет, если вы добавите:

curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__) . "/cookie.txt");

В результате ваш cookie.txt будет обновлен на шаге 4 и будет иметь два куки; user=1 и color=blue. Но это НЕ дает ожидаемого результата. Потому что header("Set-Cookie:user=1; color=blue"); инструктирует curl для установки cookie, и curl делает это, сохраняя cookie в файле, который вы указали в опции CURLOPT_COOKIEJAR. Таким образом, даже если вы добавили эту опцию, когда вы достигнете шага 8, javascript не найдет этот cookie, поскольку используемый вами браузер не знает или не заботится о вашем cookie.txt, он ищет в другом месте, чтобы проверить, существует ли cookie. Например, в Google Chrome формат SQLite, а для XP куки хранятся в %USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default\Cookies.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...