How Can Query String Parameters Be Forwarded Through a Proxy_pass With Nginx?

Better Stack Team
Updated on October 7, 2024

When configuring Nginx as a reverse proxy using the proxy_pass directive, query string parameters are automatically forwarded to the backend server. This behavior is built-in and doesn’t require additional configuration for basic proxying. However, if you need to ensure specific handling or modify query parameters, here’s a detailed guide on how to manage query strings in Nginx:

1. Basic Proxy Pass

By default, query string parameters are included in the request that Nginx forwards to the backend server. Here’s a basic example of how to configure this:

Example Configuration:

 
server {
    listen 80;
    server_name your-domain.com;

    location / {
        proxy_pass <http://backend-server>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Explanation:

  • proxy_pass <http://backend-server>;: Forwards the request to http://backend-server, including the query string.
  • Query String Handling: The query string from the original request is automatically appended to the proxy_pass URL.

2. Modifying Query Strings

If you need to modify or filter query strings before forwarding the request, you can use Nginx variables and rewrite rules.

Example of Modifying Query Strings:

 
server {
    listen 80;
    server_name your-domain.com;

    location / {
        # Example of rewriting the query string
        rewrite ^/oldpath/(.*)$ /newpath/$1?$args last;

        proxy_pass <http://backend-server>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Explanation:

  • rewrite ^/oldpath/(.*)$ /newpath/$1?$args last;: This rule rewrites the URI and appends the original query string ($args) to the new URI. The $args variable holds the query string parameters.

3. Removing Query Strings

If you need to forward a request without query strings, you can use the rewrite directive to remove them.

Example of Removing Query Strings:

 
server {
    listen 80;
    server_name your-domain.com;

    location / {
        # Remove query string
        rewrite ^ /$uri? last;

        proxy_pass <http://backend-server>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Explanation:

  • rewrite ^ /$uri? last;: This removes the query string from the request before passing it to the backend server. The ?$uri ensures that only the path is forwarded.

4. Forwarding with Custom Query Strings

If you need to add custom query strings when forwarding requests, you can do this using the proxy_pass directive with a variable.

Example of Adding Custom Query Strings:

 
server {
    listen 80;
    server_name your-domain.com;

    location / {
        # Add custom query string
        set $new_query_string "custom=value";
        proxy_pass <http://backend-server?$new_query_string>;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Explanation:

  • set $new_query_string "custom=value";: Defines a variable with the custom query string.
  • proxy_pass <http://backend-server?$new_query_string;:> Appends the custom query string to the URL when forwarding the request.

5. Testing and Verifying

After configuring your Nginx settings, it’s important to test and verify that query strings are being handled as expected:

Test Configuration:

 
sudo nginx -t

Restart Nginx:

 
sudo systemctl restart nginx

Verify Functionality:

  • Check Logs: Use access.log and error.log to debug and verify how requests are being forwarded.
  • Test Requests: Use a tool like curl or Postman to send requests with query strings and verify the behavior.

Summary

To forward query string parameters through proxy_pass with Nginx:

  1. Basic Proxy Pass: Query strings are forwarded automatically.
  2. Modify Query Strings: Use rewrite and $args to adjust query strings.
  3. Remove Query Strings: Rewrite the URI to exclude query strings.
  4. Add Custom Query Strings: Use variables in the proxy_pass directive.
  5. Test and Verify: Ensure the configuration works as intended and check logs for any issues.

This approach helps ensure that your Nginx reverse proxy setup handles query strings according to your requirements.

Got an article suggestion? Let us know
Licensed under CC-BY-NC-SA

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.

Make your mark

Join the writer's program

Are you a developer and love writing and sharing your knowledge with the world? Join our guest writing program and get paid for writing amazing technical guides. We'll get them to the right readers that will appreciate them.

Write for us
Writer of the month
Marin Bezhanov
Marin is a software engineer and architect with a broad range of experience working...
Build on top of Better Stack

Write a script, app or project on top of Better Stack and share it with the world. Make a public repository and share it with us at our email.

community@betterstack.com

or submit a pull request and help us build better products for everyone.

See the full list of amazing projects on github