官方文檔給出的解釋: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.id
2)修改綠色內容Accept-Encoding,將你的參數中帶有下划線的部分改為-(dansh)
例如,要將x-my_id傳入,那么將綠色部分改為x-my-id
3)修改三處紫色內容,這三處為變量名稱,名稱隨意,要保持一致
以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
相當於將原來不支持的參數賦值給一個支持的參數,然后繼續傳遞
以上內容,如有錯誤,歡迎指出。