我想知道从代码的标准http请求与提交html表单发送的请求之间是否有任何区别。当然会有一些明显的东西,比如用户代理等等。
我想发送一个请求到页面,页面将创建一个会话变量。目前,我有一个PHP脚本,正在生成一个HTTP请求(我已经尝试curl &File_get_contents(使用stream_context_create)到页面并回拉响应。这个PHP页面也有一些javascript将使用ajax来生成完全相同的请求。
当PHP在没有JS的情况下创建请求时,会话被创建并在响应中返回,但是当我访问一个新页面时,会话已经死亡。当我单独使用ajax时,请求返回会话数据,当我访问其他页面时,会话仍然存在。注意:我还尝试使用html表单并将其发送到url,这也可以使会话保持活跃。
我不明白为什么会发生这种事。我唯一的想法是,它可能是由php请求和ajax请求的默认值之间的一些差异引起的。
请求页面内容
session_start();
$_SESSION['message'] = "Works";
var_dump($_SESSION);
脚本内容
<?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"
}
我不明白为什么两个相同的请求会这样做。我也试图从ASP执行post请求。. NET脚本和我有同样的问题。浏览器生成的请求与代码请求之间一定有不同之处。
注意:我已经尝试过使用http和https。我从来没有得到任何错误。响应总是正确的。
php脚本在使用php 5.4的IIS8服务器上运行
是的,实际上会有很多不同。
由于您通过代码请求的页面很可能是由人类在web浏览器中浏览的,因此它将具有各种技术-主要是cookie和javascript。
你的PHP脚本将无法处理JavaScript(即:说5秒后你登陆在浏览器的页面,一个<div></div>
被写入DOM与一个值从远程服务器获取-你的PHP脚本不会得到这个),除非你使用一个无头浏览器-如PhantomJS。
当PHP在没有JS的情况下创建请求时,会话被创建并在响应中返回,但是当我访问一个新页面时,会话已经死亡。
您的PHP代码不会为下次访问该网页存储cookie(在当前设置下)。cURL
支持cookiejar选项(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);
当PHP在没有JS的情况下创建请求时,会话被创建并在响应中返回,但是当我访问一个新页面时,会话已经死亡。
当PHP创建请求时,会话不会持久化到浏览器。
你可以尝试使用一些。js在浏览器上设置一个PHPSESSID
cookie,会话ID是通过PHP脚本创建的,你可以自己看看!(虽然这可能是一个安全问题,可能不能完美地工作。)