NGINX将HEAD转换为GET请求


10

由于一些糟糕的设计决策,我们有一个应用程序无法响应HTTP HEAD请求(返回“不允许使用方法”)。修改软件以正确返回HEAD请求将很棘手,不是没有可能,但是需要额外的工作。该应用程序位于NGINX代理后面,我想知道是否有一种方法可以使NGINX将从客户端收到的HEAD请求转换为对后端的GET请求,然后丢弃响应(将报头除外)并将其发送回给客户端,就像我们的应用程序服务器能够响应HEAD请求一样。

当前配置(相当标准)

upstream ourupstream{
    server unix:/var/apps/sockets/ourapp.socket.thread1
    server unix:/var/apps/sockets/ourapp.socket.thread2
    server unix:/var/apps/sockets/ourapp.socket.thread3
    [like 20 of these]
}

server {
    listen       1.2.3.4:80;
    server_name  ourapp;

    access_log  /var/apps/logs/ourapp.nginx.plog    proxy;
    error_log   /var/apps/logs/ourapp.nginx.elog    info;

    gzip on;

    gzip_types  text/plain text/html;

    proxy_intercept_errors on;
    proxy_connect_timeout 10;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_next_upstream error timeout;
    client_max_body_size 2m;

    error_page 404 /static/404.html;
    error_page 500 501 502 503 504 =500 /static/500.html;

    location / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass http://ourupstream/;
    }

    location /static/ {
        root /var/apps/global/;
    }
}

您如何将请求传递给后端?proxy_pass?fastcgi_pass?您可以粘贴当前配置吗?您正在运行哪个版本的Nginx?
kolbyjack 2012年

@kolbyjack proxy_pass使用unix套接字,在开发中使用NGINX 1.1.12和1.0.11,在生产中使用1.0.11(我们即将将生产移至1.1.12)
涂抹2012年

Answers:


5

由于您正在使用proxy_pass,因此我认为您必须使用一些error_page滥用(并且由于您已经在使用error_pages,因此还需要启用递归错误页面)。我认为这将为您工作:

upstream ourupstream{
    server unix:/var/apps/sockets/ourapp.socket.thread1
    server unix:/var/apps/sockets/ourapp.socket.thread2
    server unix:/var/apps/sockets/ourapp.socket.thread3
    [like 20 of these]
}

server {
    listen       1.2.3.4:80;
    server_name  ourapp;

    access_log  /var/apps/logs/ourapp.nginx.plog    proxy;
    error_log   /var/apps/logs/ourapp.nginx.elog    info;

    gzip on;

    gzip_types  text/plain text/html;

    proxy_intercept_errors on;
    proxy_connect_timeout 10;
    proxy_send_timeout 10;
    proxy_read_timeout 10;
    proxy_next_upstream error timeout;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    client_max_body_size 2m;

    error_page 404 /static/404.html;
    error_page 500 501 502 503 504 =500 /static/500.html;

    location @force_get {
        recursive_error_pages on;
        proxy_method GET;
        proxy_pass http://ourupstream;
    }

    location / {
        error_page 550 = @force_get;
        if ($request_method = HEAD) { return 550; }
        proxy_pass http://ourupstream;
    }

    location /static/ {
        root /var/apps/global/;
    }
}

这似乎仍然可以将主体返回给客户端,即使在有请求的情况下也是如此。有什么方法可以去除/忽略身体内容吗?
涂抹

我希望它能记住原始请求是HEAD并放下身体。对不起,我想不出另一种方法来实现这一目标。
kolbyjack 2012年

哦,对了,确实
可以满足
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.