XHR无法加载<URL>。请求的资源上没有'Access-Control-Allow-Origin'头部

1 投票
2 回答
950 浏览
提问于 2025-04-18 12:47

我正在尝试使用JQuery进行跨域的AJAX请求。服务器上运行的是一个用Python编写的CGI文件。我尝试为服务器添加CORS支持,但似乎没有成功,出现了这样的提示:

XMLHttpRequest无法加载http://<URL>.cgi。请求的资源上没有'Access-Control-Allow-Origin'头。因此,来源<Other-URL>没有被允许访问。

我的JQuery AJAX请求是:

$.ajax({
    type: "POST",
    url: "http://<URL>.cgi",
})
.done(function(msg) {
    alert(msg);
});

而服务器脚本是:

import os
import cgi
import cgitb; cgitb.enable()
import sys
import mysql.connector
from mysql.connector import errorcode

form = cgi.FieldStorage() 

Username = form.getvalue('username')
Email    = form.getvalue('email')
Password = form.getvalue('password')

print ("Content-Type: text/html")
print ("Access-Control-Allow-Origin: *")

print("<\h2>Welcome, your credentials are as follows Username: %s Email: %s Password: %s </h2>" % (Username, Email, Password))  
print ("""
<html>
<head>
</head>
<body>
""")

try:
    cnx = mysql.connector.connect(user='xxxxxx', password='xxxxxxx', host='127.0.0.1', database='xxxxxxx')
    cursor = cnx.cursor()
    #cursor.execute("INSERT INTO `user_information` (`User_ID`, `Email`, `Username`, `Password`) VALUES (NULL, %s, %s, %s)", (Email, Username, Password))
    cursor.execute("SELECT * FROM  `user_information` LIMIT 0 , 30")
    data = cursor.fetchall()
    print(data)
    cnx.commit()
    cursor.close()
    cnx.close()
except mysql.connector.Error as err:
    print("Something went wrong: {}".format(err))

print ("""
</body>
</html>
""")

2 个回答

0

你的打印命令没有生成一个有效的HTTP头部。你不能只简单地放置

print ("Access-Control-Allow-Origin: *")

在这里,你需要创建所需的CR-LF换行符,并且要有两个连续的CR-LF来结束头部。同时要注意打印命令的自动换行。这样做应该可以:

print ("Content-Type: text/html\r\n"),
print ("Access-Control-Allow-Origin: *\r\n\r\n"),
0

试着把 print "Access-Control-Allow-Origin: * 放在你脚本的最上面,而不是在输出里面。这样做最终解决了我的问题,而且没有影响到脚本的执行。

我的代码:

#!/usr/bin/env python2.7
# -*- coding: UTF-8 -*-
print "Access-Control-Allow-Origin: *"

import os
import cgi
etc...

当然,你可能更想只允许特定的一些域名,而不是用 * 让所有的都可以。

撰写回答