Reputation: 334
I have a very simple PHP site:
.
├── about.php
├── index.php
├── project
│ ├── project_one.php
│ └── project_two.php
└── projects.php
And the following nginx config (only relevant parts shown):
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/path/to/php.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_intercept_errors on;
}
location / {
index index.php;
try_files $uri $uri/ $uri.php =404;
}
Hitting the /
works as expected. Hitting any of the http://my.site.com/{projects | about | project/*}
URLs should use try_files to hit the $uri.php
file, and pass it to PHP. But instead, the browser just downloads the PHP file itself.
I can get it to work by adding individual location directives for the above locations, like so:
location /projects {
try_files $uri $uri/ /$uri.php;
}
location /about {
try_files $uri $uri/ /$uri.php;
}
location /project {
try_files $uri $uri/ $uri.php;
}
But this is clearly not the way to do this.
What am I doing wrong???
Upvotes: 10
Views: 29207
Reputation: 14354
Per nginx documentation for try_files
Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context
so nginx find PHP file and process it in context of location /
therefor just serve it as static file. Only last parameter is different, it's not checked but nginx make internal redirect (if it's uri) or return error code (if it's =code
). So you need to remove =404
from try_files to have internal redirect. And add try_files
to location ~ \.php
to make sure that file exists.
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/path/to/php.sock;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_intercept_errors on;
}
location / {
index index.php;
try_files $uri $uri/ $uri.php;
}
Upvotes: 19
Reputation: 6694
Try this:
location / {
try_files $uri $uri/ /index.php;
index index.php;
## output: http://my.site.com/about
rewrite ^/about$ /about.php last;
## output: http://my.site.com/projects
rewrite ^/projects$ /projects.php last;
## output: http://my.site.com/projectOne
rewrite ^/projectOne$ /project/project_one.php last;
## output: http://my.site.com/projectTwo
rewrite ^/projectTwo$ /project/project_two.php last;
}
UPDATE:
location / {
try_files $uri $uri/ /index.php;
index index.php;
rewrite ^(.*)$ /$1.php; # WITHOUT PHP EXTENSION
}
Upvotes: 1