奇怪的JQuery错误 "代码501,信息不支持的方法OPTIONS

13 投票
4 回答
20989 浏览
提问于 2025-04-17 08:11

我正在学习jQuery的Get方法。为了练习,我启动了一个Python的HTTP服务器:

(只需输入命令Python -m SimpleHTTPServer)。

在我的网页浏览器中访问“http://localhost:80”来测试这个网页服务器是没问题的。不过,当我写了一个非常简单的JavaScript代码来访问我的网页服务器时,却出现了一个错误信息:

“代码501,信息不支持的方法('OPTIONS')”

我使用了jquery.xdomainajax.js这个库,应该可以处理跨域请求的jQuery。

这是我的JavaScript代码:

<html>
<head>
<script src="jquery.min.js"></script>
<script src="jquery.xdomainajax.js"></script>
<script type="text/javascript">
$(document).ready(function(){ 
  u = 'http://localhost:80';
 jQuery.get(u, function(res){       
    $("#data").html(res.responseText)
});
});


</script>
</head>
<body>
<p id="data"></p>
</body>
</html>

其实,如果我把网址换成其他的,比如“http://www.google.ca”,那就能正常工作。但我不知道为什么在基本的Python HTTP服务器上就不行。有人能帮我吗?

4 个回答

3

看起来这是一个CORS的预检请求(你可以在这里了解更多:https://developer.mozilla.org/En/HTTP_access_control)

我猜你是在尝试访问一个不同的域名或端口。根据请求的不同,浏览器会先发送一个预检请求(也就是一个OPTION请求),目的是想知道服务器是否接受你想发送的那些头信息或者HTTP方法。如果服务器回复说可以,浏览器就会继续发送真正的请求。

看起来那个Python服务器没有实现OPTION请求,所以才会出现错误。

小贴士:使用网络检查工具(比如tcpdump、wireshark、ngrep等)在处理HTTP请求或网络错误时会非常有帮助。

4

你可能还需要把一些字段,比如“Content-Type”,添加到允许的头部信息中。

self.send_header("Access-Control-Allow-Headers", "X-Requested-With, Content-Type") 
16

我做的事情是写一个定制的HTTPRequestHandler。我在MyHandler里面添加了一个do-OPTIONS的方法,用来告诉浏览器我的服务器支持跨域资源共享(CORS)。这个过程是通过发送一些头信息来实现的,比如Access-Control-Allow-Origin、Access-Control-Allow-Methods和Access-Control-Allow-Headers。此外,我还在do_GET方法里添加了一句“self.send_header('Access-Control-Allow-Origin', '*')”。

class MyHandler(BaseHTTPRequestHandler):
    def do_OPTIONS(self):           
        self.send_response(200, "ok")       
        self.send_header('Access-Control-Allow-Origin', '*')                
        self.send_header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS')
        self.send_header("Access-Control-Allow-Headers", "X-Requested-With")        
        self.end_headers()
    
    def do_GET(self):           
        self.send_response(200)
        self.send_header('Access-Control-Allow-Origin', '*')
        self.send_header('Content-type',    'text/html')                                    
        self.end_headers()              
        self.wfile.write("<html><body>Hello world!</body></html>")
        self.connection.shutdown(1) 

撰写回答