Bird
Raised Fist0
Nginxdevops~10 mins

HSTS header in Nginx - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to add the HSTS header in nginx configuration.

Nginx
add_header Strict-Transport-Security "[1]";
Drag options to blanks, or click blank then click option'
Amax-age=31536000
Bmax-age=0
Cmax-age=100
Dmax-age=abc
Attempts:
3 left
💡 Hint
Common Mistakes
Using max-age=0 disables HSTS.
Using non-numeric values causes errors.
2fill in blank
medium

Complete the code to include subdomains in the HSTS policy.

Nginx
add_header Strict-Transport-Security "max-age=31536000; [1]";
Drag options to blanks, or click blank then click option'
Ainclude-subdomains
BincludeSubdomain
CincludeSubDomains
Dinclude_subdomains
Attempts:
3 left
💡 Hint
Common Mistakes
Misspelling the directive or using wrong case.
Using underscores or hyphens instead of camelCase.
3fill in blank
hard

Fix the error in the HSTS header to enable preload.

Nginx
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; [1]";
Drag options to blanks, or click blank then click option'
Apreload
Bpre-load
Cpre_load
Dpreload=true
Attempts:
3 left
💡 Hint
Common Mistakes
Adding '=' or other symbols after preload.
Using hyphens or underscores in the directive.
4fill in blank
hard

Fill both blanks to set HSTS with max age and include subdomains.

Nginx
add_header Strict-Transport-Security "[1]; [2]";
Drag options to blanks, or click blank then click option'
Amax-age=63072000
BincludeSubDomains
Cmax-age=31536000
DincludeSubdomain
Attempts:
3 left
💡 Hint
Common Mistakes
Using incorrect max-age values.
Misspelling includeSubDomains.
5fill in blank
hard

Fill all three blanks to set HSTS with max age, include subdomains, and preload.

Nginx
add_header Strict-Transport-Security "[1]; [2]; [3]";
Drag options to blanks, or click blank then click option'
Amax-age=15768000
BincludeSubDomains
Cpreload
Dmax-age=31536000
Attempts:
3 left
💡 Hint
Common Mistakes
Using too short max-age values.
Misspelling preload or includeSubDomains.

Practice

(1/5)
1. What is the main purpose of the Strict-Transport-Security (HSTS) header in nginx?
easy
A. To force browsers to use HTTPS instead of HTTP for the site
B. To redirect HTTP requests to a different domain
C. To enable caching of static files in the browser
D. To compress responses sent to the client

Solution

  1. Step 1: Understand HSTS header purpose

    The HSTS header tells browsers to only use HTTPS for the site, improving security.
  2. Step 2: Compare options with HSTS function

    Only To force browsers to use HTTPS instead of HTTP for the site matches this purpose; others describe unrelated features.
  3. Final Answer:

    To force browsers to use HTTPS instead of HTTP for the site -> Option A
  4. Quick Check:

    HSTS = Force HTTPS [OK]
Hint: HSTS means browsers must use HTTPS always [OK]
Common Mistakes:
  • Confusing HSTS with redirects
  • Thinking HSTS controls caching
  • Assuming HSTS compresses data
2. Which of the following is the correct nginx syntax to add an HSTS header that lasts for 1 year and applies to all subdomains?
easy
A. add_header Strict-Transport-Security max-age=31536000 includeSubDomains always;
B. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
C. add_header Strict-Transport-Security "max-age=31536000 includeSubDomains";
D. add_header Strict-Transport-Security max-age=31536000; includeSubDomains always;

Solution

  1. Step 1: Check correct syntax for add_header

    The header value must be a quoted string with directives separated by semicolons, and 'always;' ensures it is added on all responses.
  2. Step 2: Validate option formatting

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; correctly quotes the value and uses semicolon between directives with 'always;'. Others miss quotes or semicolons or misplace 'always'.
  3. Final Answer:

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; -> Option B
  4. Quick Check:

    Quotes + semicolon + always = add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; [OK]
Hint: Use quotes and semicolons inside add_header value [OK]
Common Mistakes:
  • Missing quotes around header value
  • Forgetting semicolon between directives
  • Placing 'always' inside quotes
3. Given this nginx config snippet:
add_header Strict-Transport-Security "max-age=86400; includeSubDomains" always;

What is the effect on browsers visiting the site?
medium
A. Browsers will enforce HTTPS for 1 day on the site and all subdomains
B. Browsers will enforce HTTPS for 1 year on the site only
C. Browsers will ignore the header because max-age is too low
D. Browsers will enforce HTTPS for 1 day on the site only

Solution

  1. Step 1: Interpret max-age and includeSubDomains

    max-age=86400 means 86400 seconds = 1 day. includeSubDomains applies to all subdomains.
  2. Step 2: Understand browser behavior

    Browsers will enforce HTTPS for 1 day on the site and all its subdomains as per header.
  3. Final Answer:

    Browsers will enforce HTTPS for 1 day on the site and all subdomains -> Option A
  4. Quick Check:

    86400 seconds = 1 day + includeSubDomains = Browsers will enforce HTTPS for 1 day on the site and all subdomains [OK]
Hint: max-age in seconds; 86400 = 1 day [OK]
Common Mistakes:
  • Confusing seconds with days
  • Ignoring includeSubDomains effect
  • Assuming max-age too low disables HSTS
4. You added this line in nginx:
add_header Strict-Transport-Security max-age=31536000 includeSubDomains always;

Why is the HSTS header not sent to clients?
medium
A. includeSubDomains is not a valid directive
B. The 'always' directive must be inside the quotes
C. max-age value is too large and rejected by nginx
D. The header value is missing quotes, causing syntax error

Solution

  1. Step 1: Check syntax for add_header directive

    The header value must be enclosed in quotes. Missing quotes cause nginx to ignore the header.
  2. Step 2: Validate other parts

    'always' must be outside quotes, max-age=31536000 is valid, includeSubDomains is valid directive.
  3. Final Answer:

    The header value is missing quotes, causing syntax error -> Option D
  4. Quick Check:

    Quotes missing = header not sent [OK]
Hint: Always quote header values in add_header [OK]
Common Mistakes:
  • Placing 'always' inside quotes
  • Not quoting header value
  • Misunderstanding valid directives
5. You want to preload your site in browsers' HSTS preload list. Which nginx header configuration is correct to achieve this for 6 months including subdomains?
hard
A. add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
B. add_header Strict-Transport-Security "max-age=15768000; preload" always;
C. add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always;
D. add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

Solution

  1. Step 1: Calculate max-age for 6 months

    6 months ≈ 15768000 seconds (6 * 30 * 24 * 3600).
  2. Step 2: Include required directives for preload

    Preload requires max-age, includeSubDomains, and preload directive all present.
  3. Step 3: Verify syntax correctness

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; correctly quotes the value, uses semicolons, includes all directives, and uses 'always;'.
  4. Final Answer:

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; -> Option C
  5. Quick Check:

    Preload + includeSubDomains + 6 months = add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload" always; [OK]
Hint: Preload needs max-age, includeSubDomains, preload keywords [OK]
Common Mistakes:
  • Using wrong max-age for 6 months
  • Omitting preload directive
  • Not quoting header value
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