1

我有一个可以运行的网络服务GET。要访问此 Web 服务,需要传递一些自定义标头。

当我尝试使用GET方法从 javascript 代码访问 Web 服务时,请求方法正在更改为OPTIONS. (域名不同)

我阅读了一些文章,发现带有自定义标头的请求将被预先发送,在这种情况下,在实际方法调用之前,将向服务器发出带有 OPTIONS 方法的请求。

但我的问题是在OPTIONS调用之后,真正的方法(即GET)没有被调用。

OPTIONS调用返回状态为 401 。

我怀疑这是因为我的网络服务GET只支持。我该如何解决这个问题?请帮忙。(我的代码在 IE 上运行良好,但不能在其他浏览器上运行,例如 Chrome)

4

1 回答 1

4

要检查的两件事(不知道您的服务器端语言/技术是什么):

  1. 您是否将OPTIONS其作为有效方法包含在您的Access-Control-Allow-Methods? 例子:

    Access-Control-Allow-Methods: GET, OPTIONS
    
  2. 您的请求发送的自定义标头是否被允许返回到浏览器?例子:

    Access-Control-Allow-Headers: X-PINGOTHER 
    

远程服务器必须在任何安全的、符合标准的浏览器(即不是旧版本的 IE)之前返回这两个(并且肯定是第二个),才能允许非来源响应通过。

因此,如果您想在 HTTP 服务器级别实现此功能并保持 Web 服务的可移植性,您可以尝试以下方法:

我们假设您的 Web 服务 URL 是http://example.org/service,并且服务的路径是/srv/www/service

如果您运行的是 Apache 2.0,附加标头的语法是add,在 2.2 上,使用set.

所以,你会修改/srv/www/service/.htaccess

 Header set Access-Control-Allow-Methods "GET, OPTIONS"
 Header set Access-Control-Allow-Headers "X-MY_CUSTOM_HEADER1,X-MY_CUSTOM_HEADER2"
 Header set Access-Control-Allow-Origin "*"

当然,mod_headers需要开启 Apache 模块才能使上述功能正常工作。此外,将 allow-origin 设置为通配符是有风险的,如果您发送Access-Control-Allow-Credentials: true标头,它实际上会导致请求失败(在这种情况下不能使用通配符)。此外,使用SetEnvIfApache 的 mod,您可以微调 htaccess 文件以仅在适当的时候返回标头,而不是针对该目录的所有请求。

于 2012-04-25T11:06:44.303 回答