NGINX try_files не переходит к PHP

У меня очень простой сайт PHP:

. 
├── about.php 
├── index.php 
├── project 
│   ├── project_one.php 
│   └── project_two.php 
└── projects.php

И следующая конфигурация nginx (показаны только соответствующие части):

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;
}

Нажатие / работает так, как ожидалось. Нажатие любого из URL http://my.site.com/{projects | about | project/*} должно использовать try_files для доступа к файлу $uri.php и передать его на PHP. Но вместо этого браузер просто загружает сам файл PHP.

Я могу заставить его работать, добавив отдельные директивы местоположения для указанных выше местоположений, например:

location /projects {
 try_files $uri $uri/ /$uri.php;
}
location /about {
 try_files $uri $uri/ /$uri.php;
}
location /project {
 try_files $uri $uri/ $uri.php;
}

Но это явно не способ сделать это.

Что я делаю неправильно?

2 ответа

Документация Per nginx для try_files

Проверяет наличие файлов в указанном порядке и использует первый найденный файл для обработки запроса; обработка выполняется в текущем контексте

поэтому nginx найдет PHP файл и обработает его в контексте location /, поэтому просто служит ему как статический файл. Только последний параметр отличается, он не проверяется, но nginx делает внутреннее перенаправление (если он uri) или возвращает код ошибки (если он =code). Поэтому вам нужно удалить =404 из try_files, чтобы иметь внутреннюю переадресацию. И добавьте try_files в location ~ \.php, чтобы убедиться, что файл существует.

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;
}


Попробуйте следующее:

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 
}

licensed under cc by-sa 3.0 with attribution.