Question

How to redirect domain.com to https://domain.com NGINX

Posted November 1, 2021 112 views
Nginx

Hello everyone,

I’ve been struggling in the last 2 weeks to make my domain accessible, but didn’t find a solution yet. I am running an Ubuntu VPS with installed Nginx, Varnish and Redis for Magento 2.

The website can be reached only if I hit - https://domain.com/ but if I try domain.com or http://domain.com it returns “Hmmm… can’t reach this page” I am using multidomain option as I have set up 2 different domains - domain.com and domain.eu

I am sharing you the configuration of my nginx at /etc/nginx/sites-enabled/mywebsite.com:

upstream fastcgi_backend {
  server unix:/run/php/php7.3-fpm.sock;
}

map $http_host $MAGE_RUN_CODE {
    default '';
    domain.eu viewinternational;
    domain.com en;
}

server {
# this is the main server conf for port 443
  server_name domain.com domain.eu;
  listen 443 ssl http2;
  client_max_body_size 20M;
  # OCSP stapling
  ssl_stapling on;
  ssl_stapling_verify on;

    set $cors_credentials '';
    set $cors_content_type '';
    set $cors_content_length '';

    if ($http_origin ~ '.+') {
        set $cors_credentials 'true';
    }

    if ($request_method = OPTIONS) {
        set $cors_content_type 'text/plain';
        set $cors_content_length '0';
    }

    # empty header will not be added
    add_header Access-Control-Allow-Origin $http_origin always;
    add_header Access-Control-Allow-Credentials $cors_credentials always;
    add_header Access-Control-Allow-Methods 
$http_access_control_request_method always;
    add_header Access-Control-Allow-Headers $http_access_control_request_headers always;
    add_header Content-Type $cors_content_type;
    add_header Content-Length $cors_content_length;

    if ($request_method = OPTIONS) {
        return 204;
   }

  # this is for Varnish with listers to 6081 by default you must make sure tha varnish looks for backend at port 8080. Check config at the end of the file
  location / {
     proxy_pass http://127.0.0.1:6081;
     proxy_set_header Host $http_host;
     proxy_set_header X-Forwarded-Host $http_host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header Ssl-Offloaded "1";
     proxy_set_header X-Forwarded-Proto https;
     proxy_set_header X-Forwarded-Port 443;
     proxy_http_version 1.1;
     proxy_buffer_size 128k;
     proxy_buffers 4 256k;
     proxy_busy_buffers_size 256k;
     fastcgi_buffer_size 32k;
     fastcgi_buffers 4 32k;
     proxy_connect_timeout 600;
     proxy_send_timeout 600;
     proxy_read_timeout 600;
     send_timeout 600;
  }

# this is with let's encrypt, here you can set your own paths for SSL certs
    ssl_certificate /etc/letsencrypt/live/domain.eu-0001/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/domain.eu-0001/privkey.pem; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
    #ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
# this makes nginx to server directly media files it's faster than to go through Varnish

  location /media/ {
    auth_basic off;
    proxy_pass http://127.0.0.1:6081;
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Host $http_host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Ssl-Offloaded "1";
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Forwarded-Port 443;
    proxy_http_version 1.1;
    proxy_buffer_size 128k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    fastcgi_buffer_size 32k;
    fastcgi_buffers 4 32k;
 }

}

# this is the main server conf for serving magento. This should be set as the varnish backend

server {
  server_name domain.com domain.eu;
  listen 127.0.0.1:8080;
  set $MAGE_ROOT /var/www/html;
  set $MAGE_MODE developer;
  set $MAGE_RUN_TYPE store;
  include /var/www/html/nginx.conf;
  client_max_body_size 20M;
}
edited by bobbyiliev

These answers are provided by our Community. If you find them useful, show some love by clicking the heart. If you run into issues leave a comment, or add your own answer to help others.

×
Submit an Answer
1 answer

Hello,

As far as I can see you only have a server block for port 443 (HTTPS) and there is no server block for port 80 (HTTP), this is why when you access your website over HTTP you get the site can not be reached message.

To fix that, you could add a server block in the beginning of the configuration file as follows:

server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

All that this would do is to listen on port 80 and redirect the traffic to port 443.

Hope that this helps.
Best,
Bobby