热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

http,php,nginx串讲

这不是讲http协议的很多的东西是知其意而忘其形?,趁着过年这段时间把很多的知识都review下,把形找回来,写代码并不是全部toolsrequesttelnetcurlchrom

这不是讲http协议的
很多的东西是知其意而忘其形?, 趁着过年这段时间把很多的知识都review下, 把形找回来, 写代码并不是全部

tools

request

telnet
curl
chrome
postman

capture

fiddler/wireshark

http

http属于应用层的协议
http是无状态的(COOKIE和session的作用就体现出来了)

COOKIE and session

我这里画了一张图
https://www.processon.com/vie...
图片描述
下面是我的php.ini的部分配置

session.use_COOKIEs = 1
session.use_only_COOKIEs = 1
session.name = PHPSESSID
session.auto_start = 0
session.COOKIE_lifetime = 0
session.save_path=F:\www\tmp\session

注意session.name = PHPSESSID
图片描述

URL

http://www.test.com:80/index.php/kill?d=1&a=x 以这个为例

descriptionvaluecommet
schemehttphttp代表使用http协议/https
hostwww.test.com
port80http默认80/https默认443
uri/index.php/kill?d=1&a=x
argsd=1&a=x就是query_string

chrome demo

我使用虚拟机的, 把虚拟机的80端口映射到本机的8000端口, so下面的host是127.0.0.1:8000

完整的是在chrome里面打开http://127.0.0.1:8000/index/index/test2

request

GET /index/index/test2 HTTP/1.1
Host: 127.0.0.1:8000
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
DNT: 1
Accept-Encoding: gzip, deflate, sdch, br
Accept-Language: en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4
COOKIE: XDEBUG_SESSION=PHPSTORM

response

HTTP/1.1 200 OK
Server: nginx
Date: Mon, 23 Jan 2017 02:29:09 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.22
Proxy-Connection: keep-alive

body

test

curl demo

[xsu@localhost ~]$ curl -v "http://127.0.0.1/index/index/test2"
* About to connect() to 127.0.0.1 port 80 (#0)
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 80 (#0)
> GET /index/index/test2 HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1
> Accept: */*
>
<
* Connection #0 to host 127.0.0.1 left intact
test

telnet demo

[xsu&#64;localhost ~]$ telnet 127.0.0.1 80
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is &#39;^]&#39;.
^]
telnet>
GET /index/index/test2 HTTP/1.1
Host: 127.0.0.1HTTP/1.1 200 OK
Server: nginx
Date: Mon, 23 Jan 2017 02:14:36 GMT
Content-Type: text/html; charset&#61;utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.224
test
0

Transfer-Encoding: chunkedchunked 表示是分段, test前面的4表示接下来的数据的长度, 这是一个16进制的数, test下一段的长度为0 , 即表示结束

request

由3部分组成:

request method, uri, protocol version

  1. GET /index.php/index/index/test HTTP/1.1

request methodcurd
getr, read
postu, update
putc, create
deleted, delete

request header

只说几个有趣的, 其他的自己看详细的http协议, 或者chrome调试台的request header

  • User-Agent
    所有的浏览器都是 Mozilla/5.0 开头的, 当时久我都惊呆了, 至于为什么看知乎

  • Accept-Language
    在chrome地址栏里面打开chrome://settings/languages, 把英文拖到 最上面, 打开www.swoole.com, 再把中文拖到最上面, 再打开www.swoole.com

困惑了我好久, 我之前打开很多网站, 打开的总是默认打开英文版的网站, 后来不小心review了下http协议, 恍然大悟?

  • X-Forward-For
    可以用来伪造ip来源, 刷单, 限制ip的地方

在配置nginx的时候要注意, 和获取client ip的时候要注意, 不要相信用户的输入, 特别是http_xxx, 太容易伪造了

  • X-Request-With

区分是正常的请求还是ajax请求的, ajax请求一般都带有这个请求头, 当然可以直接定义

request body

post的数据就是放到里面

response

protocol version, response status, description

HTTP/1.1 200 OK

response header

Server: nginx
Date: Mon, 23 Jan 2017 02:29:09 GMT
Content-Type: text/html; charset&#61;utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
X-Powered-By: PHP/5.6.22
Proxy-Connection: keep-alive

response body

就是我们看到的html实体, 或者ajax返回的字符串

PHP

大概说下php里面$_SERVER

php的文件内容为

ksort($_SERVER);
print_r($_SERVER);

request -> view-source:http://127.0.0.1:8000/index.php/index/index/test?a&#61;1&d&#61;x

返回的数据为(服务器用的是nginx, apache的类似)

Array
([CONTENT_LENGTH] &#61;> [CONTENT_TYPE] &#61;> [DOCUMENT_ROOT] &#61;> /home/wwwroot/tp5/public[DOCUMENT_URI] &#61;> /index.php[FCGI_ROLE] &#61;> RESPONDER[GATEWAY_INTERFACE] &#61;> CGI/1.1[HOME] &#61;> /home/www[HTTP_ACCEPT] &#61;> text/html,application/xhtml&#43;xml,application/xml;q&#61;0.9,image/webp[HTTP_ACCEPT_ENCODING] &#61;> gzip, deflate, adch, br[HTTP_ACCEPT_LANGUAGE] &#61;> en-US,en;q&#61;0.8,zh-CN;q&#61;0.6,zh;q&#61;0.4[HTTP_CONNECTION] &#61;> keep-alive[HTTP_COOKIE] &#61;> XDEBUG_SESSION&#61;PHPSTORM[HTTP_DNT] &#61;> 1[HTTP_HOST] &#61;> 127.0.0.1:8000[HTTP_UPGRADE_INSECURE_REQUESTS] &#61;> 1[HTTP_USER_AGENT] &#61;> Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36[PATH_INFO] &#61;> /index/index/test[PHP_SELF] &#61;> /index/index/test[QUERY_STRING] &#61;> a&#61;1&d&#61;x[REDIRECT_STATUS] &#61;> 200[REMOTE_ADDR] &#61;> 10.0.2.2[REMOTE_PORT] &#61;> 62835[REQUEST_METHOD] &#61;> GET[REQUEST_SCHEME] &#61;> http[REQUEST_TIME] &#61;> 1485139559[REQUEST_TIME_FLOAT] &#61;> 1485139559.6806[REQUEST_URI] &#61;> /index.php/index/index/test?a&#61;1&d&#61;x[SCRIPT_FILENAME] &#61;> /home/wwwroot/tp5/public/index.php[SCRIPT_NAME] &#61;> /index.php[SERVER_ADDR] &#61;> 10.0.2.15[SERVER_NAME] &#61;> www.test.com[SERVER_PORT] &#61;> 80[SERVER_PROTOCOL] &#61;> HTTP/1.1[SERVER_SOFTWARE] &#61;> nginx/1.10.0[USER] &#61;> www
)

大概可以分为以下(#1表)

分类描述
HTTP开头request header
REQUEST开头request method, protocol
SERVER开头服务器的相关信息
REMOTE开头客户端的相关信息
SCRIPT,DOCUMENT开头脚本相关的名称, 路径
路由, 参数相关path_info, query_string
其他
nginx

cgi, fastcgi, php-fpm

cgi  -> 公共网关接口, 与语言无关, 规定要传哪些数据(看#1表), 通过重定向语言的stdin, stdout来实现, 但是cgi很慢, 看下使用cgi的php执行流程
webserver 收到 parse php请求 -> 启动PHPCGI -> PHPCGI解析php.ini, 初始化运行环境 -> 处理请求, 以cgi规定格式返回 -> 退出PHPCGI -> webserver 返回数据
问题 : 每次都要启动phpcgi, 和初始化环境
fastcgi -> cgi的改进方案, 启动一个master进程, 解析配置文件, 初始化运行环境, 再fork多个worker来处理php请求, 返回数据, 他是要管理一个进程池来处理请求
php-fpm -> 是实现了fastcgi协议的 php fastcgi 进程管理器, 并且可以平滑重启(新的worker使用新的配置, 老的worker执行完就可以自动退出了),

nginx通常都是使用php-fpm, 通信有两种方式, socket和9000端口

params

看下fastcgi的重写

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;fastcgi_split_path_info ^(.&#43;?\.php)(/.*)$;
set $path_info $fastcgi_path_info;fastcgi_param PATH_INFO $path_info;

以$开头的是nginx ngx_http_core_module 提供的变量, 具体可参看http://nginx.org/en/docs/http/ngx_http_core_module.html#variables

fastcgi_param这条指令就是对php中的$_SERVER赋值

fiddler

这个软件抓包使用很简单, 可能不满足需求, 当然需要更加专业wireshark, 可以使用自定义脚本, 这个功能就自己想象了, 并且这个软件我也只会简单的抓包, 复杂的不会, 不敢写

为什么能抓包?

打开Internet属性 -> 连接 -> 局域网设置 -> 高级

你的http和https都使用了代理的, 你的所有的请求都会转发到代理, 由代理处理, 所以能抓包

你把手机的代理地址, 设置为fiddler自动配置的ip地址和端口, 也可以抓手机的包

http断点

打断点, 加参数, 就像调试本地程序一样

这里可能需要用到filter过滤一下, 可以按 host, 进程, 请求头过滤, 高兴就好

postman

有空再写, 回家过年了,



推荐阅读
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 利用爬虫技术抓取数据,结合Fiddler与Postman在Chrome中的应用优化提交流程
    本文探讨了如何利用爬虫技术抓取目标网站的数据,并结合Fiddler和Postman工具在Chrome浏览器中的应用,优化数据提交流程。通过详细的抓包分析和模拟提交,有效提升了数据抓取的效率和准确性。此外,文章还介绍了如何使用这些工具进行调试和优化,为开发者提供了实用的操作指南。 ... [详细]
  • Nginx不仅是一款轻量级的高性能Web服务器,还具备出色的负载均衡和反向代理功能。它支持复杂的正则匹配规则、动静内容分离以及灵活的URL重写功能,使得配置和管理更加便捷高效。此外,Nginx提供了多种负载均衡算法,如轮询、加权轮询、最少连接数等,以满足不同应用场景的需求。 ... [详细]
  • 在进行前端JavaScript国际化(i18n)的过程中,为了从cookie中获取语言信息并动态加载相应资源,我决定将语言检测逻辑和i18n初始化代码直接嵌入到index页面中,使用了Velocity模板引擎的语法。这种方法不仅简化了代码结构,还提高了语言切换的灵活性和响应速度。 ... [详细]
  • 在前一篇文章中,我们介绍了如何使用Requests库发送GET请求。本文将深入探讨如何通过Requests库发送POST请求,包括参数格式、请求封装等关键技巧,并通过“历史上的今天”API实例进行详细说明。 ... [详细]
  • HTML5 Web存储技术是许多开发者青睐本地应用程序的重要原因之一,因为它能够实现在客户端本地存储数据。HTML5通过引入Web Storage API,使得Web应用程序能够在浏览器中高效地存储数据,从而提升了应用的性能和用户体验。相较于传统的Cookie机制,Web Storage不仅提供了更大的存储容量,还简化了数据管理和访问的方式。本文将从基础概念、关键技术到实际应用,全面解析HTML5 Web存储技术,帮助读者深入了解其工作原理和应用场景。 ... [详细]
  • 深入浅出解析HTTP协议的核心功能与应用
    前言——协议是指预先设定的通信规则,确保双方能够按照既定标准进行有效沟通,从而实现准确的信息交换。例如,驯兽师通过拍手使动物坐下,这实际上是一种预设的协议。本文将详细探讨HTTP协议的核心功能及其广泛应用,解析其在现代网络通信中的重要作用。 ... [详细]
  • 本文将详细介绍如何利用JMeter高效执行API接口测试,涵盖JMeter的基础介绍、安装方法、中文环境配置、主要元件及其作用域和执行顺序等内容,并分享一系列实用的测试技巧,帮助读者全面掌握JMeter接口测试的全过程。 ... [详细]
  • 今天刚上班就听到群里的几位大佬在讨论所开发的系统需要重复的登录的恶心之处,听各位大佬争辩的同时,想到了自己以前整理过的缓存技术,算是比较全面的,当然了只是帮助自己理解的,但是很明显我并没有记在脑子里, ... [详细]
  • 本文将详细介绍如何注册码云账号、配置SSH公钥、安装必要的开发工具,并逐步讲解如何下载、编译 HarmonyOS 2.0 源码。通过本文,您将能够顺利完成 HarmonyOS 2.0 的环境搭建和源码编译。 ... [详细]
  • 通过优化动态网络Cookies的全网互通机制,实现了用户在任意子站点的登录和注销操作均能同步至整个网络。具体实现涉及对三个关键文件的修改:首先,在`incDv_ClsMain.asp`中定位并调整`Response.Cookies`的相关设置;其次,更新`global.asa`以确保会话状态的一致性;最后,修改`login.asp`以支持跨域认证。这一改进不仅提升了用户体验,还增强了系统的安全性和可靠性。 ... [详细]
  • 在配置Nginx的SSL证书后,虽然HTTPS访问能够正常工作,但HTTP请求却会遇到400错误。本文详细解析了这一问题,并提供了Nginx配置的具体示例。此外,还深入探讨了DNS服务器证书、SSL证书的申请与安装流程,以及域名注册、查询方法和CDN加速技术的应用,帮助读者全面了解相关技术细节。 ... [详细]
  • 在优化Nginx与PHP的高效配置过程中,许多教程提供的配置方法存在诸多问题或不良实践。本文将深入探讨这些常见错误,并详细介绍如何正确配置Nginx和PHP,以实现更高的性能和稳定性。我们将从Nginx配置文件的基本指令入手,逐步解析每个关键参数的最优设置,帮助读者理解其背后的原理和实际应用效果。 ... [详细]
  • Python 实战:异步爬虫(协程技术)与分布式爬虫(多进程应用)深入解析
    本文将深入探讨 Python 异步爬虫和分布式爬虫的技术细节,重点介绍协程技术和多进程应用在爬虫开发中的实际应用。通过对比多进程和协程的工作原理,帮助读者理解两者在性能和资源利用上的差异,从而在实际项目中做出更合适的选择。文章还将结合具体案例,展示如何高效地实现异步和分布式爬虫,以提升数据抓取的效率和稳定性。 ... [详细]
author-avatar
墨镜元龙高卧
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有