robobobobo
robobobobo

Reputation: 759

Nginx redirect to non-www not working for laravel application

I have my Laravel app configured on Ubuntu 16.04.6 x64 with nginx and I keep getting a 404 page when I try to load the site with the “www” prefix

It all works perfect at https://example.com, but https://www.example.com will cause a 404 error

I have A records setup for both the www.example.com and example.com pointing to the same IP address

Ideally I would like to redirect all https://www.example.com traffic to https://example.com

The nginx conf file is below, would appreciate some help debugging

I’ve tried adding a 301 redirect at the start and end of the file but it doesn’t seem to work

Interestingly I can access static files fine at www, it’s any of the laravel paths that seem to trigger a 404

server {

    root /var/www/example.com/web/public;

    error_log /var/www/example.com/errors.log;
    access_log /var/log/nginx/example.comaccess_log.log; 

    index index.php index.html;
    server_name example.com www.example.com;
    client_max_body_size 80m;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }



    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/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


}

server {
    if ($host = www.example.com) {
        return 301 https://example.com$request_uri;
    } # managed by Certbot


    if ($host = example.co) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    server_name example.com www.example.com;
    listen 80;
    return 404; # managed by Certbot

}
server {
        server_name www.example.com;
        return 301 $scheme://example.com$request_uri;
}

Upvotes: 0

Views: 1921

Answers (1)

Alex Barker
Alex Barker

Reputation: 4400

Something to this effect should do it. If you go to http://www.example.com, you should be redirected to https://www.example.com, which intern redirects to https://example.com.

server {
    root /var/www/example.com/web/public;

    error_log /var/www/example.com/errors.log;
    access_log /var/log/nginx/example.comaccess_log.log; 

    index index.php index.html;
    server_name example.com;
    client_max_body_size 80m;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
        expires 365d;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    }

    location ~ /\.ht {
        deny all;
    }

    listen 443 ssl; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/example.com/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
}
server {
    # Force all HTTP traffic to SSL
    listen 80;
    return 301 https://$host$request_uri;
}
server {
    # Redirect www.example.com to example.com
    listen 443 ssl;

    # This needs to be the cert for www.example.com or *.example.com
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    # Remember, if nginx doesnt find the server_name, it uses the first vhost.
    server_name www.example.com;
    return 301 https://example.com$request_uri;
}

Upvotes: 1

Related Questions