如何在我的nginx响应的位置标题中指定协议?

时间:2016-06-30 07:16:08

标签: python nginx flask uwsgi flask-restful

我有一个使用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:标头值来回显请求的协议和主机名,或者剥离主机部分并只留下路径部分。

0 个答案:

没有答案