我想知道代码中的标准http请求与通过提交html表单发送的请求之间是否存在任何差异。当然会有明显的事情,比如用户代理和什么不是。
我想向页面发送请求,页面将创建会话变量。目前我有一个PHP脚本,它正在生成一个HTTP请求(我已尝试使用stream_context_create的curl& file_get_contents)并撤回响应。这个相同的PHP页面也有一些javascript将使用ajax生成完全相同的请求。
当PHP在没有JS的情况下创建请求时,会话创建并在响应中返回,但是当我访问新页面时,会话已经死亡。当我自己使用ajax时,请求返回会话数据,当我访问其他页面时,会话仍然存在。注意:我也尝试使用html表单并发布到网址,这也可以使会话保持活跃状态。
我无法弄清楚为什么会这样。我唯一的想法是它可能是由php请求的默认值和ajax请求之间的某些差异引起的。
请求页面内容
session_start();
$_SESSION['message'] = "Works";
var_dump($_SESSION);
PHP脚本内容
<?php
session_start();
var_dump($_SESSION);
error_reporting(E_ALL|E_STRICT);
$username = "test";
$password = "test";
$url = "https://website.com/test.php";
$postinfo = "username=".$username."&password=".$password;
// $ch = curl_init($url);
// curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo);
// curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
// curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
// $result = curl_exec($ch);
// curl_close($ch);
$data = array('username' => $username, 'password' => $password);
$options = array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($data)
)
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
var_dump($result);
?>
<?php echo time();?>
<form action="<?php echo $url;?>" method="post">
<input type="text" name="username"><br>
<input type="text" name="password"><br>
<input type="submit" value="submit">
</form>
<script src="https://code.jquery.com/jquery-3.1.1.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script>
$( document ).ready(function() {
$.ajax({
type: "POST",
url: "<?php echo $url;?>",
data: { username: '<?php echo $username;?>', password: '<?php echo $password;?>' },
success: function (content) {
alert(content);
console.log("Request Response = " + content);
},
fail: function (message) {
alert("Failure - " + message);
editmemberform.dialog('close');
}
});
});
</script>
当我运行脚本时,我从php请求获得的响应是
string(49) "array(1) { ["message"]=> string(5) "Works" } "
对我来说,这表明会话是在会话数据被转出时创建的。然后,ajax请求发出请求,响应完全相同。这是写入控制台的内容。
Request Response = array(1) {
["message"]=>
string(5) "Works"
}
我无法理解为什么2个相同的请求就像这样。我也尝试从ASP.NET脚本执行post请求,并且我遇到了同样的问题。浏览器生成的请求必须与代码请求有所不同。
注意:我使用http和https试过这个。我从来没有得到任何错误。答案总是正确的。
php脚本使用PHP 5.4在IIS8服务器上运行
答案 0 :(得分:1)
是的,实际上会有很多不同。
由于您通过代码请求的页面很可能是由人类在Web浏览器中浏览的,因此它将具有各种技术 - 主要是cookie和javascript。
您的PHP脚本将无法处理JavaScript(即:在浏览器中登陆页面5秒后,使用从远程服务器获取的值将<div></div>
写入DOM - 你的PHP脚本不会得到这个),除非你使用无头浏览器 - 例如PhantomJS。
当PHP在没有JS的情况下创建请求时,会话会在响应中创建并返回,但是当我访问新页面时,会话已经死亡。
您的PHP代码不会存储用于下次访问该网页的Cookie(在其当前设置下)。 cURL
支持Cookiejar option(CURLOPT_COOKIESESSION
,CURLOPT_COOKIEJAR
)来发送之前请求的Cookie。
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookie.txt");
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
有关详细信息,请参阅this comment on the manual。
答案 1 :(得分:0)
当PHP在没有JS的情况下创建请求时,会在响应中创建并返回会话,但是当我访问新页面时,会话已经死了。
当PHP创建请求时,会话不会持久存储到您的浏览器中。
你可以尝试使用一些.js在你的浏览器上设置一个PHPSESSID
cookie,其会话ID是通过你的PHP脚本创建的,以便自己查看! (虽然这可能是一个安全问题,但可能无法完美运行。)