【问题标题】:XHR cannot load <URL>. No 'Access-Control-Allow-Origin' header is present on the requested resourceXHR 无法加载 <URL>。请求的资源上不存在“Access-Control-Allow-Origin”标头
【发布时间】:2018-05-18 00:53:41
【问题描述】:

我正在尝试使用 JQuery 执行跨域 AJAX 请求。服务器正在执行一个用 Python 编写的 CGI 文件。我尝试向服务器添加 CORS 支持,但它似乎不起作用,说:

XMLHttpRequest cannot load http://&lt;URL&gt;.cgi. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin &lt;Other-URL&gt; is therefore not allowed access.

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>
""")

【问题讨论】:

  • "我已经尝试向服务器添加 CORS 支持" 在哪里?我在你的代码中没有看到类似的东西(但是有很多不相关的 MySQL 代码)。
  • print ("Access-Control-Allow-Origin: *")
  • 再尝试两个标题:Access-Control-Allow-Methods: GET, POST, PUT, OPTIONSccess-Control-Allow-Headers: Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token
  • 我尝试使用以下方法添加它们:print("Access-Control-Allow-Methods: POST, GET, OPTIONS") print("Access-Control-Allow-Headers: Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token") 仍然无法正常工作
  • 你可以尝试在你的javascript中添加$.support.cors = true;吗?另外,您的 CORS 支持代码服务器端在哪里?

标签: javascript jquery python cgi cors


【解决方案1】:

尝试将print "Access-Control-Allow-Origin: * 放在脚本顶部而不是输出中。这终于为我解决了,并且没有干扰脚本执行。

我的代码:

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

import os
import cgi
etc...

当然,您可能希望将一组特定的域列入白名单,而不是允许所有带有 * 的域。

【讨论】:

    【解决方案2】:

    您的打印命令没有创建有效的HTTP header。 而不是放置只是放置

    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"),
    

    【讨论】:

      猜你喜欢
      • 2018-02-28
      • 1970-01-01
      • 2015-10-01
      • 1970-01-01
      • 2014-11-13
      • 2015-03-29
      • 2016-10-10
      • 2017-08-30
      • 2013-11-29
      相关资源
      最近更新 更多