user3265927
user3265927

Reputation: 445

Laravel routes not found after nginx install

After I changed ICG to nginx all routes except index page does not work.

Laravel Config:

#/etc/nginx/sites-enabled/laravel
server {
    listen 80;

    root /var/www/home;
    index index.php;

    server_name 192.168.178.71;

    access_log /var/www/home/storage/app/logs/laravel-nginx-access.log;
    error_log  /var/www/home/storage/app/logs/laravel-nginx-error.log error;


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

    location = /favicon.ico { log_not_found off; access_log off; }
    location = /robots.txt  { log_not_found off; access_log off; }


    # ERROR
    error_page 404 /index.php;


    # DENY HTACCESS
    location ~ /\.ht {
        deny all;
    }
}

Default config:

# /etc/nginx/sites-enabled/default
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm;

        server_name 192.168.178.71 localhost;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ index.php?$query_string;

        autoindex on;

         # Remove trailing slash to please routing system.
          if (!-d $request_filename) {
            rewrite     ^/(.+)/$ /$1 permanent;
        }


        }

            location ~ \.php$ {
        #try_files $uri /index.php =404;
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME document_root$fastcgi_script_name;

        }

        location ~ /\.ht {
                deny all;
        }
}

my nginx config

#/etc/nginx/nginx.conf
user www-data;
worker_processes 4;
pid /run/nginx.pid;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
         disable_symlinks off;
        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;
       ##
        # Gzip Settings
        ##

        gzip on;
        gzip_disable "msie6";



        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

What I tried:

/var/www/home# (home folder is laravel folder)
sudo chown -R www-data:www-data *


/var/www/home# 
sudo chown -R root:root *

also I tried to change

 try_files $uri $uri/ /index.php?$query_string;
 try_files $uri $uri/ /index.php$is_args$args;
 try_files $uri $uri/ /index.php;


php artisan cache:clear  

Mostly questions in google i have read, but nothing helps me.

My phpinfo - link

Upvotes: 39

Views: 79668

Answers (9)

Marc Garcia
Marc Garcia

Reputation: 1458

This is the correct basic config for Laravel and Nginx:

server {
    listen 443 ssl default_server;

    root /var/www/laravel/public/;
    index index.php;
    ssl_certificate /path/to/cert;
    ssl_certificate_key /path/to/key;

    location / {
         try_files $uri $uri/ /index.php$is_args$args;
    }

    # pass the PHP scripts to FastCGI server listening on /var/run/php-fpm.sock
    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_split_path_info ^(.+?\.php)(/.+)$;
        include fastcgi_params;
    }
}

Upvotes: 80

Vijay Rana
Vijay Rana

Reputation: 1079

Instead of

location / {
    try_files $uri $uri/ =404;
}

Below worked for me.

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

It specifies that any request that matches the location / should be passed on to the try_files directive. The try_files directive attempts to serve the requested file, and if it doesn't exist, it passes the request to the next fallback in the argument list.

In this case, the first fallback is $uri, which attempts to serve the requested URI as a file, and the second fallback is $uri/, which attempts to serve the requested URI as a directory. If neither of these files or directories exists, the request is finally passed to /index.php, with any query string attached.

Upvotes: 3

Carlos
Carlos

Reputation: 706

Try it, work for me.

sudo nano /etc/nginx/sites-enabled/default

and then sudo systemctl reload nginx

    server {
    listen 80;
    server_name _ midominioexample.com www.midominioexample.com;
    root /var/www/html/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

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

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.(?!well-known).* {
        deny all;
    }
}

Upvotes: 2

AlexioVay
AlexioVay

Reputation: 4527

As of 03/2022 and the current version of Laragon (5.0.0) I spent a lot of time to figure out why I can't open any link except index.php that I have configured in web.php for the route:list.

Because I just wanted to turn off SSL and turn it back on. It seems this causes to reset all your config files.

It seems that Laragon by default adds those lines:

# Access Restrictions
allow       127.0.0.1;
deny        all;

I have put a # in front of deny to uncomment it and it worked again, like this:

# Access Restrictions
allow        127.0.0.1;
#deny        all;

Upvotes: -1

Neomax94
Neomax94

Reputation: 1

I found that this solved my problem with Laravel routing. I nested the location ~ .php$ inside location /.

Example:

server{
    listen 9000;

    server_name _;

    root /var/www/myapp/public;

    index index.php index.html;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;

        location ~ \.php$ {

            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;

        }
    }
}

Upvotes: 0

Vasu Naik
Vasu Naik

Reputation: 191

I was also getting the same error of Routes not working on Nginx on my Ubuntu 16.04

To solve Routes problem, i tried the following code and its just working fine for me.

Open project conf file using following command

sudo nano /etc/nginx/sites-available/projectname 

Then do the following changes in this file

server {
        listen 80;
        listen [::]:80;

       root /var/www/project_name/public;

       server_name server_name;

location / {
  
             try_files $uri $uri/ /index.php$is_args$args;
         }

}

Important thing is to change the try_files in location block.

location / {
      
                 try_files $uri $uri/ /index.php$is_args$args;
             }

Upvotes: 0

imrealashu
imrealashu

Reputation: 5099

I had the same issue, but updating the default configuration made it work.

location @rewrite {
        rewrite ^/(.*)$ /index.php?_url=/$1;
    }
    location / {
            try_files $uri $uri/ @rewrite;
    }  

Let me know if this worked for you or not.
sudo service nginx restart after changing the configuration.

Upvotes: 5

When I sent parameters by get I did not recognize them, I just have to activate the following: try_files $uri $uri/ /index.php$is_args$args;

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

Upvotes: 18

Devendra Singh
Devendra Singh

Reputation: 398

I had same problem after updating few lines nginx working fine..

It's for windows ( change root acording your file system )

1.root html/laravel; #Update Here - add project folder name after html

2.try_files $uri $uri/ /index.php$is_args$args; #Update Here - Add this for 404 not found error

server {
    listen 80; # IPv4
    server_name localhost;

    ## Parametrization using hostname of access and log filenames.
    access_log logs/localhost_access.log;
    error_log logs/localhost_error.log;

    ## Root and index files.
    root html/laravel; #Update Here - add project folder name after html
    index  index.php index.html index.htm;

    ## If no favicon exists return a 204 (no content error).
    location = /favicon.ico {
        try_files $uri =204;
        log_not_found off;
        access_log off;
    }

    ## Don't log robots.txt requests.
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }
    ## Try the requested URI as files before handling it to PHP.
    location / {
try_files $uri $uri/ /index.php$is_args$args; #Update Here - Add this for 404 not found error
        ## Regular PHP processing.
        location ~ \.php$ {
            try_files  $uri =404;
            fastcgi_pass   php_processes;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
            include        fastcgi_params;
        }

        ## Static files
        location ~* \.(?:css|gif|htc|ico|js|jpe?g|png|swf)$ {
            expires max;
            log_not_found off;
            ## No need to bleed constant updates. Send the all shebang in one
            ## fell swoop.
            tcp_nodelay off;
            ## Set the OS file cache.
            open_file_cache max=1000 inactive=120s;
            open_file_cache_valid 45s;
            open_file_cache_min_uses 2;
            open_file_cache_errors off;
        }

        ## Keep a tab on the 'big' static files.
        location ~* ^.+\.(?:ogg|pdf|pptx?)$ {
            expires 30d;
            ## No need to bleed constant updates. Send the all shebang in one
            ## fell swoop.
            tcp_nodelay off;
        }
        } # / location

} 

Upvotes: 5

Related Questions