我已经处理这个问题好几天了。我是一名开发人员,我对这些事情的了解非常有限,但这家公司仍然没有人可以帮助我解决这个问题。这个问题确实必须解决,因为它正在成为一个阻塞问题。
我们正在运行带有 Apache 安装的 AS/400 来部署 REST 服务。我不太了解很多技术细节,但信息报告"Apache server <servername> - Apache/2.4.2 (IBM i)"
。
问题在于 CORS:使用 PUT/DELETE 时,会向服务器发送预检 OPTIONS 请求。响应返回一个200 OK
,但不会返回像 这样的 CORS 标头Access-Control-Allow-Origin *
。因此(我假设)真正的请求未执行,浏览器返回 CORS 错误:
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Web 服务已配置为返回此标头,但无法为 OPTIONS 请求返回此标头。
我尝试配置 Apache,使其始终返回此标头,但不起作用。无论我添加哪个标头,它都不会返回到浏览器。
我的httpd.conf:
LoadModule mod_ibm_lwi /QSYS.LIB/QHTTPSVR.LIB/QLWIIHSMOD.SRVPGM
HotBackup Off
KeepAlive Off
DocumentRoot /www/WS_REST_BE/htdocs
AddLanguage en .en
LogMaint logs/error_log 7 0
LogFormat "%h %T %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Listen *:10043
<Location />
AllowOverride All
Require all granted
Header set Access-Control-Allow-Origin "*"
</Location>
LoadModule was_ap20_module /QSYS.LIB/QHTTPSVR.LIB/QSVTAP24.SRVPGM
WebSpherePluginConfig /www/WS_REST_BE/conf/ias-plugin-cfg.xml
<LwiProfile WS_REST_BE>
LwiAssignUserID WEBSBEPRD
LwiAutostartOption StartEnd
LwiStartJobQueue QHTTPSVR/QZHBHTTP HTTPWWW
</LwiProfile>
AddCharset UTF-8 .html .js
AddDefaultCharset utf-8
我已经尝试在配置中的不同位置设置标头,但就是不起作用。IBM 文档明确表示 mod_headers 受支持(并且应该启用)。
我希望这里有人可以指导我找到正确的方向来解决这个问题。
注意:如果我需要提供更多信息,请随时询问!
答案1
我自己开发 REST 服务,但我使用 JavaEE 中的拦截器将 CORS 标头实现到响应中。您的错误消息指出
所请求的资源上不存在“Access-Control-Allow-Origin”标头。
,据我所知,它引用了 POST/DELETE 请求。尝试将 CORS 标头添加到 POST/DELETE 答案中。
据我了解,问题不应该出在 Apache 上,而应该出在 REST 服务上。另请参阅:https://en.wikipedia.org/wiki/Cross-origin_resource_sharing#How_CORS_works
答案2
好的,这只是猜测,但是:
您的Header
指令位于 内<Location /> ... </Location>
。当客户端发送预检请求时,它使用 HTTPOPTIONS
方法。由于OPTIONS
不请求任何特定资源,因此该Location
指令可能无法激活。
尝试将您的Header
指令移到 之外Location
。