Route non-existant .php requests through try_files?

Hi everyone,
I’m investigating moving one of my sites from another web server to
Nginx. The app is a PHP app that uses the “front controller” pattern
(everything routes via index.php), and the app takes care of URL routing
and handling 404 errors.

My nginx site configuration looks something like this:

server {
listen 8080;
server_name example.com;
root /var/www/example/live/public/;
index index.htm index.php;

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

location /assets/cache/ {
expires max;
}

location ~ .php$ {
include fastcgi_params;
fastcgi_pass php;
fastcgi_param FUEL_ENV production;
}
}

upstream php {
server unix:/var/run/php5-fpm/www.sock;
}

This works mostly as expected - Going to the root of the site hits the
app’s homepage, and the sub pages work (so example.com/about loads
file). However if I go to a non-existent PHP file (like
example.com/about.php), I get a white page that says “File not found.”
There’s some legacy links that have “.php” at the end and routing these
to the correct location is handled in the app itself. Because of my
try_files setting, I expected this to go through index.php, like the
URLs without extensions. However this doesn’t seem to be the case.
Anyone know how to configure it so it works this way?

tl;dr: How do I get requests to non-existent .php files to route via my
index.php file?

Posted at Nginx Forum:
http://forum.nginx.org/read.php?2,227550,227550#msg-227550

On Thu, Jun 14, 2012 at 11:24:12PM -0400, Daniel15 wrote:

Hi there,

location / {

location /assets/cache/ {

location ~ .php$ {

However if I go to a non-existent PHP file (like
example.com/about.php), I get a white page that says “File not found.”
There’s some legacy links that have “.php” at the end and routing these
to the correct location is handled in the app itself. Because of my
try_files setting, I expected this to go through index.php,

No.

One request is handled by one location. The request for /about.php
will be handled by the “php” regex location, which doesn’t (currently)
include try_files.

http://nginx.org/r/location

Untested, but probably either:

copy the try_files line into the “php” regex location; or

move the “php” regex location to be within the “location /” block

should do what you want in most cases.

(“most” because: what do you want to happen when the request is for
“/assets/cache/absent.php”, or for “/assets/cache/present.php”? The two
options above will do different things.)

Good luck with it,

f

Francis D. [email protected]

Thanks for your reply. Adding the try_files setting into the PHP
location block made it behave as expected

Thanks! :slight_smile:

Francis D. Wrote:

No.

“/assets/cache/absent.php”, or for
nginx mailing list
[email protected]
http://mailman.nginx.org/mailman/listinfo/nginx

Posted at Nginx Forum:
http://forum.nginx.org/read.php?2,227550,227587#msg-227587