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

up vote 1 down vote accepted

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.

Your Answer

 

By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Not the answer you're looking for? Browse other questions tagged or ask your own question.