NGINX는 HEAD를 GET 요청으로 변환


10

일부 끔찍한 디자인 결정으로 인해 응용 프로그램에서 HTTP HEAD 요청에 응답 할 수 없습니다 ( 'Method Not Allowed'반환). HEAD 요청을 올바르게 반환하도록 소프트웨어를 수정하는 것은 까다 롭지 만 불가능하지는 않지만 추가 작업이 필요합니다. 응용 프로그램은 NGINX 프록시 뒤에 있습니다 .NGNGX가 클라이언트로부터받은 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

@kolbyjack proxy_pass 유닉스 소켓을 사용하여, Nginx에 1.1.12 및 DEV에서 1.0.11, 1.0.11 생산에 (우리는 곧 1.1.12에 생산을 이동하고)
스머지

답변:


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/;
    }
}

이것은 여전히 ​​머리로 요청하더라도 몸을 클라이언트에게 돌려주는 것 같습니다. 본문 내용을 제거하거나 무시할 수있는 방법이 있습니까?
Smudge

나는 원래의 요청이 HEAD 였고 시체를 버렸다는 것을 기억하기를 바랐습니다. 다른 방법으로 생각할 수 없습니다. 죄송합니다.
kolbyjack

잘, 우리가 어쨌든 필요한 것에 충분히 가깝습니다
Smudge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.