Bird
Raised Fist0
Nginxdevops~10 mins

Request/response transformation in Nginx - Step-by-Step Execution

Choose your learning style10 modes available
Process Flow - Request/response transformation
Client sends request
↓
Nginx receives request
↓
Apply request transformations
↓
Forward transformed request to backend
↓
Backend sends response
↓
Apply response transformations
↓
Send transformed response to client
Nginx intercepts client requests and backend responses, modifies them as configured, then forwards them along.
Execution Sample
Nginx
server {
  listen 8080;
  location / {
    proxy_set_header X-Original-URI $request_uri;
    proxy_pass http://backend;
    sub_filter 'Hello' 'Hi';
    sub_filter_once off;
  }
}
This config adds a header to the request and replaces 'Hello' with 'Hi' in the response body.
Process Table
StepActionInputTransformationOutput
1Receive client requestGET /hello HTTP/1.1None yetRequest: GET /hello HTTP/1.1
2Apply request transformationRequest headersAdd header X-Original-URI: /helloRequest headers with X-Original-URI
3Forward request to backendTransformed requestNoneBackend receives GET /hello with extra header
4Backend sends responseResponse body: 'Hello World!'NoneResponse body: 'Hello World!'
5Apply response transformationResponse bodyReplace 'Hello' with 'Hi'Response body: 'Hi World!'
6Send response to clientTransformed responseNoneClient receives 'Hi World!'
7EndN/AN/ARequest/response cycle complete
💡 Request and response transformations applied; cycle ends after sending response to client.
Status Tracker
VariableStartAfter Step 2After Step 5Final
request_uri/hello/hello/hello/hello
request_headersNo X-Original-URIIncludes X-Original-URI: /helloIncludes X-Original-URI: /helloIncludes X-Original-URI: /hello
response_bodyHello World!Hello World!Hi World!Hi World!
Key Moments - 2 Insights
Why does the request header X-Original-URI appear only after step 2?
Because the header is added during the request transformation step (step 2), before forwarding to backend (step 3). Before that, the request has no such header.
Why is the response body changed from 'Hello World!' to 'Hi World!' at step 5?
Because the response transformation uses sub_filter to replace 'Hello' with 'Hi' in the response body before sending it to the client.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table at step 2. What change happens to the request?
AA new header X-Original-URI is added
BThe request method changes from GET to POST
CThe request URI changes from /hello to /hi
DThe request body is modified
💡 Hint
Check the 'Transformation' column at step 2 in the execution table.
At which step does the response body get modified?
AStep 3
BStep 5
CStep 4
DStep 6
💡 Hint
Look for the step where 'Replace Hello with Hi' happens in the transformation column.
If sub_filter_once was set to 'on' instead of 'off', how would the response transformation change?
AAll occurrences of 'Hello' would be replaced
BNo replacements would happen
COnly the first occurrence of 'Hello' would be replaced
DThe request header would be removed
💡 Hint
Refer to the sub_filter_once directive behavior in the execution_sample code.
Concept Snapshot
Nginx request/response transformation:
- Modify requests with directives like proxy_set_header
- Modify responses with sub_filter
- Transformations happen between client and backend
- Use sub_filter_once off to replace all matches
- Useful for header injection and content rewriting
Full Transcript
This visual execution shows how Nginx handles request and response transformations. First, the client sends a request. Nginx adds a header X-Original-URI to the request before forwarding it to the backend. The backend responds with 'Hello World!'. Nginx then replaces 'Hello' with 'Hi' in the response body before sending it back to the client. Variables like request_uri remain unchanged, headers get added, and response body content is modified. Key moments include when headers are added and when response text is replaced. The quiz tests understanding of these steps and configuration effects.

Practice

(1/5)
1. What is the main purpose of request/response transformation in nginx?
easy
A. To block all incoming requests
B. To increase the server's hardware capacity
C. To change the server's IP address automatically
D. To modify data passing through nginx for better communication

Solution

  1. Step 1: Understand request/response transformation

    This process changes data in requests or responses to improve how clients and servers communicate.
  2. Step 2: Identify the main goal in nginx context

    nginx uses this to modify headers, URLs, or content to suit needs, not hardware or blocking.
  3. Final Answer:

    To modify data passing through nginx for better communication -> Option D
  4. Quick Check:

    Transformation means changing data flow [OK]
Hint: Transformation means changing data in requests or responses [OK]
Common Mistakes:
  • Confusing transformation with hardware upgrades
  • Thinking it blocks requests instead of modifying them
  • Assuming it changes server IP automatically
2. Which nginx directive is used to modify request headers before passing to the backend?
easy
A. add_header
B. proxy_set_header
C. rewrite
D. gzip_disable

Solution

  1. Step 1: Identify directives for header modification

    proxy_set_header changes headers sent to the backend server.
  2. Step 2: Differentiate from other directives

    add_header adds headers to responses, rewrite changes URLs, gzip_disable disables compression.
  3. Final Answer:

    proxy_set_header -> Option B
  4. Quick Check:

    Request header modification = proxy_set_header [OK]
Hint: Use proxy_set_header to change request headers [OK]
Common Mistakes:
  • Using add_header which affects response headers
  • Confusing rewrite with header modification
  • Trying gzip_disable for headers
3. Given this nginx config snippet, what will be the response header X-Transformed value?
location / {
  proxy_pass http://backend;
  proxy_set_header X-Original $http_x_original;
  add_header X-Transformed "Yes";
}
medium
A. Yes
B. $http_x_original
C. No
D. X-Original

Solution

  1. Step 1: Understand add_header directive effect

    add_header adds or modifies response headers sent to the client; here it sets X-Transformed to "Yes".
  2. Step 2: Differentiate proxy_set_header role

    proxy_set_header modifies request headers sent to backend, not response headers.
  3. Final Answer:

    Yes -> Option A
  4. Quick Check:

    add_header sets response header = Yes [OK]
Hint: add_header controls response headers, proxy_set_header controls request headers [OK]
Common Mistakes:
  • Confusing request and response headers
  • Expecting variable names as header values
  • Ignoring add_header effect
4. You want to modify the response body in nginx but changes don't appear. What is the likely cause?
medium
A. gzip compression is enabled, preventing body modification
B. proxy_pass directive is missing
C. add_header directive is used incorrectly
D. server block is missing listen directive

Solution

  1. Step 1: Understand response body modification requirements

    Modifying response body requires disabling gzip compression because compressed data can't be changed easily.
  2. Step 2: Identify common misconfigurations

    If gzip is enabled, changes won't show; proxy_pass or listen missing causes other errors, add_header affects headers only.
  3. Final Answer:

    gzip compression is enabled, preventing body modification -> Option A
  4. Quick Check:

    Disable gzip to modify response body [OK]
Hint: Disable gzip to allow response body changes [OK]
Common Mistakes:
  • Ignoring gzip compression effect
  • Confusing header directives with body changes
  • Assuming missing proxy_pass causes this issue
5. You want to rewrite incoming URLs from /old-path/ to /new-path/ and add a response header X-Updated: true. Which nginx config snippet correctly does both?
hard
A. location /old-path/ { rewrite ^/old-path/(.*)$ /new-path/$1 permanent; add_header X-Updated true; proxy_pass http://backend; }
B. location /old-path/ { proxy_pass http://backend; add_header X-Updated true; rewrite ^/old-path/(.*)$ /new-path/$1 break; }
C. location /old-path/ { rewrite ^/old-path/(.*)$ /new-path/$1 break; add_header X-Updated true; proxy_pass http://backend; }
D. location /new-path/ { rewrite ^/old-path/(.*)$ /new-path/$1 break; add_header X-Updated true; proxy_pass http://backend; }

Solution

  1. Step 1: Choose correct location and rewrite usage

    Rewrite must be inside location matching /old-path/ to rewrite URLs internally with 'break' to stop processing.
  2. Step 2: Add response header and proxy_pass correctly

    add_header adds header to response; proxy_pass forwards request to backend after rewrite.
  3. Step 3: Identify incorrect options

    The config
    location /old-path/ {
      proxy_pass http://backend;
      add_header X-Updated true;
      rewrite ^/old-path/(.*)$ /new-path/$1 break;
    }
    places rewrite after proxy_pass (ignored). Configs using location /new-path/ have the wrong location. Configs with permanent cause redirects, not internal rewrites.
  4. Final Answer:

    location /old-path/ { rewrite ^/old-path/(.*)$ /new-path/$1 break; add_header X-Updated true; proxy_pass http://backend; } -> Option C
  5. Quick Check:

    Internal rewrite + header + proxy_pass = location /old-path/ { rewrite ^/old-path/(.*)$ /new-path/$1 break; add_header X-Updated true; proxy_pass http://backend; } [OK]
Hint: Use rewrite with break inside correct location before proxy_pass [OK]
Common Mistakes:
  • Using permanent instead of break for internal rewrite
  • Placing rewrite after proxy_pass
  • Using wrong location block for rewrite
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard