我有一个使用uwsgi在nginx上运行的Flask-Restful应用程序。它的一些端点应该返回带有202 Accepted
标头的Location:
响应。
当我从python代码中放入Location:
标头时,我没有指定任何协议或主机名。
class MyEndpoint(MethodView):
def get(self):
...
return {"status": "Accepted"}, 202, {"Location": "/api/another/endpoint"}
但是,当我实际尝试请求时,它会以某种方式将协议和主机名放到位置标头中。
$ curl -I "https://api.myhost.com/api/myendpoint"
HTTP/1.1 202 ACCEPTED
Server: nginx/1.1.19
Date: Thu, 30 Jun 2016 03:18:53 GMT
Content-Type: application/json
Content-Length: 23
Connection: keep-alive
Location: http://api.myhost.com/api/another/endpoint
这是一个问题,因为即使我通过HTTPS请求了第一个端点,但Location:
标头附带了HTTP。当我向/api/another/endpoint
尝试另一个请求时,浏览器拒绝这样做,说它是一个不安全的XMLHttpRequest。
我不认为它是由Flask完成的,因为我没有把api.myhost.com
放在我的应用程序设置的任何地方。我怀疑它是nginx的工作,但我不知道如何修复它。
这是我的nginx配置。
server {
listen 80;
listen 443 ssl;
server_name api.myhost.com;
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
location / { try_files $uri @my_api; }
location @my_api {
include uwsgi_params;
uwsgi_pass unix:/var/run/uwsgi/my-api.sock;
}
}
我想要的只是Location:
标头值来回显请求的协议和主机名,或者剥离主机部分并只留下路径部分。