遇到了一些麻烦,正如这里所记载的 -https://stackoverflow.com/questions/22570550/play-2-2-1-simpleresult-4xx-response-body-possible-via-cors-xhr
但我并没有关注 nginx,因为 200 OK 成功路径按预期工作。400 级 http 错误没有按预期工作。我没有收到正文,也无法在浏览器 XHR 对象中获取状态代码。
4xx http 错误通过 XHR 按预期工作(readyState=3 经历)仅有的当我从应用程序服务器传递 Access-Control-Allow-Origin 时,但我不希望它嵌入在代码中。
传递 4xx 响应的内容和状态标头的唯一方法是使用Headers更多Nginx模块? 不理想,但可行。
package controllers
import play.api._
import play.api.mvc._
import play.api.libs.iteratee.Enumerator
object Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
def goodResponse = Action { implicit request =>
// Ok("Hello world!")
SimpleResult(
header = ResponseHeader(200, Map(CONTENT_TYPE -> "application/json")),
body = Enumerator("Hello world!".getBytes())
)
}
def badResponse = Action { implicit request =>
// BadRequest(
// """{"error":"bad request"}"""
// )
SimpleResult(
header = ResponseHeader(
400,
Map(
CONTENT_TYPE -> "application/json",
ACCESS_CONTROL_ALLOW_ORIGIN -> "*" // FIXME: move to nginx?
)
),
body = Enumerator("""{"error":"bad request"}""".getBytes())
)
}
}
我的 nginx.conf 使用 proxy_pass 连接到端口 9000 上的播放服务器:
http {
# ...snipped...
upstream api {
server localhost:9000;
}
server {
#listen 80; ## listen for ipv4; this line is default and implied
#listen [::]:80 default ipv6only=on; ## listen for ipv6
listen 80;
listen 443 default_server ssl;
ssl_certificate /usr/local/etc/nginx/ssl/api.crt;
ssl_certificate_key /usr/local/etc/nginx/ssl/nginx.key;
root /usr/share/nginx/www;
index index.html index.htm;
# Make site accessible from https://api/
server_name api;
location / {
# See http://enable-cors.org/server_nginx.html
# Modified to set 'Access-Control-Allow-Origin' "$http_origin"
include nginx_cors.conf;
proxy_pass http://api;
}
}
}
答案1
检查整个 nginx 配置,确保没有proxy_intercept_errors on;
在某处进行设置。此设置应该off
在您的方案中。