I'm switching from Apache to Nginx/fcgi and I'm having a small issue while attempting to setup the applications rewrite rules.
The code handles routes via the use of PATH_INFO, e.g., example.com/foo/bar/ will be routed to example.com/index.php/foo/bar/
I've modified the server configuration to pass PATH_INFO:
location ~ \.php$ { include /etc/nginx/fastcgi_params; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(.*)$; fastcgi_param SCRIPT_FILENAME /var/www/public$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; } And the rewrite handler:
location / { root /var/www/public; index index.html index.htm index.php; if (!-f $request_filename) { rewrite ^(.*)/(.*)$ /index.php/$2 break; } } With 'rewrite_log on', the url's appear to be routing properly:
[error]: *2 open() "/var/www/public/index.php/test" failed (20: Not a directory), client: 192.168.0.254, server: example.com, request: "GET /test HTTP/1.1", host: "example.com", referrer: "http://example.com/index.php" However, it appears to be looking for the directory "test". How can I force it to request index.php, passing '/test' to the script?
location ~ \.php(?:/|$) { ... }rather thanlocation ~ \.php$ { ... }since/index.php/testrequest URI (or any other URI containing the path info part) won't match the\.php$regex. Having any pathinfo-related stuff inside thelocation ~ \.php$ { ... }location makes no sense. Instead ofif (!-f ...you'd better usetry_files $uri $uri/ /index.php$uriachieving the same behavior. For the security consideration see this answer.