现在我的兴趣是使用远程对象与Apache Royale使用Amfphp与我的服务器进行通信,我在CORS上挣扎。
我第一次尝试使用SimpleRemoteObject
是这样的错误:
Access to XMLHttpRequest at '*http://url_to_your_server/gateway.php*' from origin 'null' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
当我从本地启动我的应用程序并使用 AMF 与我的服务器通信时,CORS 阻止请求,因为请求者来源是本地主机而不是我的服务器域。
经过一些谷歌搜索,我找到了一个解决方案:启动带有一些细节参数的 Chrome。这是我的启动.json文件:
{
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "Launch Chrome",
"url": "${workspaceFolder}/bin/js-debug/index.html",
"runtimeArgs": [
"--disable-web-security"
],
"webRoot": "${workspaceFolder}",
"preLaunchTask": "build"
}
]
}
您如何看待此解决方案?还有其他解决方案吗?
问候
[更新] 警告:自 chrome 最新版本(2020 年 3 月(以来 - 禁用网络安全无法正常工作:由于禁止保存 cookie,PHPSESSID 不再工作
无需禁用Chrome的网络安全即可避免此问题的另一种方法是运行指向您的应用程序的本地nginx网络服务器,同时允许它代理到您的后端。
这是我的nginx配置的内脏版本,给你一个基本的想法:
http {
server {
listen 80;
location / {
root /path_to_your/bin/js-debug;
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://url_to_your_server:80;
}
}
}
使这项工作的关键是try_files
.它将首先尝试您尝试的路径,然后在第一个、第二个等处找不到资源,则尝试后续路径。
例:
在浏览器中访问http://localhost/
将首先加载index.html
文件,该文件将加载Royale应用程序。当您的应用向 AMF 网关发出请求时,例如http://localhost/amf
,它将尝试使用try_files
设置的每个路径。它不会在$uri
或$uri/
找到/amf
,但会在@backend
找到它。
这实际上与 Carlos 建议的在与后端相同的 Web 服务器上运行应用程序相同,而无需禁用 Web 安全性。
该解决方案适用于本地测试。在生产环境中,royale 客户端将托管在与 AMFPHP 后端相同的域中,因此问题将消失。实际上,您通常会将应用程序配置为在为royale客户端提供服务的localhost中进行测试,这也将消除该需求。