1

I am having troubles with the routes of laravel on a nginx Server. It shows a "404 not found" for all the routes, except for the default one, very similar to this problem: https://stackoverflow.com/questions/21091405/nginx-configuration-for-laravel-4

The solution to that problem:

server {

    listen  80;
    server_name sub.domain.com;
    set $root_path '/srv/www/htdocs/application_name/public';
    root $root_path;

    index index.php index.html index.htm;

    try_files $uri $uri/ @rewrite;

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

    location ~ \.php {

        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index /index.php;

        include /etc/nginx/fastcgi_params;

        fastcgi_split_path_info       ^(.+\.php)(/.+)$;
        fastcgi_param PATH_INFO       $fastcgi_path_info;
        fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~* ^/(css|img|js|flv|swf|download)/(.+)$ {
        root $root_path;
    }

    location ~ /\.ht {
        deny all;
    }

} 

it works well, the only problem is that i need the root_path to be /srv/www/htdocs because I have other projects running there to. Whenever i change the line:

set $root_path '/srv/www/htdocs/application_name/public';

to:

 set $root_path '/srv/www/htdocs';

the problem starts on url's like: localhost/application_name/public/users

tenhsor
  • 113
  • 4

1 Answers1

1

You need to change the @rewrite block to separate the application name and URL inside the application.

Try this:

location @rewrite {
    rewrite ^/(?<appname>[^/]+)/public/(?<appurl>.+)$ /$appname/public/index.php?_url=/$appurl last;
}

So, here we capture the first part of the request URI to $appname variable, and then the URL inside the application to $appurl variable. Then we use these two variables to rewrite the access to the real URL on the filesystem.

BTW. You don't need set $root_path line at all, you can use root /srv/www/htdocs directly. You can also remove location ~* ^/(css|img|js|flv|swf|download)/(.+)$ block completely too, because there is no point re-setting root directive inside it.

Tero Kilkanen
  • 34,499
  • 3
  • 38
  • 58