Я изменил свой предыдущий код. вы можете увидеть мой предыдущий пост, если ваш intersted настройки 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, но эта страница не принимает файлы cookie и, следовательно, не отображает контент соответствующим образом. может кто-нибудь сказать мне, в чем проблема сейчас?
вот заголовки, которые я отображаю в 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 вызова в заголовке?
Непонятно, чего вы пытаетесь достичь с помощью кода. Если вы объясните, почему вы это делаете, вам поможет. Вероятно, ваш подход неверен, и вы можете получить конечный результат с помощью другого / более простого подхода.
И теперь, чтобы ответить на ваш вопрос, вот что происходит:
curl.php
(имя, которое я использую для вашего первого файла), cookie.txt
и находит user=1
, поэтому он отправляет запрос GET на test_cookies.php
и отправляет cookie с запросом test_cookies.php
видит, что user=1
истинно, поэтому он отправляет заголовок curl.php
и просит его установить два user=1
cookie: user=1
и color=blue
(для первого файла cookie это бессмысленно, пользователь = 1 уже установлен , но давайте проигнорируем это, поскольку никакого вреда не будет сделано) CURLOPT_COOKIEJAR
, поэтому, когда curl.php
получает заданный заголовок cookie, он не чертовски (ничего не происходит) test_cookies.php
отправляет заголовок redirect в curl.php
, так как вы установили CURLOPT_FOLLOWLOCATION,1
, curl.php
отправляет другой запрос GET, на этот раз, чтобы получить test_cookies.html
test_cookies.html
возвращается curl.php
, curl_exec($ch);
приводит к тому, что возвращаемый контент (источник test_cookies.html
) будет отозван обратно в ваш браузер, user
и не находит его, поэтому он отображает содержимое, когда нет cookie (потому что его нет). Теперь вы можете задаться вопросом, что произойдет, если вы добавите:
curl_setopt($ch,CURLOPT_COOKIEJAR,dirname(__FILE__) . "/cookie.txt");
Случается, что ваш cookie.txt
будет обновлен на шаге 4 и будет иметь два cookie.txt
cookie; user=1
и color=blue
. Но это НЕ дает вам результат, которого вы ожидаете. Потому что header("Set-Cookie:user=1; color=blue");
инструктирует завиток, чтобы установить файл cookie, и завиток делает это, сохраняя файлы cookie в файле, указанном в опции CURLOPT_COOKIEJAR
. Таким образом, даже если вы добавили этот параметр, когда вы достигнете шага 8, javascript не найдет этот файл cookie, потому что используемый вами браузер не знает или не заботится о вашем cookie.txt
, он смотрит в другом месте, чтобы проверить, существует ли файл cookie. В Google Chrome, например, формат SQLite и для XP файлы cookie хранятся в %USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default\Cookies
.
теперь я объясню, что я пытался сделать. У меня была html-страница, в которой был запрошен некоторый код проверки, а затем он отправил этот код проверки в php-скрипт, который при проверке кода установил куки-файл и перенаправлен на одну и ту же страницу 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. Спасибо всем, кто помог мне, когда я был в темноте.