2015-07-24 24 views
9

Tôi đang cố gắng xây dựng một ứng dụng Ember với khung công tác PHP REST làm api của tôi tại địa phương. Ứng dụng Ember đang được phục vụ tại http://localhost:4200 và api đang được phân phát từ chỉ http://localhost. Điều này gây ra vấn đề về CORS. Tôi đã thử tất cả mọi thứ mà tôi có thể nghĩ đến, nhưng tôi vẫn nhận được một lỗi trở lại nói rằng yêu cầu đã bị chặn và kênh preflight đã không thành công. Nó không thành công trong Firefox hoặc Chrome.Kênh preflight CORS không thành công

Tôi đã thêm dòng sau vào file .htaccess cho api của tôi:

Header set Access-Control-Allow-Methods "GET, POST, OPTIONS" 
Header set Access-Control-Allow-Origin "http://localhost:4200" 
Header set Access-Control-Allow-Credentials true 
Header set Access-Control-Allow-Headers "accept, content-type" 

Dưới đây là yêu cầu tiêu đề của tôi:

Host: localhost 
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Origin: http://localhost:4200 
Access-Control-Request-Method: POST 
Access-Control-Request-Headers: content-type 
Connection: keep-alive 
Pragma: no-cache 
Cache-Control: no-cache 

Và các tiêu đề phản ứng:

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers: accept, content-type 
Access-Control-Allow-Methods: GET, POST, OPTIONS 
Access-Control-Allow-Origin: http://localhost:4200 
Connection: close 
Content-Type: text/html; charset=utf-8 
Date: Fri, 24 Jul 2015 17:10:49 GMT 
Server: Apache/2.4.9 (Win64) PHP/5.5.12 
Set-Cookie: 24fd751c8630b64fcf935a94e8bcef46=qih6pfnqo94d4cgi5b5d79h4i6; path=/ 
Transfer-Encoding: chunked 
X-Powered-By: PHP/5.5.12 
p3p: CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM" 

Bất kỳ ý tưởng hay giải pháp? Bất kỳ trợ giúp được đánh giá cao. Cảm ơn!

Trả lời

1

Vì trạng thái this answer, việc xử lý thích hợp yêu cầu OPTIONS trước chuyến bay là cần thiết, nhưng KHÔNG HIỆU SUẤT đối với yêu cầu tài nguyên trên nhiều trang web hoạt động. Tất cả các phản hồi cho bất kỳ yêu cầu tiếp theo nào sau prefligh phải bao gồm Access-Control-Allow-Headers. Hi vọng điêu nay co ich.

+0

Cảm ơn, nhưng tôi không có bất kỳ tiêu đề tùy chỉnh nào và thậm chí không đến được điểm đó. – NicholasJohn16

+0

Vì bạn không đặt bất kỳ tiêu đề tùy chỉnh nào tại sao bạn đặt các tiêu đề cho phép kiểm soát truy cập trong yêu cầu của mình? Tôi không thấy tập hợp tiêu đề kiểu nội dung, vì vậy nó xuất hiện không cần thiết. – Buyuk

+0

Đó là. Nó chỉ là một nỗ lực để làm cho nó hoạt động. Nó thực sự không cần thiết theo như tôi hiểu. – NicholasJohn16

2

Một vấn đề có thể xảy ra là trình duyệt không lưu vào bộ nhớ cache phản hồi của máy chủ theo yêu cầu OPTIONS của trình duyệt. Để khắc phục điều này, hãy thử bao gồm tiêu đề "Access-Control-Max-Age" trong phản hồi của bạn và đặt nó thành một cái gì đó như '86400' (1 ngày). Một vấn đề khác, theo tài liệu MDN's trên CORS, có thể là do bạn chỉ định nguồn gốc cụ thể chứ không chỉ sử dụng phản hồi ký tự đại diện cho nguồn gốc, bạn cần bao gồm tiêu đề "thay đổi" trong phản hồi của bạn để chỉ định phản hồi từ máy chủ sẽ phụ thuộc vào nguồn gốc của yêu cầu. Điều này có thể được thực hiện trong các câu trả lời như sau:

Vary: Origin 

Nếu bạn nhận được một lỗi CORS với yêu cầu chính của bạn sau một yêu cầu OPTIONS thành công, tôi tin rằng bạn cũng cần phải bao gồm "Access-Control-Allow-Origin" tiêu đề và tiêu đề "Vary" trong phản hồi đó.

Hy vọng điều này sẽ hữu ích!

+0

Xin chào. Tôi đang sử dụng AngularJS để tương tác với Woocommerce API. Tôi có thể lấy dữ liệu, nhưng khi tôi thử POST, tôi nhận được lỗi 'Phản hồi cho preflight có mã trạng thái HTTP không hợp lệ 401'. Bất kỳ sự trợ giúp nào cũng được đánh giá cao. –

4

Bạn có phải là preflight OPTIONS yêu cầu trả lại 200 không? Bạn có thể thử trả lại 200 phản hồi bằng .htaccess của bạn như sau:

Header always set Access-Control-Allow-Methods "GET, POST, OPTIONS" 
Header always set Access-Control-Allow-Origin "http://localhost:4200" 
Header always set Access-Control-Allow-Credentials true 
Header always set Access-Control-Allow-Headers "accept, content-type" 

RewriteEngine On 
RewriteCond %{REQUEST_METHOD} OPTIONS 
RewriteRule ^(.*)$ $1 [R=200,L] 
+0

Không, nó quay trở lại 500 vì vấn đề CORS. Tôi đã tuân thủ mã js và chuyển tất cả sang cùng một miền và nó hoạt động hoàn hảo. Vấn đề duy nhất là CORS. – NicholasJohn16

1

Trong servlet phía máy chủ, thêm tiêu đề và trả lại trạng thái 200. Ví dụ từ dịch vụ WCF RESTFul, nơi mã sau được thêm vào tệp Global.asax

protected void Application_AuthenticateRequest(object sender, EventArgs e){ 
    Response.AddHeader("Access-Control-Allow-Origin", "*"); 
    if (Context.Request.HttpMethod.Equals("OPTIONS")) { 
     Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); 
     Response.AddHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     Response.StatusCode = (int)System.Net.HttpStatusCode.OK; 
     Context.ApplicationInstance.CompleteRequest(); 
    } 
} 
Các vấn đề liên quan