官方文档给出的解释:http://httpd.apache.org/docs/current/env.html#fixheader
(以下摘自官方文档,英文不想看的可以直接看忽略。。直接从下划线后内容开始)
——————————————————————————————
Passing broken headers to CGI scripts
Starting with version 2.4, Apache is more strict about how HTTP headers are converted to environment variables in mod_cgi
and other modules: Previously any invalid characters in header names were simply translated to underscores. This allowed for some potential cross-site-scripting attacks via header injection (see Unusual Web Bugs, slide 19/20).
If you have to support a client which sends broken headers and which can‘t be fixed, a simple workaround involving mod_setenvif
and mod_headers
allows you to still accept these headers#
# The following works around a client sending a broken Accept_Encoding # header. SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding———————————————————————————————————————————————————————————————————————————— 1、原因:防止通过请求头注入进行跨站攻击, 如果非要支持有两种解决方法 a、降级httpd b、修改配置文件(本文内容) 2、如何解决修改?直接进入正题,根据官网的提示,需要修改httpd的配置文件(以httpd2.4.6 centos7为例)楼主直接修改的虚拟主机配置文件,个人认为,只修改单个虚拟主机文件不影响其他虚拟主机。。感兴趣的可以自己测试修改/etc/httpd/conf/httpd.conf文件。这样应该是支持全局了。楼主自己的虚拟主机配置文件在/etc/httpd/conf.d文件夹下在配置文件下面位置添加 <VirtualHost *:80> (添加位置)
</VirtualHost>
添加内容:官方文档原文:
SetEnvIfNoCase ^Accept.Encoding$ ^(.*)$ fix_accept_encoding=$1 RequestHeader set Accept-Encoding %{fix_accept_encoding}e env=fix_accept_encoding直接将以上内容添加到配置文件中是没有用的。。楼主试过了需要修改五处内容(原文带颜色的部分)1)红色部分Accept.Encoding改为你要传入到请求头中带有下划线的内容,并将原来的下划线替换为.(点)例如:要将x-my_id传入到请求头中,那么将红色部分改为x-my.id2)修改绿色内容Accept-Encoding,将你的参数中带有下划线的部分改为-(dansh)例如,要将x-my_id传入,那么将绿色部分改为x-my-id3)修改三处紫色内容,这三处为变量名称,名称随意,要保持一致以x-my_id为例,最终修改结果为:(xxxxx为省略内容,不是实际需要添加的内容)
<VirtualHost *:yourport> xxxxx
SetEnvIfNoCase ^x-my.id$ ^(.*)$ aa=$1 RequestHeader set x-my-id %{aa}e env=aa
xxxxx
</VirtualHost>
注意:
如果要添加多个带有下划线请求头参数支持,可以添加多个SetEnvIfNoCase和RequestHeader,但是变量(紫色内容)需要修改成不同的值。
PS:解释一下:
SetEnvIfNoCase ^x-my.id$ ^(.*)$ aa=$1 意思是如果x-my.id中有.那么将其值赋给aa
RequestHeader set x-my-id %{aa}e env=aa意思是将aa的值赋给请求头参数x-my-id 相当于将原来不支持的参数赋值给一个支持的参数,然后继续传递 以上内容,如有错误,欢迎指出。
原文地址:https://www.cnblogs.com/it-green-hand/p/9462633.html