代码中的HTTP请求与web浏览器中的HTTP请求的区别


Difference Between HTTP request in code vs web browser

我想知道从代码的标准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脚本创建的,你可以自己看看!(虽然这可能是一个安全问题,可能不能完美地工作。)