Ssl 否';访问控制允许原点';当在ingress nginx中启用tls时

Ssl 否';访问控制允许原点';当在ingress nginx中启用tls时,ssl,django-rest-framework,kubernetes-ingress,nginx-ingress,django-cors-headers,Ssl,Django Rest Framework,Kubernetes Ingress,Nginx Ingress,Django Cors Headers,我知道我的问题似乎已经有了很多答案,但请耐心听我说 我有一个Django应用程序在k8s集群上运行,带有带有letsencrypt暂存tls证书的nginx入口设置(生产证书也会出现问题) 我不知道这是否重要,但应用程序使用Basic Authentication来授权用户,这是使用drf内置认证系统设置的 我已按如下方式设置CORS: ### ingress.yaml apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata:

我知道我的问题似乎已经有了很多答案,但请耐心听我说

我有一个Django应用程序在k8s集群上运行,带有带有letsencrypt暂存tls证书的nginx入口设置(生产证书也会出现问题)

我不知道这是否重要,但应用程序使用
Basic Authentication
来授权用户,这是使用
drf
内置认证系统设置的

我已按如下方式设置CORS:

### ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: app-routing
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/cluster-issuer: "letsencrypt-staging"
    nginx.ingress.kubernetes.io/enable-cors: "true"
    nginx.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, PATCH, OPTIONS"
    nginx.ingress.kubernetes.io/cors-allow-origin: "https://example.com"
    nginx.ingress.kubernetes.io/cors-allow-credentials: "true"
    nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRFToken"
spec:
  tls:
  - hosts:
      - api.example.com
    secretName: app-ingress-tls
  rules:
    - host: api.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: service-backend
              servicePort: 80
在Django应用程序中:

### settings.py
...
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

CORS_ORIGIN_ALLOW_ALL = True
# I also tried setting:
# CORS_ORIGIN_WHITELIST = [
#     "https://example.com",
#     "https://www.example.com"
# ]
#

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.BasicAuthentication'
    ],
}

...
但当我从我的前端应用程序发送请求时,仍然会出现错误

Access to XMLHttpRequest at 'https://api.example.com/somepath' from origin 'https://example.com' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
奇怪的是,当我在入口中禁用tls时,问题就消失了。在启用tls的情况下,如果我使用邮递员或类似的方式发送请求:

curl-i-k-H“授权:基本令牌”https://api.example.com/somepath

我得到了预期的标题响应:

HTTP/2 200
server: nginx/1.17.7
date: Mon, 06 Jul 2020 18:58:50 GMT
content-type: application/json
content-length: 9
vary: Accept, Origin
allow: GET, HEAD, OPTIONS
x-frame-options: DENY
x-content-type-options: nosniff
strict-transport-security: max-age=15724800; includeSubDomains
access-control-allow-origin: https://example.com
access-control-allow-credentials: true
access-control-allow-methods: PUT, GET, POST, PATCH, OPTIONS
access-control-allow-headers: DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization,X-CSRFToken
我认为头文件存在是因为入口本身添加了它们(?)


我对整个devops世界都很陌生,所以如果有任何关于在哪里查找或检查内容的提示,我将不胜感激。这个问题的大多数答案都建议正确设置
CORS\u ORIGIN\u ALLOW\u ALL
和/或
CORS\u ORIGIN\u白名单,我已经尝试过了。

您遇到的问题与配置无关。底线是您尝试跨不同的子域发送请求(CORS正在阻止这一点)。你需要任何一套
nginx.ingres.kubernetes.io/cors允许原点
“https://api.example.com“
或从同一域提供API-例如
https://example.com/api