nginx rewrites $request_method on error

Yichun Zhang (agentzh) agentzh at gmail.com
Wed May 7 21:40:55 UTC 2014


Hello!

On Tue, May 6, 2014 at 11:30 PM, kay wrote:
> Sure, you can use nginx.conf from my previous message and this server
> config:
>

I've noticed 2 obvious mistakes in your config. See blow.

> server {
>     listen       80;
>
> rewrite_by_lua '
> local res = ngx.location.capture("/memc?cmd=get&key=test")
> ngx.say(res.body)
> ';
>

1. It is not recommended to use the rewrite_by_lua directive directly
in the server {} block. Because this rewrite_by_lua directive will
just get inherited by every location in that server {} block by
default, including 1) your location /memc, which will create a
subrequest loop because you initiate a subrequest in your
rewrite_by_lua code to /memc, and 2) your error pages like
/error.html. And I'm sure this is not what you want.

2. If you generate a response in rewrite_by_lua by calls like
"ngx.say()", then you should really terminate the current request
immediately, via "ngx.exit(200)" or something like that, otherwise
nginx will continue to run later phases like the "content phase"
(which is supposed to generate a response) and you will face duplicate
responses for the same request.

Another suggestion is to check out your nginx error logs for hints (if
any). If the existing info is not enough, you can further enable
nginx's debugging logs: http://nginx.org/en/docs/debugging_log.html

Finally, ensure your version of ngx_lua, ngx_memc, and the nginx core
are recent enough.

Good luck!
-agentzh



More information about the nginx mailing list