nginx proxy_pass 在 http 4xx 时接收内容/状态标头

nginx proxy_pass 在 http 4xx 时接收内容/状态标头

遇到了一些麻烦,正如这里所记载的 -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在您的方案中。

相关内容