How To Configure Nginx For Both HTTP And HTTPS?

Published July 26, 2024

Problem: Configuring Nginx for HTTP and HTTPS

Setting up Nginx to handle HTTP and HTTPS traffic can be challenging. You need to configure the server to listen on different ports and manage SSL/TLS certificates, while also setting up correct redirection between protocols.

Solution: Modifying Nginx Server Block for Dual Protocol Support

Adjusting the Nginx Configuration File

To enable Nginx to handle HTTP and HTTPS traffic, you need to change your server block configuration. The main changes involve:

  • Removing the 'ssl on' directive: This directive forces SSL for all connections, which can cause problems with HTTP requests.
  • Setting up separate listen directives for HTTP and HTTPS: This allows the server to accept connections on ports 80 (HTTP) and 443 (HTTPS).

Example of a Corrected Server Block

Here's an example of a server block that supports HTTP and HTTPS:

server {
    listen 80;
    listen 443 ssl;
    server_name example.com;

    ssl_certificate /path/to/your/ssl_certificate.crt;
    ssl_certificate_key /path/to/your/ssl_certificate.key;

    # Other SSL settings...

    root /var/www/your_website;
    index index.html;

    # Other server configurations...
}

In this configuration:

  • The 'ssl on' directive is removed.
  • Two 'listen' directives are used: one for port 80 (HTTP) and one for port 443 (HTTPS).
  • The 'ssl' parameter is added to the listen 443 directive, enabling SSL only for HTTPS connections.
  • SSL certificate paths are specified using the ssl_certificate and ssl_certificate_key directives.

These changes allow the server to handle HTTP and HTTPS requests correctly, fixing the 400 error for HTTP requests.

Tip: Test Your Configuration

After making changes to your Nginx configuration, always test it before restarting the server. Use the command nginx -t to check for syntax errors and potential issues. This helps prevent configuration mistakes that could lead to server downtime.