2016-01-10 101 views
5

我有一個本地的Django設置如下Django的本地主機CORS不工作

Django Rest Frameworklocalhost:8000

AngularJS frontendlocal apache running on http://localservername

我已經安裝django-cors-headers和我settings.py,我設置我的

CORS_ORIGIN_WHITELIST = (
    'http://localhost', 
    'localservername', 
    'http://localservername', 
    '127.0.0.1' 
) 


MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware', 
'corsheaders.middleware.CorsMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware', 
) 

但是,我得到No 'Access-Control-Allow-Origin' header is present on the requested resource.錯誤,只要我點擊從Rest Framework提供的任何API。如果我設置了CORS_ORIGIN_ALLOW_ALL = True,那麼API的工作正常,但對我的服務器端數據來說這是非常不安全的。

我必須改變以解決這個問題?

+0

您是否在'django.middleware.common之前添加了'corsheaders.middleware.CorsMiddleware'。你的'INSTALLED_APPS'中的CommonMiddleware'和'corsheaders'? –

+0

@DaniilRyzhkov,是的,我有,我會添加到我的問題 – Newtt

+0

@HamletHakobyan,沒關係,因爲我的請求是從'localservername'到'localhost:8000' – Newtt

回答

2

根據http://www.w3.org/Security/wiki/Same_Origin_Policy,這些請求應該來自同一端口,方案和主機,並被視爲同一來源。這裏你的一臺服務器在80端口,另一臺在8080.

一個源由一個URL的方案,主機和端口定義。一般而言,從不同來源檢索到的文件彼此隔離,從 隔離。例如,如果從 http://example.com/doc.html嘗試檢索一個文件訪問來自https://example.com/target.html檢索文檔 的DOM中,用戶代理將 不允許訪問,因爲第一文件的原點,(HTTP, example.com,80),確實不符合第二份文件 (https,example.com,443)的來源。

0

我有同樣的問題。通過瀏覽django-cors-headers -code發現我的錯誤是如下:

雖然一個完整的CORS頭看起來像這樣(通知架構和主機名):

Access-Control-Allow-Origin: https://example.com 

CORS_ORIGIN_WHITELIST設置希望它以比較的格式到Origin -header,這是隻有主機(可能的端口)

def origin_found_in_white_lists(self, origin, url): 
    return (
     url.netloc in conf.CORS_ORIGIN_WHITELIST or 
     (origin == 'null' and origin in conf.CORS_ORIGIN_WHITELIST) or 
     self.regex_domain_match(origin) 
    ) 

雖然正則表達式,白名單進行比較靠的urlparse.netlocdocs)完成Origin-標題。

所以正確的設置(如設置手動正確地指出,但無法正確描述的例子)將是:

CORS_ORIGIN_WHITELIST = (
    'example.com', 
) 

這可能是,如果你不想讓你的API談一個問題網站的非安全http版本。在這種情況下使用RegEx。

另請注意:在進行故障排除期間,如果找不到匹配,我發現CORS頭是完全不存在的。這意味着缺少頭文件並不能確切顯示中間件的完整故障,但可能只是錯誤配置。