Tôi đang làm việc trên một dự án AngularJS và hiện đang ở http://localhost
và một chương trình phụ trợ laravel trong http://api.localhost
, cả hai đều được phục vụ bởi máy chủ nginx.
Khi thực hiện yêu cầu $ http.post, trước tiên, góc cạnh sẽ gọi TÙY CHỌN CORS và tôi đã định cấu hình máy chủ nginx của mình để phản hồi với các tiêu đề chính xác:
vị trí/{
add_header "Kiểm soát truy cập-Cho phép-Xuất xứ" "*";
add_header "Kiểm soát truy cập-Cho phép-Thông tin xác thực" "true";
add_header "Phương thức kiểm soát truy cập cho phép" "NHẬN, ĐĂNG, XÓA, PUT, TÙY CHỌN";
add_header "Kiểm soát truy cập-Cho phép-Tiêu đề" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization";
add_header "Kiểm soát truy cập-Tuổi tối đa" "1728000";
nếu ($request_method = 'TÙY CHỌN') {
trả về 204;
}
#try_files $uri $uri/ /index.html;
try_files $uri /index.php?$query_string;
}
vị trí = /index.php {
add_header "Kiểm soát truy cập-Cho phép-Xuất xứ" "*";
add_header "Kiểm soát truy cập-Cho phép-Thông tin xác thực" "true";
add_header "Phương thức kiểm soát truy cập cho phép" "NHẬN, ĐĂNG, XÓA, PUT, TÙY CHỌN";
add_header "Kiểm soát truy cập-Cho phép-Tiêu đề" "Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Authorization";
add_header "Kiểm soát truy cập-Tuổi tối đa" "1728000";
nếu ($request_method = 'TÙY CHỌN') {
trả về 204;
}
...
}
Mô-đun Angular của tôi cũng được cấu hình với:
.config(['$httpProvider', function($httpProvider) {
$httpProvider.defaults.useXDomain = true;
xóa $httpProvider.defaults.headers.common['X-Requested-With'];
}])
Cuộc gọi OPTIONS trả về như mong đợi:
Kiểm soát truy cập-Cho phép-Thông tin xác thực:true
Access-Control-Allow-Headers:Keep-Alive,User-Agent,If-Modified-Since,Cache-Control,Content-Type,Ủy quyền
Phương thức kiểm soát truy cập-Cho phép-GET,POST,DELETE,PUT,OPTIONS
Kiểm soát truy cập-Cho phép-Xuất xứ:*
Kiểm soát truy cập-Tuổi tối đa: 1728000
Kết nối: duy trì sự sống
Ngày:Thứ Hai, 04/11/2013 02:14:16 GMT
Máy chủ:nginx/1.2.6 (Ubuntu)
Nhưng các cuộc gọi POST tiếp theo mà tôi thực hiện không thành công với trạng thái CANCELED và góc sẽ ném lỗi vào bảng điều khiển JS:
`XMLHttpRequest không thể tải http://api.localhost/users/accesstokens. Nguồn gốc http://localhost không được Access-Control-Allow-Origin cho phép.`
Đêm qua tôi đã thức khuya và nó vẫn hoạt động, nhưng hôm nay khi tôi thử lại thì nó lại trở về như cũ. Câu hỏi tồi tệ nhất bao giờ hết!
làm gì?
EDIT: Tôi đã tìm ra vấn đề nhưng tôi vẫn không hiểu. Tôi đã xem nhật ký truy cập nginx của mình và thấy rằng yêu cầu POST thực sự đang truy cập vào máy chủ, mặc dù trạng thái đã bị HỦY. Tôi cũng thấy phản hồi là 401. Sau khi yêu cầu của tôi đúng, phản hồi là 201. Vẫn trạng thái CANCED như cũ. Nhưng khi tôi điều chỉnh trạng thái thành 200, thì đấy! Yêu cầu hoạt động như mong đợi.
Có lý do nào khiến AngularJS chỉ chấp nhận 200 trạng thái trong các yêu cầu có nguồn gốc chéo không?
Dịch vụ $http của Angular.js coi mọi trạng thái từ 200 đến 299 là hợp lệ, bạn có thể thấy nó trong mã nguồn $http; đâyVà đâyTôi không thể tìm thấy trạng thái mã hóa cứng 200 ở bất kỳ nơi nào khác.
Bất chấp thông báo trên bảng điều khiển Chrome, vấn đề có thể xảy ra với Alistair Robinson điểm trong bài viết nàyKiểm tra xem nginx của bạn có được cập nhật lên phiên bản ổn định mới nhất hay không và sau đó kiểm tra xem nó có gửi tiêu đề 'Độ dài nội dung' chính xác hay không, nếu không, tôi sẽ sử dụng giải pháp của Alistair để điền tiêu đề Độ dài nội dung theo cách thủ công.
Tôi là một lập trình viên xuất sắc, rất giỏi!