You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用POST方法时Odoo与JavaScript间的CORS问题解决求助

解决Odoo与Nginx前端的CORS跨域问题

问题出在哪

你在前端AJAX里加Access-Control-Allow-Origin: *完全没用——这个头是接收请求的Odoo服务器必须返回的响应头,不是前端发请求时带的。浏览器的CORS规则是:当跨域请求(同IP不同端口也算跨域)触发时,会先发OPTIONS预请求,只有Odoo返回的响应里有合法的CORS头,浏览器才会放行后续的POST请求。

两种解决办法

办法1:给Odoo接口加CORS响应头

直接修改Odoo的控制器代码,在处理/update_value的方法里添加CORS相关头:

from odoo import http
from odoo.http import request

class CustomController(http.Controller):
    # 允许POST和OPTIONS方法,指定cors规则
    @http.route('/update_value', type='json', auth='public', methods=['POST', 'OPTIONS'], cors='*')
    def update_value(self, **kwargs):
        # 处理浏览器的OPTIONS预请求
        if request.httprequest.method == 'OPTIONS':
            headers = {
                'Access-Control-Allow-Origin': '*',
                'Access-Control-Allow-Methods': 'POST, OPTIONS',
                'Access-Control-Allow-Headers': 'Content-Type'
            }
            return request.make_response('', headers=headers)
        
        # 处理正常的POST请求逻辑
        param1 = request.jsonrequest.get('param1')
        # 这里写你的业务处理代码
        return {'status': 'success', 'received_param': param1}

注意:生产环境别用cors='*',换成你的前端域名http://209.23.104.2346更安全。

办法2:用Nginx反向代理干掉跨域(推荐)

既然前端在Nginx的80端口,Odoo在8021端口,直接让Nginx把前端的接口请求转发到Odoo,这样前端请求的是同域名路径,就不存在跨域问题了。

修改Nginx配置文件(比如/etc/nginx/sites-available/default):

server {
    listen 80;
    server_name 209.23.104.2346;

    # 前端静态文件路由
    location / {
        root /var/www/html;
        index test.html index.html;
    }

    # 把/update_value请求转发到Odoo
    location /update_value {
        proxy_pass http://localhost:8021/update_value;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

然后改前端AJAX的URL为相对路径:

$.ajax({
    type: "POST",
    url: "/update_value", // 不用带端口的绝对路径了
    data: {param1: '122325'}, // 用对象格式更规范
    success: function (data) {
        console.log("success")
    },
    error: function (err) {
       console.log("error")
    }
});

改完重启Nginx:sudo systemctl restart nginx,这种方法不用动Odoo代码,还更安全。

额外提醒

  • 旧版Odoo可能不支持@http.route里的cors参数,那就要手动在所有响应里加头
  • 前端的crossDomain: true可以删掉,反向代理后是同域请求,不需要这个参数

内容的提问来源于stack exchange,提问作者user19986231

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 03:57:44