Я заинтересован в переходе с Apache / mod_php на Nginx для некоторых сайтов, не использующих CMS, которые я использую. Рассматриваемые сайты представляют собой либо полностью статические файлы HTML, либо простой PHP, но их объединяет то, что в настоящее время я использую Apache mod_negotiation для их обслуживания без расширений файлов. Меня не интересуют фактические переговоры по содержанию; Я использую это только для того, чтобы не использовать расширения файлов в своих URL-адресах.
Например, файл по адресу /info/contact.php
доступен через URL всего /info/contact
Фактический файл - это .php
файл в этом месте, но я не использую расширение в URL-адресах. Это дает мне немного более короткие и понятные URL-адреса, а также не раскрывает пользователю бессмысленные детали реализации. В Apache все, что для этого требуется, - это включить mod_negotiation и добавить + MultiViews в параметры сайта. Я так понимаю, что в Nginx я буду как-то переписывать, но, будучи новичком в Nginx, я не совсем уверен, как это сделать.
Эти сайты в настоящее время отлично работают при проксировании с Nginx на Apache, но я бы хотел попробовать запустить их только с Nginx / fastcgi. Они отлично работают таким образом, пока я использую расширения, поэтому аспект fastcgi работает отлично. Сейчас меня беспокоит только удаление этих расширений.
Важно помнить, что имя файла не всегда в URL-адресе, если речь идет о подкаталогах. То есть,
/foo/bar
следует искать /foo/bar.php
или /foo/bar/index.php
/foo/
следует искать /foo/index.php
Есть ли простой способ добиться этого с помощью Nginx или мне следует придерживаться проксирования на Apache?
Вам не нужны утомительные переписывания, try_files отлично работает для этого. По сути, это всего лишь одна строка.
server {
server_name foo.com;
root /your/root/path;
index index.php;
location /
try_files $uri.php $uri/ /notfound.html;
}
# Your standard PHP location and everything else is still required here.
}
В качестве альтернативы вы можете использовать:
try_files $uri $uri/ index.php;
без /
перед index.php он будет искать /foo/bar/index.php
если бы не смог найти /foo/bar/somethingelse.php
. (у большинства людей есть /index.php
в качестве отступления, поскольку это обычно то, что работает с wordpress и подобными CMS).