问题描述
我正在将自定义 X-Authorization
标头传递给我的 API。
在我的 API 中,我允许这样的标头:
header('Access-Control-Allow-Headers: Content-Type,Authorization,X-Requested-With,X-Authorization');
我正在使用 print_r(apache_request_headers())
响应中对 X-Authorization
的唯一引用是:
[access-control-request-headers] => x-authorization
我正在使用 CGI
,我相信它会去除常规的 Authorization
标头,这就是我尝试自定义标头的原因。
解决方法
可以看到$_SERVER超级全局下的请求头,把key转换成大写,前缀HTTP_&替换-to_
例如: X-foo-bar: baz
将在:
$_SERVER['HTTP_X_FOO_BAR']
以下请求:
curl -i 0:9000/test.php -H 'X-foo-bar: baz'
将返回:
HTTP/1.1 200 OK
Host: 0:9000
Date: Wed,27 Jan 2021 21:33:33 GMT
Connection: close
X-Powered-By: PHP/7.3.24
Content-type: text/html; charset=UTF-8
baz
PHP (test.php):
<?php
echo ($_SERVER['HTTP_X_FOO_BAR']);
,
以下在 Google Chrome 上对我有用: HTML 文件数据:
<!DOCTYPE html>
<html>
<head><title>test</title>
<script>
const test = () => {
fetch('/3.php',{
method: 'POST',redirect: 'follow',headers: new Headers({
'Content-Type': 'application/json','Foo': 'bar','X-My-Custom-Header': 'foo-bar-baz','X-Authorization': 'Basic dGVzdDp0ZXN0VG9rZW4='
}),body: 'test123'
})
.then(response => response.json())
.then(data => {
console.log(data);
document.querySelector('#response').innerHTML = data['HTTP_X_AUTHORIZATION'];
});
};
</script>
</head>
<body>
<button onclick="test();">Test</button>
<pre id="response"></pre>
</body></html>
3.php的内容:
<?php
header('Conent-Type: application/json');
echo json_encode($_SERVER);