我花了很多时间来讨论这个案子,但我无法理解它是如何产生的。 所以。我有遗留的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。 当我发现这个错误时,我尝试:
所以,一切都表明错误发生在php。
更新3 - 有罪。
我认为有罪 - fastcgi_finish_request(); 您可以在下面找到用于检查此行为的测试脚本。 我测试一下: