Skip to main content

Nginx: Rewrite Path without normalizing URI in proxy_pass

·377 words·2 mins
Sebastian Scheibe
Author
Sebastian Scheibe
Table of Contents

Introduction
#

Understanding Nginx’s URL rewriting capabilities can significantly enhance your web infrastructure’s flexibility and efficiency. This guide will delve into complex rewriting techniques that prevent unwanted URL normalization, which can be crucial for API gateways handling diverse service endpoints.

Original Configuration
#

The initial Nginx configuration is set up to handle requests to both the root URL and the /api endpoint differently. Here’s how it looks:

server {
    listen 80;
    server_name test.com;

    location / {
        proxy_pass http://localhost:8080;
    }
    location /api {
        proxy_pass http://localhost:8088;
    }
}

Testing the Configuration
#

To test this setup, we use the following curl command:

curl -k -H 'Host: test.com' http://localhost:80/api/hey%2Fthere?param1=123

This command simulates a request that gets forwarded as GET /api/hey%2Fthere?param1=123. Now, let’s explore how to modify this behavior to prevent path normalization.

Problem with Path Normalization
#

The default behavior normalizes the URL path, changing it to GET /hey/there?param1=123, which might not be desirable in all scenarios, especially when exact routing paths are necessary for backend services.

Solution
#

To address this, we introduce modifications in the http section and specific location blocks:

Step 1: Define URI Mapping
#

First, we map the request URI to a variable that captures the path before the query string. Change the following in the Nginx http section:

map $request_uri $request_uri_path {
    "~^(?P<path>[^?]*)(\?.*)?$"  $path;
}

Step 2: Use Rewrite Rules
#

Next, we adjust the /api location block to utilize the new URI mapping with rewrite rules:

location /api {
    rewrite ^ $request_uri_path;
    rewrite ^/api/(.*) /$1 break;
    proxy_pass http://localhost:8088;
}

This configuration ensures that the path does not get normalized when forwarding to the backend service.

Explanation of Rewrite Rules
#

The first rewrite rule rewrites the incoming URI to strip the query string, isolating the path. The second rewrite rule removes the /api prefix before proxying, ensuring the backend service receives the correct path.

Conclusion
#

This tutorial covered advanced Nginx rewrite techniques useful for API gateway configurations. These methods ensure that URL paths and parameters are forwarded accurately and efficiently, maintaining the integrity of request routing within microservices architectures.

We encourage readers to experiment with these configurations and adapt them to their specific needs. For further questions or feedback, feel free to reach out in the comments section below.

References
#