当前位置:首页>开发>正文

nginx设置请求头大小 php使用nginx如何获取请求头

2023-04-08 23:49:57 互联网 未知 开发

nginx设置请求头大小 php使用nginx如何获取请求头

php使用nginx如何获取请求头?

Nginx的http模块在处理HTTP请求时对环境变量的封装与Apache有所不同。除了支持一些与HTTP协议相关的通用的变量之外,还支持一系列Nginx自有的变量,如Nginx配置目录下fastcgi_params.default文件里的$server_protocol、$nginx_version等。正如这个文件中的示例的用途,这些变量可以在配置fastcgi时传递给cgi程序,使其可以作为cgi程序的环境变量来使用。然而,即便是Nginx有了这些自有的变量也无法完全满足所有的需求。

了解Jquery的朋友会发现,Jquery在实现Ajax时会通过setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’)方法自动添加一个值为“xmlhttprequest”自定义的请求头”X-Requested-With”来标识这是一个Ajax请求,以期处理这个请求的后端能够通过判断这个标识来识别请求类型。那么这个时候PHP是如何来获取这个自定义参数的值的呢?

熟悉Apache和PHP的人一定会第一时间想到$_SERVER["HTTP_X_REQUESTED_WITH"],不错,这对黄金搭配早就把这个问题给完美解决了,但Nginx却不然,这是由Nginx对其自身工作的定位决定的——Nginx只负责HTTP。在Nginx眼里,PHP只是它的一个后端,形象点来说,它只管分发请求,而不管发给谁。这就意味着,我们无法期待Nginx像Apache一样给我们自动完成一些自定义参数到PHP的传递,只有自力更生。简单点说就是,想要直接像$_SERVER["HTTP_X_REQUESTED_WITH"]这样来调用自定义请求头参数的值的话,你就必须手工将其添加到fastcgi_params的配置中,明确告知cgi程序接收,否则Nginx会将其遗弃。

配置环境变量的方法可参照fastcgi_params.default这个文件,在前面的博客“Nginx下虚拟主机环境变量的配置方法”中也提到过。针对上述例子,只需在fastcgi_params文件中增加一行即可:

?12 # for Ajax fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with
这样,重载Nginx配置后就可以之间在PHP中调用$_SERVER["HTTP_X_REQUESTED_WITH"]来判断请求类型了。其中需要注意以下两点:

一、自定义请求头部的名称不应该包括空白、冒号、换行和下划线。

Nginx在处理客户端请求header头时,会将名称中的中横线”-”替换为下划线”_”,并将所有字母小写再加上”$http_”来作为该名称对应的变量名。例如上述Jquery的例子中setRequestHeader(‘X-Requested-With’, ‘xmlhttprequest’),在HTTP请求头中为一行字符串:”X-Requested-With: xmlhttprequest”,经Nginx处理后将自动生成一个名为$http_x_requested_with的变量,其值为”xmlhttprequest”。尤其注意中横线”-”替换为下划线”_”这个规则,这意味着请求参数名称中如果含有下划线,Nginx将无法正确识别。

二、$_SERVER["HTTP_X_REQUESTED_WITH"]中的索引,也即“fastcgi_param HTTP_X_REQUESTED_WITH $http_x_requested_with”中加红部分,是可以自由命名的,当前这种命名格式是为了保持和Apache保持一致。
..

nginx 413 请求体过大 最大能多少

这个是可配置的
请求头默认最大1k
可以通过client_header_buffer_size size配置
请求题默认最大1m
可以通过client_max_body_size size配置
如果size为0,不限制大小

jq ajax post跨域请求 怎么设置请求头

需要返回值在自己网站做代理,ajax请求代理页面,代理页面复制post请求

不需要返回值直接form表单post提交过去,不能ajax,跨域会报错,及时设置了Access-Control-Allow-Origin响应头允许跨域,xhr对象的兼容性在ie下就有得你搞的,不是同一个对象

jsonp如果对方支持你才能获取到数据,就返回json你指定jsonp请求也没有搞

nginx如何处理一个请求

Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始:

server {
listen nbsp nbsp nbsp80
server_name example.org www.example.org
...
}

server {
listen nbsp nbsp nbsp80
server_name example.net www.example.net
...
}

server {
listen nbsp nbsp nbsp80
server_name example.com www.example.com
...
}

在这个配置中,nginx仅仅检查请求的“Host”头以决定该请求应由哪个虚拟主机来处理。如果Host头没有匹配任意一个虚拟主机,或者请求中根本没有包含Host头,那nginx会将请求分发到定义在此端口上的默认虚拟主机。在以上配置中,第一个被列出的虚拟主机即nginx的默认虚拟主机——这是nginx的默认行为。而且,可以显式地设置某个主机为默认虚拟主机,即在"listen"指令中设置"default_server"参数:
server {
listen nbsp nbsp nbsp80 default_server
server_name example.net www.example.net
...
}
"default_server"参数从0.8.21版开始可用。在之前的版本中,应该使用"default"参数代替。
请注意"default_server"是监听端口的属性,而不是主机名的属性。后面会对此有更多介绍。

如何防止处理未定义主机名的请求
如果不允许请求中缺少“Host”头,可以定义如下主机,丢弃这些请求:
server {
listen nbsp nbsp nbsp 80
server_name nbsp""
return nbsp nbsp nbsp 444
}

在这里,我们设置主机名为空字符串以匹配未定义“Host”头的请求,而且返回了一个nginx特有的,非http标准的返回码444,它可以用来关闭连接。
从0.8.48版本开始,这已成为主机名的默认设置,所以可以省略server_name ""。而之前的版本使用机器的hostname作为主机名的默认值。

基于域名和IP混合的虚拟主机
下面让我们来看一个复杂点的配置,在这个配置里,有几个虚拟主机在不同的地址上监听:
server {
listen nbsp nbsp nbsp192.168.1.1:80
server_name example.org www.example.org
...
}

server {
listen nbsp nbsp nbsp192.168.1.1:80
server_name example.net www.example.net
...
}

server {
listen nbsp nbsp nbsp192.168.1.2:80
server_name example.com www.example.com
...
}

这个配置中,nginx首先测试请求的IP地址和端口是否匹配某个server配置块中的listen指令配置。接着nginx继续测试请求的Host头是否匹配这个server块中的某个server_name的值。如果主机名没有找到,nginx将把这个请求交给默认虚拟主机处理。例如,一个从192.168.1.1:80端口收到的访问www.example.com的请求将被监听192.168.1.1:80端口的默认虚拟主机处理,本例中就是第一个服务器,因为这个端口上没有定义名为www.example.com的虚拟主机。
默认服务器是监听端口的属性,所以不同的监听端口可以设置不同的默认服务器:
server {
listen nbsp nbsp nbsp192.168.1.1:80
server_name example.org www.example.org
...
}

server {
listen nbsp nbsp nbsp192.168.1.1:80 default_server
server_name example.net www.example.net
...
}

server {
listen nbsp nbsp nbsp192.168.1.2:80 default_server
server_name example.com www.example.com
...
}
一个简单PHP站点配置
现在我们来看在一个典型的,简单的PHP站点中,nginx怎样为一个请求选择location来处理:
server {
listen nbsp nbsp nbsp80
server_name example.org www.example.org
root nbsp nbsp nbsp nbsp/data/www

location / {
index nbsp index.html index.php
}

location ~* .(gif|jpg|png)$ {
expires 30d
}

location ~ .php$ {
fastcgi_pass nbsplocalhost:9000
fastcgi_param SCRIPT_FILENAME
$document_root$fastcgi_script_name
include nbsp nbsp nbsp fastcgi_params
}
}

首先,nginx使用前缀匹配找出最准确的location,这一步nginx会忽略location在配置文件出现的顺序。上面的配置中,唯一的前缀匹配location是"/",而且因为它可以匹配任意的请求,所以被作为最后一个选择。接着,nginx继续按照配置中的顺序依次匹配正则表达式的location,匹配到第一个正则表达式后停止搜索。匹配到的location将被使用。如果没有匹配到正则表达式的location,则使用刚刚找到的最准确的前缀匹配的location。
请注意所有location匹配测试只使用请求的URI部分,而不使用参数部分。这是因为写参数的方法很多,比如:
/index.php?user=johnamppage=1
/index.php?page=1ampuser=john

除此以外,任何人在请求串中都可以随意添加字符串:
/index.php?page=1ampsomething elseampuser=john

现在让我们来看使用上面的配置,请求是怎样被处理的:
请求"/logo.gif"首先匹配上location "/",然后匹配上正则表达式".(gif|jpg|png)$"。因此,它将被后者处理。根据"root /data/www"指令,nginx将请求映射到文件/data/www/logo.gif",并发送这个文件到客户端。
请求"/index.php"首先也匹配上location "/",然后匹配上正则表达式".(php)$"。 因此,它将被后者处理,进而被发送到监听在localhost:9000的FastCGI服务器。fastcgi_param指令将FastCGI的参数SCRIPT_FILENAME的值设置为"/data/www/index.php",接着FastCGI服务器执行这个文件。变量$document_root等于root指令设置的值,变量$fastcgi_script_name的值是请求的uri,"/index.php"。
请求"/about.html"仅能匹配上location "/",因此,它将使用此location进行处理。根据"root /data/www"指令,nginx将请求映射到文件"/data/www/about.html",并发送这个文件到客户端。
请求"/"的处理更为复杂。它仅能匹配上location "/",因此,它将使用此location进行处理。然后,index指令使用它的参数和"root /data/www"指令所组成的文件路径来检测对应的文件是否存在。如果文件/data/www/index.html不存在,而/data/www/index.php存在,此指令将执行一次内部重定向到"/index.php",接着nginx将重新寻找匹配"/index.php"的location,就好像这次请求是从客户端发过来一样。正如我们之前看到的那样,这个重定向的请求最终交给FastCGI服务器来处理。
作者: Igor Sysoev
编辑: Brian Mercer
翻译: Jinglong amp cfsego nbsp nbsp

nginx 是如何处理访问请求的

一、nginx如何选择适当的虚拟服务器来处理请求?(server匹配)
(1)基于主机名匹配来选择合适的虚拟服务器
对比请求头中的host字段与server中的server_name,选择匹配的服务器。如果都不匹配,则选择该端口所对应默认的服务器。如果没有指定默认服务器,默默为服务器列表中的第一个,可以通过listen port default_server来显示指定。值得注意的是,默认服务器是与监听端口相关的,即每个端口都可以指定一个默认服务器。

[html]nbspview plainnbspcopy
servernbsp{nbspnbsp

listennbspnbspnbspnbspnbspnbsp80nbspnbsp

server_namenbspexample.orgnbspwww.example.orgnbspnbsp

...nbspnbsp
}nbspnbsp
}nbspnbsp
如果希望不处理没有指定host字段的请求,可以通过如下方式来实现:

[html]nbspview plainnbspcopy
servernbsp{nbspnbsp

listennbspnbspnbspnbspnbspnbsp80nbspnbsp

server_namenbsp""nbspnbsp

returnnbspnbspnbspnbspnbspnbsp444nbspnbsp

}nbspnbsp
server_name也可以不指定,默认就是为“”,匹配没有指定host的请求。
(2)基于IP 和 主机名来选择合适的虚拟服务器
首先按照IP、端口进行匹配,匹配通过的server,再按照主机名进行匹配。如果主机名不匹配,则由默认匹配该IP、端口的默认服务器来进行处理。

[html]nbspview plainnbspcopy
servernbsp{nbspnbsp

listennbspnbspnbspnbspnbspnbsp192.168.1.1:80nbspnbsp

server_namenbspexample.orgnbspwww.example.orgnbspnbsp

...nbspnbsp
}nbspnbsp
}nbspnbsp

servernbsp{nbspnbsp

listennbspnbspnbspnbspnbspnbsp192.168.2.1:80nbspnbspnbsp

server_namenbspexample.netnbspwww.example.netnbspnbsp

...nbspnbsp
}nbspnbsp
}nbspnbsp
二、nginx如何选择合适的location来处理请求(location匹配)

[html]nbspview plainnbspcopy
servernbsp{nbspnbsp

listennbspnbspnbspnbspnbspnbsp80nbspnbsp

server_namenbspexample.orgnbspwww.example.orgnbspnbsp

rootnbspnbspnbspnbspnbspnbspnbspnbsp/data/wwwnbspnbsp

locationnbsp/nbsp{nbspnbsp

indexnbspnbspnbspindex.htmlnbspindex.phpnbspnbsp

}nbspnbsp
locationnbsp~*nbsp.(gif|jpg|png)$nbsp{nbspnbsp

expiresnbsp30dnbspnbsp

}nbspnbsp
locationnbsp~nbsp.php$nbsp{nbspnbsp

fastcgi_passnbspnbsplocalhost:9000nbspnbsp

fastcgi_paramnbspSCRIPT_FILENAMEnbspnbsp

$document_root$fastcgi_script_namenbspnbsp

includenbspnbspnbspnbspnbspnbspnbspfastcgi_paramsnbspnbsp

}nbspnbsp
}nbspnbsp
}nbspnbsp
location的匹配方式分两种:a.根据路径前缀来匹配 b.根据正则表达式来匹配
匹配的原则是:首先检测前缀匹配的location,选择有最大前缀的

最新文章