我有一个基于 GET
的网络服务。要访问此 Web 服务,需要传递一些自定义 header 。
当我尝试使用 GET
方法从 javascript 代码访问 Web 服务时,请求方法正在更改为 OPTIONS
。 (域不同)
我阅读了一些文章,发现带有自定义 header 的请求将被预检,在这种情况下,在实际方法调用之前,将向服务器发出带有 OPTIONS 方法的请求。
但我的问题是在 OPTIONS
调用之后,真正的方法(即 GET
)没有被调用。
OPTIONS
调用返回 401 状态。
我怀疑这是因为我的网络服务仅支持 GET
。我该如何解决这个问题?
请帮忙。
(我的代码在 IE 上运行良好,但在其他浏览器(例如 Chrome)上运行不正常)
最佳答案
需要检查两件事(不知道您的服务器端语言/技术是什么):
您是否将
OPTIONS
作为有效方法包含在您的Access-Control-Allow-Methods
中?示例:Access-Control-Allow-Methods: GET, OPTIONS
您的请求发送的自定义 header 是否按允许返回给浏览器? 示例:
Access-Control-Allow-Headers: X-PINGOTHER
在任何安全的、符合标准的浏览器(即不是旧版本的 IE)允许非源响应通过之前,远程服务器必须返回这两个(肯定是第二个)。
因此,如果您想在 HTTP 服务器级别实现它并保持您的网络服务可移植,您可以尝试以下方法:
我们假设您的网络服务 URL 是 http://example.org/service
并且服务路径是 /srv/www/service
如果您运行的是 Apache 2.0,附加 header 的语法是 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
header (不能使用在这种情况下是通配符)。此外,使用 Apache 的 SetEnvIf
mod,您可以微调 htaccess 文件以仅在适当时返回 header ,而不是针对对该目录的所有请求。
关于javascript - 如何处理来自 Web 服务的飞行前请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10314255/