对 PHP API 的 Axios GET 请求不适用于自定义标头

Posted

技术标签:

【中文标题】对 PHP API 的 Axios GET 请求不适用于自定义标头【英文标题】:Axios GET request to PHP API not working with custom header 【发布时间】:2020-10-28 18:31:51 【问题描述】:

我正在开发一个新的 VueJS 应用程序,它通过 axios 访问一个用 php 构建的简单 API 端点。我已将 PHP 端点代码剥离为简单的回显,以排除其他导致问题的代码:

<?php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header("Access-Control-Allow-Headers: X-Api-Token");

echo 'hello';

目前,开发正在本地开发主机名上运行:

vueJS 应用程序-http://app.livechat.local:8000/ PHP API - http://api.livechat.local/

在我的应用程序中,我正在做一个简单的拦截器来附加一个自定义标头“X-Api-Token”,我最终将在端点上对其进行验证。

import Vue from 'vue';
import vuetify from "./vuetify";
import axios from "axios";
import VueRouter from "vue-router";
import App from './App.vue';
import VueSocketIOExt from "vue-socket.io-extended";
import io from "socket.io-client";
import routes from "./routes";
import './style.scss';



const socket = io(SOCKET_URL);

// axios config
axios.defaults.baseURL = API_URL;

axios.interceptors.request.use(function (config) 
    config.headers = 
        'X-Api-Token': 'test'
    ;
    return config;
);



Vue.use(VueSocketIOExt, socket, vuetify, axios);
Vue.use(VueRouter);
const router = new VueRouter(routes);
Vue.prototype.$http = axios;


Notification.requestPermission();


router.beforeEach((to, from, next) => 
    console.log(to.name);
    if(to.name !== 'login' && to.name !== 'register' && to.name !== 'logout' && to.name !== 'forgot-password') 
        axios.get('/',
            params: 
                endpoint: 'agentCheckSession'
            
        )
            .then(response => 
                console.log(response);
            );
     else 
        next();
    
);





new Vue(
    el: '#app',
    router,
    vuetify,
    render: h => h(App)
);

但是,当我添加自定义标头时,CORS 会响应:

访问 XMLHttpRequest 在 来自原点的“http://api.livechat.local/?endpoint=agentCheckSession” 'http://app.livechat.local:8000' 已被 CORS 策略阻止: 对预检请求的响应未通过访问控制检查:否 请求中存在“Access-Control-Allow-Origin”标头 资源。

如果我从 axios 拦截器中删除自定义标头,它会毫无问题地继续进行。

我已通过在浏览器中访问 PHP 脚本来确认它是有效的。

这里是开发工具检查:

如何成功传递自定义标头?我正在寻找一种在 PHP 和/或 JS 中解决此问题的有效方法,因此我不是在寻找代理或“在 chrome 中禁用”解决方案。

【问题讨论】:

我发现“简单请求”不允许自定义标头...这很奇怪,因为我可以使用 jQuery 的 Ajax() 发送自定义标头。 developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests 【参考方案1】:

我认为在这部分:

axios.interceptors.request.use(function (config) 
    config.headers = 
        'X-Api-Token': 'test'
    ;
    return config;
);

您正在覆盖请求的所有标头。尝试将您的标题添加到标题中而不是覆盖它们,例如:

axios.interceptors.request.use(function (config) 
    config.headers.token = "test";
    return config;
);

【讨论】:

我试过了,它也不起作用。我还确保在后端反映“令牌”名称,仍然是同样的问题。

以上是关于对 PHP API 的 Axios GET 请求不适用于自定义标头的主要内容,如果未能解决你的问题,请参考以下文章

Axios 请求 - 来自 PHP API 的 Gzip 数据

来自本地 PHP 的 Axios GET 只是返回代码而不是执行

Axios 使用 vuejs cli 获取 php 文件不起作用

axios GET 请求不返回任何数据(VueJS 和 NodeJS)

Axios学习

Axios学习