同一域名上的 CORS 错误?
- 2025-02-28 08:22:00
- admin 原创
- 74
问题描述:
我现在遇到了一个奇怪的 CORS 问题。
错误信息如下:
XMLHttpRequest cannot load http://localhost:8666/routeREST/select?q=[...]
Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin
两台服务器:
localhost:8666/routeREST/ :这是一个简单的 Python Bottle 服务器。
localhost:8080/ :我运行 Javascript 应用程序的 Python simpleHTTPserver。此应用程序正在上述服务器上执行 Ajax 请求。
您认为可能存在什么问题吗?
编辑:
而且...问题出在端口上。谢谢你的回答 :)
如果有人也在使用 Python Bottle 服务器,那么你可以按照这篇文章给出的答案来解决 CORS 问题:
Bottle Py:为 jQuery AJAX 请求启用 CORS
解决方案 1:
只有当方案、域 和 端口相同时才相同。同源策略
澄清
http
并且https
不是同一种方案。(默认情况下它们也使用不同的端口)example.com
并且www.example.com
不是同一个域。端口
80
和443
不是同一个端口。
如何启用 CORS
如果要启用 CORS,则必须通过添加标头来遵循跨域资源共享 (cors) 。Mozilla 有示例。
在传入请求中你会得到一个Origin
标头:
Origin: https://example.com
您需要Access-Control-Allow-Origin
在响应中添加标题。要允许所有人(您可能不应该这样做):
Access-Control-Allow-Origin: *
多个来源
如果您需要支持多个来源(例如,和example.com
)www.example.com
,请将Access-Control-Allow-Origin
响应中的标头设置为Origin
与请求中的标头匹配(前提是您已验证来源在白名单上)。
为什么我会收到带有选项方法的请求?
请注意,有些请求会发送带有OPTIONS方法的预检请求,因此如果您编写自己的代码,您也必须处理这些请求。请参阅 Mozilla 中的示例。
解决方案 2:
端口号不同。
如果任何方案、主机名或端口不匹配,则该请求被视为跨域。
解决方案 3:
即使在前面包含 http:// 或 https:// 也很重要
我知道标题可能对很多人来说都是显而易见的,所以请允许我解释一下。在测试调用使用 Python FastAPI 开发的 API 的操作时,您可以在 API 代码中直接定义允许访问该 API 的 URL。我会在最后留下一个例子。
我发现,当我从本地主机上运行的 JavaScript 进行测试时,我可以不使用 http:// 作为开头,但是当我从 Docker 容器运行相同的 API 时,我不断收到 CORS 违规。我不记得以前使用此 API 时存在这个问题。
当我在允许的服务器名称和端口前面添加 http:// 时,BOOM——允许访问。
我希望这可以节省我所浪费的时间;-)!
快速 API CORS 设置示例:
# Container
long_server_name = "http://SomeFullyQualifiedServerName"
short_server_name = "http://SomeServerName"
# Local
# server_name = "http://127.0.0.1"
origins = [
"http://127.0.0.1:8000", # Conductor API
"http://127.0.0.1:5500", # Conductor Runner Dev
"http://127.0.0.1:5501", # Quote Runner Dev
"http://127.0.0.1:5502", # Quote Runner Dev
f"{long_server_name}:5000", # Conductor Web UI
f"{long_server_name}:5001", # Quote Runner
f"{short_server_name}:5000", # Conductor Web UI
f"{short_server_name}:5001", # Quote Runner
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
扫码咨询,免费领取项目管理大礼包!