同一IIS服务器下ASP.Net站点嵌入使用httpPlatformHandler的Python站点时X-Frame-Options跨域问题解决咨询
同一IIS服务器下ASP.Net站点嵌入使用httpPlatformHandler的Python站点时X-Frame-Options跨域问题解决咨询
兄弟,我太懂你这种明明两个站点同属一个域名,结果嵌个iframe就被拦截的憋屈了!先给你把核心问题掰明白:你误以为是httpPlatformHandler的动态端口导致了跨源,但其实浏览器根本看不到那个IIS和Python后端之间的内部端口——因为你的Python站点是通过IIS的/News路径做反向代理转发的,浏览器全程只和IIS的443(HTTPS)端口交互,看到的域名都是https://www.example.com,所以真正拦你的是Python站点返回的X-Frame-Options: Deny响应头,和跨源完全没关系!
下面给你两个精准的解决方向,不用开放所有站点:
一、修改Django(Python)站点的响应头配置,只允许同域名嵌入
现代浏览器推荐用Content-Security-Policy的frame-ancestors规则来控制iframe嵌入,比旧的X-Frame-Options更灵活:
- 打开Django项目的
settings.py文件 - 先关掉默认的框架拦截,再配置CSP规则:
如果你想更精确(和效果一致),也可以把# 关闭Django默认的X-Frame-Options: Deny设置 SECURE_FRAME_DENY = False # 配置只允许同域名的页面嵌入当前站点 CONTENT_SECURITY_POLICY = { "frame-ancestors": ["'self'"] }'self'换成你的域名"https://www.example.com"
如果你习惯用X-Frame-Options,也可以通过自定义中间件设置为SAMEORIGIN(只允许同域名嵌入):
- 在Django项目里新建一个中间件文件(比如
middleware.py),写入:def add_frame_options(get_response): def middleware(request): response = get_response(request) # 替换掉默认的Deny,只允许同域名嵌入 response.headers['X-Frame-Options'] = 'SAMEORIGIN' return response return middleware - 然后在
settings.py的MIDDLEWARE列表里注册这个中间件:MIDDLEWARE = [ # 其他中间件... '你的项目名.middleware.add_frame_options', ]
二、检查IIS是否给Python站点路径额外加了严格的响应头
有时候IIS的HTTP响应头模块会给特定路径(比如/News)单独设置X-Frame-Options: Deny,你可以检查一下:
- 打开IIS管理器,找到默认网站下的
News应用程序 - 双击「HTTP响应头」功能
- 查看有没有
X-Frame-Options的配置项,如果有且值是Deny,要么改成SAMEORIGIN,要么直接删除这个配置(让Django自己控制响应头)
最后验证步骤
改完之后,用浏览器F12打开开发者工具:
- 直接访问
https://www.example.com/News,切换到「网络」标签,查看该请求的响应头,确认:- 要么有
Content-Security-Policy: frame-ancestors 'self' - 要么
X-Frame-Options的值是SAMEORIGIN
- 要么有
- 再刷新ASP.NET的frontpage页面,iframe里的News页面应该就能正常显示了
备注:内容来源于stack exchange,提问作者Bob D
相关产品推荐
相关产品推荐

