У меня есть следующий блок сервера:
server {
listen 80;
# ...
location / {
try_files $uri $uri/ /index.php?$query_string;
# I've tried adding "$uri.php" like so, but it downloads the php file instead.
# try_files $uri $uri/ $uri.php /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Если такой запрос приходит в http: // example. com / random / page
, мне нужно, чтобы Nginx переписал его на http://example.com/random/page.php
без изменения URL-адреса пользователя. Ему также необходимо передать этот запрос в другой блок местоположения. Если этот файл php не существует, он должен вернуть 404. Как я могу этого добиться?
Одна из многих возможностей:
server {
listen 80;
...
location / {
try_files $uri $uri/ @rewrite;
}
location @rewrite {
rewrite ^ $uri.php last;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php/php7.1-fpm.sock;
include fastcgi_params;
}
}
Вы все равно должны проверить существование файла в блоке location ~ \ .php $
, как указано в этой заметке по применению .