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

Mark Preston mark.j.preston at gmail.com
Fri Sep 11 14:48:26 MSD 2009

Hi All,

I'm getting the "zero length URI to proxy" error from line 925 in

I'm the guy using nginx as a forward proxy, using Igor's config suggestion
from yesterday:

    resolver; # 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?


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)

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
> 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
> "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
> 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
> 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
> the http_sub module, I'm thinking I don't even need ICAP, since we only
> 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
> (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; # 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://nginx.org/pipermail/nginx/attachments/20090911/ef94c3de/attachment.html>

More information about the nginx mailing list