cors - 上传 Nifi 模板响应 403 错误 + 浏览器记录无效的 CORS 请求
问题描述
我在反向 HAProxy 1.8 后面设置了一个带有简单 Nifi 1.9.2 服务的实验沙箱。除了上传模板的功能外,一切都按预期工作。我目前没有使用任何形式的身份验证或证书(它是一个沙盒)
在 HAProxy 中设置代理很简单:
backend service-nifi
# I think this first line is the issue
http-request set-header Origin http://127.0.0.1:8080
http-request add-header X-ProxyPort 80
http-request add-header X-ProxyScheme http
http-request add-header X-ProxyHost experimental
server nifi-server 127.0.0.1:8080 check
相关的Nifi属性部分如下:
# web properties #
nifi.web.war.directory=./lib
nifi.web.http.host=127.0.0.1
nifi.web.http.port=8080
nifi.web.http.network.interface.default=
nifi.web.https.host=
nifi.web.https.port=
nifi.web.https.network.interface.default=
nifi.web.jetty.working.directory=./work/jetty
nifi.web.jetty.threads=200
nifi.web.max.header.size=16 KB
# whatever I put next breaks my current setup. I don't understand why yet
nifi.web.proxy.context.path=
nifi.web.proxy.host=
我到处寻找无效请求背后的解决方案,答案总是相同的:当前版本的 Nifi 具有 CORS 过滤,我应该将Origin
标头设置为 Nifi 期望的标题。我猜它应该如下(如set-header
行中所示):
- 方案:
http
- 主持人:
127.0.0.1
- 港口:
8080
我已经确认tcpdump
该请求正在按预期转发:
sudo tcpdump -s 1024 -l -A -i lo 'tcp port 8080' > dump
这是我的要求:
21:31:43 IP localhost.38642 > localhost.http-alt: Flags [P.], seq ..., ack ..., win ..., options [...], length ...: HTTP: POST /nifi-api/process-groups/{id}/templates/upload HTTP/1.1
...
POST /nifi-api/process-groups/{id}/templates/upload HTTP/1.1
Host: experimental
User-Agent: Mozilla... Firefox...
Accept: application/xml, text/xml, */*; q=0.01
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------1434591419995738407236256922
Content-Length: 10378
Referer: http://experimental/nifi/
Origin: http://127.0.0.1:8080
X-ProxyPort: 80
X-ProxyScheme: http
X-ProxyHost: experimental
这是回应:
21:31:43 IP localhost.http-alt > localhost.38642: Flags [P.], seq ..., ack ..., win ..., options [...], length ...: HTTP: HTTP/1.1 403 Forbidden
...
HTTP/1.1 403 Forbidden
Date: Mon, 21 Oct 2019 21:31:43 GMT
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
X-XSS-Protection: 1; mode=block
Content-Length: 20
Server: Jetty(9.4.11.v20180605)
Invalid CORS request
我从存储库中知道 POST 不是端点接受的方法之一/process-groups/*/templates/upload
。
我还尝试通过调整conf/logback.xml
文件来帮助进行故障排除来提高所有内容的日志记录级别,但输出是压倒性的,而且主要是噪音。
我对这个问题感到非常沮丧。我已经阅读了很多关于这个问题的帖子,并且我已经尝试了几乎所有的事情。很多示例使用 NginX 或 Apache。我没有那种灵活性,但我认为 HAProxy 绰绰有余。我最好的选择是有些东西我没有看到或者我完全忽略了。
解决方案
如果您查看您的请求,则表明您正在被推荐,http://experimental/nifi/
而来源是http://127.0.0.1:8080
.
如果您更改了您正确怀疑是问题的第一行,http://experimental
那么帖子应该会成功通过。
或者,不太正确的 hacky 方法是添加一个带有 value 的 Access-Control-Allow-Origin 标头http://127.0.0.1:8080
。
推荐阅读
- anki - 了解 Anki 如何确定什么是“完成学习卡组”
- javascript - 通过 jQuery 捕获具有特定数据切换的所有对象
- javascript - 在 VUE.JS 中使数组实例动态化
- mysql - 错误 1064 - 你的 SQL 语法有错误...尽管在线语法检查器说代码是正确的
- javascript - 创建一个数组来创建一个json格式
- regex - 用不带 \L 的小写正则表达式替换大写
- javascript - 如何递减和递增值,并显示值
- kubernetes - 为什么 EKS 中默认有两个 ENI?
- visual-studio - 带有转义字符的 Web.config XML 转换
- java - 如何在我的 Gradle 项目中使用 Trove4j 库