"zero length URI to proxy" in ngx_http_proxy_module.c (more forward proxy troubles)

Igor Sysoev is at rambler-co.ru
Fri Sep 11 15:07:23 MSD 2009


On Fri, Sep 11, 2009 at 03:48:26AM -0700, Mark Preston wrote:

> Hi All,
> 
> I'm getting the "zero length URI to proxy" error from line 925 in
> ngx_http_proxy_module.c.
> 
> I'm the guy using nginx as a forward proxy, using Igor's config suggestion
> from yesterday:
> 
> http
> {
>     resolver 127.0.0.1; # do not forget to run named on localhost
> 
>     server {
>         location / {
>             proxy_pass  http://$http_host$http_request_line;
>         }
>     }
> }
> 
> My understanding is that this is because $http_host$http_request_line is not
> getting evaluated on each request from the client, and instead just once
> upon some initialization cycle?

> I've tried adding a trailing '/' to the expression, to make it "proxy_pass
>  http://$http_host$http_request_line/;", which solves the "zero length URI
> to proxy" issue, but doesn't really have the correct behavior. That is, all
> requests to nginx in the form of example.com/foo end up being proxied to a
> backend URL of example.com/.

> So, my question is, what's the best way to get nginx to act as a forward
> proxy? Do I need to manually change the logic in ngx_http_proxy_module.c? If
> so, I was thinking I could take the URI from the r parameter in
> ngx_http_proxy_create_request and manually stuff it into ctx->vars.uri.
> Would this help, or what would put me on the right track?
> 
> Thanks,
> Mark
> 
> PS. An easy way to test the config is to set Firefox's proxy preferences to
> use the nginx instance. If you're able to surf the web through nginx, then
> the config is correct. So far, I've been unable to do this with the
> exception of the degenerate case mentioned above. (Where all "
> example.com/foo" requests get proxied to to "example.com/" on the backend)

Sorry, I mistaked:

-            proxy_pass  http://$http_host$http_request_line;
+            proxy_pass  http://$http_host$request_line;

> On Thu, Sep 10, 2009 at 02:12:55AM -0700, Mark Preston wrote:
> 
> > Hi All,
> >
> > My understanding is that nginx cannot be used as a forward proxy out of
> the
> > box. Is this correct?
> >
> > If so, my thinking is that by making some small modifications to
> > ngx_http_proxy_module.c, it would be possible to have a nginx.conf file
> with
> > "proxy_pass asdf", where asdf ends up being ignored with the new surgical
> > edits to ngx_http_proxy_module.c. Instead of doing the complex lookups to
> > figure out the backend server, it would simply pull out the "Host" from
> the
> > browser/client request being made, and use that as the appropriate URL to
> > fetch.
> >
> > Would this work?
> >
> > (As a background, I currently have a squid + ICAP setup in transparent
> proxy
> > mode, and it works fine for proof-of-concept, but falls over in terms of
> > performance. As a result, I'm trying to use nginx as a replacement. And
> with
> > the http_sub module, I'm thinking I don't even need ICAP, since we only
> add
> > a small snippet after the HTML head section of every web page.)
> >
> > If there are better / easier ways of getting nginx to work as a forward
> > proxy, please let me know, and I'd be happy to contribute the edits back.
> >
> > Thanks!
> > Mark
> >
> > PS. If the response is in Russian, that's cool too. I can read it just
> fine
> > (and speak it), but my writing is rather poor. :-)
> 
> Although writing in Russian is more easy for me I answer in English,
> since this is English mailing list.
> 
> You may try the following configuration:
> 
> http {
> 
>     resolver 127.0.0.1; # do not forget to run named on localhost
> 
>     server {
>         location / {
>             proxy_pass  http://$http_host$request_line;
>             sub         ...
>         }
>     }
> 
> However, I can not say that it will work without any issue.


-- 
Igor Sysoev
http://sysoev.ru/en/





More information about the nginx mailing list