php 7 - " HTTP_X_REQUESTED_WITH" => " XMLHttpRequest的" - 无处不在

时间:2015-09-29 15:11:17

标签: php ajax nginx

我花了很多时间来讨论这个案子,但我无法理解它是如何产生的。 所以。我有遗留的PHP应用程序。 现在它正在开发以下环境:

PHP 5.6.10-1+deb.sury.org~trusty+1 (cli) 
Zend Engine v2.6.0 with Zend OPcache v7.0.6-dev

nginx/1.4.6

测试我设置php-7

PHP 7.0.0RC3 (cli) 
Zend Engine v3.0.0-dev, with Zend OPcache v7.0.6-dev

nginx/1.4.6

所以,案例。 我第一次加载页面: http://storage3.static.itmages.com/i/15/0929/h_1443537572_8408994_b7e2156e5f.png

加载页面后,执行了几个ajax请求。

重新加载页面后,在$ _SERVER变量中我们有 HTTP_X_REQUESTED_WITH http://storage3.static.itmages.com/i/15/0929/h_1443538095_6543758_9b4a478a13.png

但正如您在请求标头中看到的那样,我们已经知道了此标头。 您可以在下面看到来自nginx(访问日志)

的标题

Ajax请求

10.0.2.2 - - [29/Sep/2015:15:00:44 +0300] "GET /stat/notifications-count HTTP/1.1" 200 30341 "http://vm-hub.dev:8888/client" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-" "no-store, no-cache, must-revalidate" "XMLHttpRequest"

和正常请求

10.0.2.2 - - [29/Sep/2015:15:14:32 +0300] "GET /client HTTP/1.1" 200 95434 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36" "-" "no-store, no-cache, must-revalidate" "-"

所以:浏览器没有发送此标头。 Nginx也没有看到也没有发送此标题。但在$ _SERVER中,此标题存在。

我创建了一个小的php sript,它只转储$ _SERVER变量。在上述情况之后我从浏览器运行它 http://storage2.static.itmages.com/i/15/0929/h_1443538918_1985783_dcff1bacfb.png

并且存在HTTP_X_REQUESTED_WITH。

我无法定义 - 是这个php bug还是其他软bug。

任何人都可以提供一些建议吗?

也许某些来自php团队的人阅读了这个问题,可以对此案进行评论吗?

从这里安装PHP:https://launchpad.net/~ondrej/+archive/ubuntu/php-7.0 和一些手动编译的模块。

nginx.conf

user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    client_max_body_size 200M;


        log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for" "$sent_http_cache_control" "$http_x_requested_with"';



    sendfile on;
    keepalive_timeout 65;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;


    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

site.conf

server {
    listen 80;
    server_name vm-hub.dev www.vm-hub.dev;

    root /media/sf_data/projects/hub/html/hub/public;
    index index.php;

    log_not_found off;
    charset utf-8;

    error_log /media/sf_data/projects/hub/html/hub/log/error.log;
    access_log /media/sf_data/projects/hub/html/hub/log/access.log main;

    try_files $uri @rewriteapp;

    location = /favicon.ico { log_not_found off; access_log off; }

    location @rewriteapp {
        fastcgi_pass 127.0.0.1:9000;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME /media/sf_data/projects/hub/html/hub/public/index.php;
        fastcgi_param  HTTPS off;
        fastcgi_param  APPLICATION_ENV dev;
    }
}

重要:此应用程序在相同版本的Ubuntu,nginx,mysql上进行生产。不同的只有PHP版本。 这就是为什么我认为php中的问题。

UPDATE1。关于问题的更多细节 在应用程序中,我们有以下代码

if ($request->isXmlHttpRequest()) {
    return new JsonResponse([/*any data*/]);
} else {
    return new Response('tempalte render');
}

请求和响应(JsonResponse) - 这是Symfony HttpFoundation组件。 所以,当我第一次加载页面时 - 模板渲染。但是当我重新加载页面时,请求被定义为AJAX,并返回JsonResponse。 但这种行为是永久性的。现在我无法确定出现的条件。

更新2。 当我发现这个错误时,我尝试:

  1. 重新启动nginx - 没有任何改变。
  2. 重启php-fpm - 错误消失
  3. 所以,一切都表明错误发生在php。

    更新3 - 有罪。

    我认为有罪 - fastcgi_finish_request(); 您可以在下面找到用于检查此行为的测试脚本。 我测试一下:

    1. PHP7 RC3 - 存在错误
    2. PHP 5.6.13 - 缺少错误
    3. test script gist

1 个答案:

答案 0 :(得分:0)

这是RC3中的错误。 已在RC4中修复

https://bugs.php.net/bug.php?id=70607