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

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:**

```bash
sudo nginx -t
```

**Restart Nginx:**

```bash
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.