nginx returns html instead of json response

Maxim Dounin mdounin at mdounin.ru
Tue Nov 8 05:48:33 UTC 2022


Hello!

On Mon, Nov 07, 2022 at 08:59:51PM +0530, Kaushal Shriyan wrote:

> I am running the nginx version: nginx/1.22 as a reverse proxy server on
> CentOS Linux release 7.9.2009 (Core). Is there a way to return json
> response when i hit http://mydomain.com/api/v1/* instead of the html
> response.
> 
> location /api/v1/* {
>     internal;
>     add_header 'Content-Type' 'application/json charset=UTF-8';
> 
>     error_page 502 '{"error": {"status_code": 502,"status": "Bad
> Gateway"}}';
> }
> 
> But whenever I try to send a request to /api/v1/users via curl I get the
> HTML source code in response instead of JSON response.
> 
> Please guide me. Thanks in advance. I look forward to hearing from you.

First of all, the "/api/v1/*" does not look like a valid prefix.  
Note that "*" is not special in prefix locations, so you need just 
"/api/v1/" to match relevant requests.  See 
http://nginx.org/r/location for details.

Further, trying to overwrite the Content-Type returned with the 
add_header directive will fail, as nginx will still send the 
Content-Type as set by the "types" and "default_type" directive.  
See http://nginx.org/r/types for details.  To set charset you can 
use the "charset" directive, see http://nginx.org/r/charset.

Additionally, the "error_page" directive does not accept strings.  
If you want to return a string directly from nginx in case of an error, 
you can use error_page with an internal URI, and then use the 
"return" directive to return the text.  See 
http://nginx.org/r/error_page and http://nginx.org/r/return for 
details.

And, as already pointed out in another response, the "internal" 
directive implies that the location won't be accessible from the 
outside, so you have to remove it.  See 
http://nginx.org/r/internal for details.

Further, your location does not contain actual proxying - so you 
probably want to add some, or all matched requests will be 
considered requests to static files.

Summing the above, valid configuration will look like:

location /api/v1/ {
    error_page 502 /error502;
    proxy_pass ...
}

location = /error502 {
    default_type text/json;
    charset UTF-8;
    charset_types text/json;
    return 200 '{"error": {"status_code": 502,"status": "Bad Gateway"}}';
}

It might be a good idea to start with reading some introductory 
articles at http://nginx.org/en/docs/, notably:

Beginner’s Guide
http://nginx.org/en/docs/beginners_guide.html

and

How nginx processes a request
http://nginx.org/en/docs/http/request_processing.html

Hope this helps.

-- 
Maxim Dounin
http://mdounin.ru/



More information about the nginx mailing list